§
    ‚ŠtjD  ã                   óø  — d dl Z d dlmZ d dlmZmZ d dlmZ d dlZddl	m
Z
mZ ddlmZ  e
¦   «         rd dlZdZ ej        d	¦  «        Zej        rN ej        ¦   «         Ze                      ej        d
¦  «        ¦  «         e                     e¦  «         de_        deej        eeef         fd„Z G d„ de¦  «        Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )é    N)Údeepcopy)Ú	dataclassÚfield)ÚIntEnumé   )Úis_psutil_availableÚis_torch_xpu_available)ÚloggingéÿÿÿÿÚContinuousBatchingLoggerz4%(asctime)s - %(name)s - %(levelname)s - %(message)sFÚreturnc                  óv  — t           j                             ¦   «         r˜t          j        d¦  «        } t           j                             ¦   «          t           j                             ¦   «          t           j                             | ¦  «        \  }}t           j                             | ¦  «        }||z
  }�nþt          ¦   «         r´t          j        d¦  «        } t           j	                             ¦   «          t           j	                             ¦   «          t           j	         
                    | ¦  «        j        }t           j	                             | ¦  «        }t           j	                             | ¦  «        }�n<t           j        j                             ¦   «         r’t           j        j                             ¦   «         rot          j        d¦  «        } t           j                             ¦   «         }t           j                             ¦   «         }t           j                             ¦   «         }n‡t          j        d¦  «        } t'          ¦   «         rEt)          j        ¦   «         j        }t)          j        ¦   «                              ¦   «         j        }|}n t4                               d¦  «         d}d}d}| |||fS )NÚcudaÚxpuÚmpsÚcpuzŽCannot get memory breakdown on CPU without psutil: returning 0 for all memory values. Please install psutil to get an actual memory breakdown.r   )Útorchr   Úis_availableÚdeviceÚempty_cacheÚsynchronizeÚmem_get_infoÚmemory_reservedr	   r   Úget_device_propertiesÚtotal_memoryÚmemory_allocatedÚbackendsr   Úis_builtÚrecommended_max_memoryÚcurrent_allocated_memoryÚdriver_allocated_memoryr   ÚpsutilÚvirtual_memoryÚtotalÚProcessÚmemory_infoÚrssÚloggerÚerror)r   Úfree_memoryr   Úreserved_memoryÚallocated_memorys        úr/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/generation/continuous_batching/requests.pyÚget_device_and_memory_breakdownr.   +   s$  € Ý„z×ÒÑ Ô ð "!Ý”˜fÑ%Ô%ˆÝŒ
×ÒÑ Ô Ð ÝŒ
×ÒÑ Ô Ð õ %*¤J×$;Ò$;¸FÑ$CÔ$CÑ!ˆ�\Ýœ*×4Ò4°VÑ<Ô<ˆØ'¨+Ñ5ÐÑÝ	Ñ	!Ô	!ð !Ý”˜eÑ$Ô$ˆÝŒ	×ÒÑÔÐÝŒ	×ÒÑÔÐÝ”y×6Ò6°vÑ>Ô>ÔKˆÝœ)×3Ò3°FÑ;Ô;ˆÝ œ9×5Ò5°fÑ=Ô=ÐÑÝ	ŒÔ	×	(Ò	(Ñ	*Ô	*ð !­u¬~Ô/A×/JÒ/JÑ/LÔ/Lð !Ý”˜eÑ$Ô$ˆÝ”y×7Ò7Ñ9Ô9ˆÝ œ9×=Ò=Ñ?Ô?ÐÝœ)×;Ò;Ñ=Ô=ˆˆå”˜eÑ$Ô$ˆÝÑ Ô ð 	!Ý!Ô0Ñ2Ô2Ô8ˆLÝ%œ~Ñ/Ô/×;Ò;Ñ=Ô=ÔAÐØ.ˆOˆOå�LŠLð<ñô ð ð ˆLØˆOØ Ðà�< Ð2BÐBÐBó    c                   ó&   — e Zd ZdZdZdZdZdZdZdS )ÚRequestStatusz5Status of a generation request through its lifecycle.r   é   é   r   é   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚPENDINGÚ
PREFILLINGÚDECODINGÚFINISHEDÚFAILED© r/   r-   r1   r1   S   s-   € € € € € Ø?Ð?à€GØ€JØ€HØ€HØ€F€F€Fr/   r1   c                   óJ  — e Zd ZU dZeed<    ee¬¦  «        Zee	         ed<    ee¬¦  «        Z
ee	         ed<    ee¬¦  «        Zee         ed<   dZedz  ed<   ej        Zeed	<    eej        ¬¦  «        Zeed
<   dZeeef         ed<   dZee         dz  ed<   defd„ZdS )ÚGenerationOutputa«  Tracks the output of a generation request.

    Attributes:
        request_id (str): The ID of the generation request.
        prompt_ids (list[int]): The IDs of the prompt tokens.
        generated_tokens (list[int]): The generated tokens.
        logprobs (list[float]): The log probabilities of the generated tokens.
        error (Optional[str]): Any error message associated with the request. When None, the request was successful.
        status (RequestStatus): The status of the request.
        created_time (float): The time the request was created.
        lifespan (tuple[float, float]): The time the request was no longer pending and the time the request finished.
    Ú
request_id©Údefault_factoryÚ
prompt_idsÚgenerated_tokensÚlogprobsNr)   ÚstatusÚcreated_time©r   r   ÚlifespanÚ
timestampsr   c                 ó,   — | j         t          j        k    S ©N)rG   r1   r<   ©Úselfs    r-   Úis_finishedzGenerationOutput.is_finishedv   s   € ØŒ{�mÔ4Ò4Ð4r/   )r5   r6   r7   r8   ÚstrÚ__annotations__r   ÚlistrD   ÚintrE   rF   Úfloatr)   r1   r9   rG   ÚtimeÚperf_counterrH   rJ   ÚtuplerK   ÚboolrP   r>   r/   r-   r@   r@   ]   s#  € € € € € € ðð ð €O€O�OØ!˜E°$Ð7Ñ7Ô7€J��S”	Ð7Ð7Ñ7Ø"' %¸Ð"=Ñ"=Ô"=Ð�d˜3”iÐ=Ð=Ñ=Ø!˜E°$Ð7Ñ7Ô7€Hˆd�5ŒkÐ7Ð7Ñ7Ø€Eˆ3�‰:ÐÐÑØ)Ô1€FˆMÐ1Ð1Ñ1Ø˜%°Ô0AÐBÑBÔB€L�%ÐBÐBÑBØ$,€Hˆe�E˜5�LÔ!Ð,Ð,Ñ,Ø%)€J��U”˜dÑ"Ð)Ð)Ñ)ð5˜Tð 5ð 5ð 5ð 5ð 5ð 5r/   r@   c                   óh  — e Zd ZU dZeed<   ee         ed<   dZe	ed<   dZ
e	ed<   dZedz  ed	<   dZeee         z  dz  ed
<   dZeed<    ee¬¦  «        Zeed<    ee¬¦  «        Zee         ed<    ee¬¦  «        Zee         ed<    ee¬¦  «        Zee         ed<   dZeed<   dZeed<   ej        Zeed<    ee¬¦  «        Zee         ed<    eej        ¬¦  «        Zeed<   dZedz  ed<   dZ e!eef         ed<    ee¬¦  «        Z"ee         ed<   dZ#eed<   dZ$eed<    ee¬¦  «        Z%ee         ed<   dZ&e	ed<   d „ Z'e(d!efd"„¦   «         Z)e)j*        d#efd$„¦   «         Z)e(d!ee         dz  fd%„¦   «         Z+d&„ Z,d!efd'„Z-d!efd(„Z.d)ed*edz  d!e	fd+„Z/d,„ Z0d-„ Z1d.ed!d fd/„Z2d!efd0„Z3d2d1„Z4dS )3ÚRequestStateaÃ  Tracks the state of a generation request through its lifecycle.

    Attributes:
        request_id (str): The ID of the generation request.
        initial_tokens (list[int]): The initial prompt tokens.
        num_children (int): The number of children requests
        full_prompt_ids (list[int] | None): The tokens IDs of the full prompt.
        prompt_ids (list[int] | None): The tokens IDs currently being processed.
        remaining_prompt_ids (list[int]): The initial tokens IDs remaining to be processed.
        static_outputs (list[int]): The generated tokens.
        allocated_blocks (int): The number of blocks allocated to the request.
        position_offset (int): The current position in the sequence for position_ids.
        status (RequestStatus): The status of the request: can be one of PENDING, PREFILLING, PREFILLING_SPLIT,
                                SPLIT_PENDING_REMAINDER, DECODING, FINISHED, FAILED
        max_new_tokens (int | None): The maximum number of new tokens to generate.
        eos_token_id (None | int | list[int]): The ID(s) of the end-of-sequence tokens. Only used in post-init.
        _eos_token_ids (set[int]): The IDs of the end-of-sequence tokens, formatted as a set.
        streaming (bool): Whether to stream tokens as they're generated
        created_time (float): The time the request was created.
        error (Optional[str]): Any error message associated with the request. When None, has had no error yet.
    rA   Úinitial_tokensFÚ	streamingÚrecord_timestampsé   NÚmax_new_tokensÚeos_token_idr   Únum_childrenrB   Úlogit_processor_kwargsÚtokens_to_processrE   rF   Úposition_offsetÚallocated_blocksÚ_statusÚ_eos_token_idsrH   r)   rI   rJ   Ú_timestampsÚ_true_initial_tokenséÿÿÿÚ_new_tokens_limitÚremaining_prefill_tokensÚis_cpu_offloadedc                 óN  — | j         €dn| j         | _        | j        d d …         | _        | j        €d S t          | j        t          ¦  «        r.| j        dk    r!| j                             | j        ¦  «         d S d S | j        D ]"}|dk    r| j                             |¦  «         Œ#d S )Nrk   r   )	r`   rl   r\   rm   ra   Ú
isinstancerT   rh   Úadd)rO   Útoken_ids     r-   Ú__post_init__zRequestState.__post_init__·   sÆ   € à/3Ô/BÐ/J  ÐPTÔPcˆÔà(,Ô(;¸A¸A¸AÔ(>ˆÔ%àÔÐ$ØˆDå˜Ô)­3Ñ/Ô/ð 	6ØÔ  AÒ%Ð%ØÔ#×'Ò'¨Ô(9Ñ:Ô:Ð:Ð:Ð:ð &Ð%ð !Ô-ð 6ð 6�Ø˜q’=�=ØÔ'×+Ò+¨HÑ5Ô5Ð5øð6ð 6r/   r   c                 ó   — | j         S rM   )rg   rN   s    r-   rG   zRequestState.statusÉ   s
   € àŒ|Ðr/   Úvaluec                 óN  — | j         t          j        k    rt          j        ¦   «         df| _        nm|t          j        k    r]| j        d         t          j        ¦   «         f| _        t                               t          j
        ¦  «        r|                      ¦   «          || _         d S )Nr   r   )rg   r1   r9   rV   rW   rJ   r<   r(   ÚisEnabledForr
   ÚDEBUGÚlog_end_of_request)rO   ru   s     r-   rG   zRequestState.statusÍ   sˆ   € àŒ<�=Ô0Ò0Ð0Ý!Ô.Ñ0Ô0°"Ð5ˆDŒMˆMØ•mÔ,Ò,Ð,Ø!œ]¨1Ô-­tÔ/@Ñ/BÔ/BÐCˆDŒMÝ×"Ò"¥7¤=Ñ1Ô1ð *Ø×'Ò'Ñ)Ô)Ð)ØˆŒˆˆr/   c                 ó"   — | j         r| j        nd S rM   )r^   ri   rN   s    r-   rK   zRequestState.timestamps×   s   € à#'Ô#9ÐCˆtÔÐ¸tÐCr/   c                 ó  — t          | j        ¦  «        }|                      ¦   «         }| j        d         | j        z
  }| j        d         | j        z
  }t
                               d| j        › d|›d|›d|›d|›�
¦  «         d S )Nr   r2   úRequest z finished: prefill_len = z decode_len = z start_time = z end_time = )Úlenr\   Úgenerated_lenrJ   rH   r(   ÚdebugrA   )rO   Úprefill_lenÚ
decode_lenÚ
start_timeÚend_times        r-   ry   zRequestState.log_end_of_requestÛ   sš   € Ý˜$Ô-Ñ.Ô.ˆØ×'Ò'Ñ)Ô)ˆ
Ø”] 1Ô%¨Ô(9Ñ9ˆ
Ø”= Ô# dÔ&7Ñ7ˆÝ�ŠØq�t”ÐqÐq°;ÐqÐqÀJÐqÐqÐT^ÐqÐqÐdlÐqÐqñ	
ô 	
ð 	
ð 	
ð 	
r/   c                 ó   — | j         S )zCGet the current length of the sequence (prompt + generated tokens).)re   rN   s    r-   Úcurrent_lenzRequestState.current_lenä   s   € àÔ#Ð#r/   c                 ó*   — t          | j        ¦  «        S )z*Get the number of tokens generated so far.)r}   rE   rN   s    r-   r~   zRequestState.generated_lenè   s   € å�4Ô(Ñ)Ô)Ð)r/   rr   Úlogprobc                 óþ  — | j         t          j        k    rdS | j        r+| j                             t          j        ¦   «         ¦  «         || j        v }|  	                    ¦   «         }|s|| j
        k     rD| j                             |¦  «         |g| _        |dz  }|�| j                             |¦  «         n%t                               d| j        › d|› �¦  «         |s|| j
        k    rt          j        | _         dS dS )z»Update the request with a newly generated token (and optional log probability of the token) and check for
        completion. Returns True if the request is now complete, False otherwise.Fr2   Nr|   z generated a useless token: T)rG   r1   r;   r^   ri   ÚappendrV   rW   rh   r~   rl   rE   rd   rF   r(   ÚwarningrA   r<   )rO   rr   r‡   Úis_eosr…   s        r-   Úupdate_and_check_completionz(RequestState.update_and_check_completioní   s  € ð Œ;�-Ô0Ò0Ð0Ø�5ð Ô!ð 	9ØÔ×#Ò#¥DÔ$5Ñ$7Ô$7Ñ8Ô8Ð8ð ˜TÔ0Ð0ˆØ×(Ò(Ñ*Ô*ˆð ð 	_�k DÔ$:Ò:Ð:ØÔ!×(Ò(¨Ñ2Ô2Ð2Ø&. ZˆDÔ"Ø˜1ÑˆKØÐ"Ø”×$Ò$ WÑ-Ô-Ð-øå�NŠNÐ] d¤oÐ]Ð]ÐS[Ð]Ð]Ñ^Ô^Ð^àð 	�[ DÔ$:Ò:Ð:Ý'Ô0ˆDŒKØ�4Øˆur/   c                 óX  — d| j         › �d| j        › �d|                      ¦   «         › �dt          | j        ¦  «        › �dt          | j        ¦  «        › �d| j        › �dt          | j        ¦  «        › �d| j        › �d	| j	        › �d
| j
        › �g
}dd                     |¦  «        z   dz   S )Nzrequest_id=zstatus=zout_tokens=zquery_length=zremaining_tokens=z
kv_length=zfull_prompt_length=zallocated_blocks=zgenerated_tokens=zlogit_processor_kwargs=zRequestState(
	z,
	z
))rA   rg   r~   r}   rd   rm   re   r\   rf   rE   rc   Újoin)rO   Úmsgs     r-   Ú__repr__zRequestState.__repr__  sÒ   € à+˜$œ/Ð+Ð+Ø$�d”lÐ$Ð$Ø0˜$×,Ò,Ñ.Ô.Ð0Ð0Ø9�C Ô 6Ñ7Ô7Ð9Ð9ØD¥ DÔ$AÑ BÔ BÐDÐDØ/˜Ô-Ð/Ð/Ø<¥# dÔ&9Ñ":Ô":Ð<Ð<Ø7 Ô 5Ð7Ð7Ø7 Ô 5Ð7Ð7ØC dÔ&AÐCÐCð
ˆð # W§\¢\°#Ñ%6Ô%6Ñ6¸Ñ>Ð>r/   c                 óF  — | j         r1| j        | j         d…         | j        z   }| j        d| j         …         }n| j        dd…         }| j        }t          | j        ||| j        dd…         | j        | j        | j        | j	        | j
        �| j
        dd…         nd¬¦	  «	        S )z7Convert the request state to a GenerationOutput object.N)	rA   rD   rE   rF   r)   rG   rH   rJ   rK   )rj   r\   rE   r@   rA   rF   r)   rG   rH   rJ   rK   )rO   rE   rD   s      r-   Úto_generation_outputz!RequestState.to_generation_output  s¾   € àÔ$ð 	-Ø#Ô2°4Ô3LÐ3NÐ3NÔOÐRVÔRgÑgÐØÔ,Ð-H¨tÔ/HÐ-HÔIˆJˆJà#Ô4°Q°Q°QÔ7ÐØÔ,ˆJÝØ”Ø!Ø-Ø”] 1 1 1Ô%Ø”*Ø”;ØÔ*Ø”]Ø-1¬_Ð-H�t” q q qÔ)Ð)Èdð

ñ 

ô 

ð 
	
r/   Únew_request_idc                 ó´   — t          | ¦  «        }||_        t          j        ¦   «         |_        |j        df|_        g |_        | j        dd…         |_        |S )ziFork the request into a new request with the same state except for request_id, created_time and lifespan.r   N)r   rA   rV   rW   rH   rJ   ri   rm   )rO   r“   Únew_requests      r-   ÚforkzRequestState.fork/  sX   € å˜t‘n”nˆà!/ˆÔÝ#'Ô#4Ñ#6Ô#6ˆÔ Ø +Ô 8¸"Ð=ˆÔØ"$ˆÔà/3Ô/LÈQÈQÈQÔ/OˆÔ,ØÐr/   c                 ój   — | j         | j        | j        | j        | j        t          | j        ¦  «        dœS )zXGet all the fields necessary to create a request that would have the same configuration.)r]   r^   r`   ra   rb   rc   )r]   r^   r`   ra   rb   r   rc   rN   s    r-   Úget_request_configzRequestState.get_request_config;  s>   € ð œØ!%Ô!7Ø"Ô1Ø Ô-Ø Ô-Ý&.¨tÔ/JÑ&KÔ&Kð
ð 
ð 	
r/   c           
      óh  — |                       ¦   «         }| j        �| j        t          | j        ¦  «        z
  |d<   t	          d| j        | j        | j        z   | j        dd…         | j        t          | j        ¦  «        z   dœ|¤Ž}| j        r| j        |_        nt          | j        ¦  «        |_        |S )aT  Creates an equivalent new request by removing the generated tokens and adding them to the initial prompt. The
        created request has THE SAME request_id. Notably, we can retrieve the original request from the created one with
        the _true_initial_tokens attribute. The logprobs of the generated tokens are kept in the new request.Nr`   )rA   r\   rF   rj   r>   )	r˜   r`   r}   rE   r[   rA   r\   rF   rj   )rO   Úrequest_configÚ	new_states      r-   Ú!create_equivalent_initial_requestz.RequestState.create_equivalent_initial_requestF  sÍ   € ð
 ×0Ò0Ñ2Ô2ˆàÔÐ*Ø/3Ô/BÅSÈÔI^ÑE_ÔE_Ñ/_ˆNÐ+Ñ,å ð 
Ø”ØÔ.°Ô1FÑFØ”] 1 1 1Ô%Ø!%Ô!:½SÀÔATÑ=UÔ=UÑ!Uð	
ð 
ð
 ð
ð 
ˆ	ð Ô$ð 	FØ-1Ô-FˆIÔ*Ð*õ .1°Ô1DÑ-EÔ-EˆIÔ*ØÐr/   )r   r[   )5r5   r6   r7   r8   rQ   rR   rS   rT   r]   rY   r^   r`   ra   rb   r   Údictrc   rd   rE   rF   rU   re   rf   r1   r9   rg   Úsetrh   rV   rW   rH   r)   rJ   rX   ri   rj   rl   rm   rn   rs   ÚpropertyrG   ÚsetterrK   ry   r…   r~   rŒ   r�   r’   r–   r˜   rœ   r>   r/   r-   r[   r[   z   s¸  € € € € € € ðð ð. €O€O�OØ˜”IÐÐÑð €IˆtÐÐÑØ#Ð�tÐ#Ð#Ñ#ð "$€N�C˜$‘JÐ#Ð#Ñ#Ø+/€L�#˜˜Sœ	‘/ DÑ(Ð/Ð/Ñ/Ø€L�#ÐÐÑØ#( 5¸Ð#>Ñ#>Ô#>Ð˜DÐ>Ð>Ñ>ð $) 5¸Ð#>Ñ#>Ô#>Ð�t˜C”yÐ>Ð>Ñ>Ø"' %¸Ð"=Ñ"=Ô"=Ð�d˜3”iÐ=Ð=Ñ=Ø!˜E°$Ð7Ñ7Ô7€Hˆd�5ŒkÐ7Ð7Ñ7Ø€O�SÐÐÑØÐ�cÐÐÑà*Ô2€Gˆ]Ð2Ð2Ñ2Ø$˜u°SÐ9Ñ9Ô9€N�C˜”HÐ9Ð9Ñ9ð  ˜%°Ô0AÐBÑBÔB€L�%ÐBÐBÑBØ€Eˆ3�‰:ÐÐÑØ$,€Hˆe�E˜5�LÔ!Ð,Ð,Ñ,Ø$˜u°TÐ:Ñ:Ô:€K��e”Ð:Ð:Ñ:Ø !Ð˜#Ð!Ð!Ñ!ð (Ð�sÐ'Ð'Ñ'Ø*/¨%ÀÐ*EÑ*EÔ*EÐ˜d 3œiÐEÐEÑEØ"Ð�dÐ"Ð"Ñ"ð6ð 6ð 6ð$ ð˜ð ð ð ñ „Xðð „]ð˜Mð ð ð ñ „]ðð ðD˜D œK¨$Ñ.ð Dð Dð Dñ „XðDð
ð 
ð 
ð$˜Sð $ð $ð $ð $ð*˜sð *ð *ð *ð *ð
°Cð À%È$Á,ð ÐSWð ð ð ð ð>?ð ?ð ?ð
ð 
ð 
ð(
 3ð 
¨>ð 
ð 
ð 
ð 
ð	
 Dð 	
ð 	
ð 	
ð 	
ðð ð ð ð ð r/   r[   c            
       ó2   — e Zd ZdZdZdededededdf
d	„ZdS )
ÚFutureRequestStatezPTracks the current state of a request and the relevant information to update it.©ÚstateÚhas_new_tokenÚcomplete_blocksÚquery_lengthr¤   r¥   r¦   r§   r   Nc                 ó>   — || _         || _        || _        || _        d S rM   r£   )rO   r¤   r¥   r¦   r§   s        r-   Ú__init__zFutureRequestState.__init__f  s'   € ØˆŒ
Ø*ˆÔØ.ˆÔØ(ˆÔÐÐr/   )	r5   r6   r7   r8   Ú	__slots__r[   rY   rT   r©   r>   r/   r-   r¢   r¢   `  s\   € € € € € ØZÐZð N€Ið)˜lð )¸4ð )ÐRUð )Ðehð )Ðmqð )ð )ð )ð )ð )ð )r/   r¢   ) rV   Úcopyr   Údataclassesr   r   Úenumr   r   Úutilsr   r	   Úutils.loggingr
   r"   ÚTMP_TOKEN_IDÚ	getLoggerr(   Ú	propagateÚStreamHandlerÚhandlerÚsetFormatterÚ	FormatterÚ
addHandlerrX   r   rT   r.   r1   r@   r[   r¢   r>   r/   r-   ú<module>r¸      s  ðð €€€Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à €€€à @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø $Ð $Ð $Ð $Ð $Ð $ð ÐÑÔð Ø€M€M€Mð €ð 
ˆÔ	Ð5Ñ	6Ô	6€à	Ôð Ø#ˆgÔ#Ñ%Ô%€GØ×ÒÐ*˜Ô*Ð+aÑbÔbÑcÔcÐcØ
×Ò�gÑÔÐØ€FÔð%C¨¨u¬|¸SÀ#ÀsÐ/JÔ)Kð %Cð %Cð %Cð %CðPð ð ð ð �Gñ ô ð ð ð5ð 5ð 5ð 5ð 5ñ 5ô 5ñ „ð5ð8 ðbð bð bð bð bñ bô bñ „ðbðJ
)ð 
)ð 
)ð 
)ð 
)ñ 
)ô 
)ð 
)ð 
)ð 
)r/   