§
    ™ŠtjH=  ã                  ó"  — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZmZ ddlmZmZ ddlmZ ddlmZmZ dd	lmZmZ  G d
„ d¦  «        Z ej        e¦  «        Ze G d„ d¦  «        ¦   «         Zddœdd„Z G d„ d¦  «        ZdS )aÉ  Stream controller: subscription registry and fan-out for AsyncThreadStream.

`StreamController` manages the set of active subscriptions against one shared
SSE connection, routing events from the shared stream to per-subscription
queues.  It is the centralised place for:

- subscription registration / teardown
- shared-stream lifecycle (open, rotate, close)
- dedup of replayed events across rotations
- fan-out from the shared stream to subscriber queues
é    )ÚannotationsN)ÚOrderedDict)ÚAsyncGeneratorÚAsyncIteratorÚ	AwaitableÚCallable)Ú	dataclassÚfield)ÚAny)ÚEventÚSubscribeParams)ÚAsyncProtocolTransportÚEventStreamHandlec                  ó6   — e Zd ZdZdZddd„Zdd„Zdd„Zd„ ZdS )Ú_SeenEventIdsz)LRU set of event ids with bounded memory.)Ú_dataÚ_maxsizeé'  ÚmaxsizeÚintÚreturnÚNonec                ó:   — t          ¦   «         | _        || _        d S ©N)r   r   r   )Úselfr   s     ú]/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langgraph_sdk/stream/controller.pyÚ__init__z_SeenEventIds.__init__&   s   € Ý-8©]¬]ˆŒ
ØˆŒˆˆó    Úevent_idÚstrc                óØ   — || j         v r| j                              |¦  «         d S d | j         |<   t          | j         ¦  «        | j        k    r| j                              d¬¦  «         d S d S )NF)Úlast)r   Úmove_to_endÚlenr   Úpopitem©r   r   s     r   Úaddz_SeenEventIds.add*   sr   € Ø�t”zÐ!Ð!ØŒJ×"Ò" 8Ñ,Ô,Ð,ØˆFØ#ˆŒ
�8ÑÝˆtŒz‰?Œ?˜Tœ]Ò*Ð*ØŒJ×Ò EÐÑ*Ô*Ð*Ð*Ð*ð +Ð*r   ÚobjectÚboolc                ó   — || j         v S r   )r   r&   s     r   Ú__contains__z_SeenEventIds.__contains__2   s   € Ø˜4œ:Ð%Ð%r   c                ó*   — t          | j        ¦  «        S r   )Úiterr   ©r   s    r   Ú__iter__z_SeenEventIds.__iter__5   s   € Ý�D”JÑÔÐr   N)r   )r   r   r   r   )r   r    r   r   )r   r(   r   r)   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r'   r+   r/   © r   r   r   r   !   so   € € € € € Ø3Ð3à%€Ið ð  ð  ð  ð  ð+ð +ð +ð +ð&ð &ð &ð &ð ð  ð  ð  ð  r   r   c                  óT   — e Zd ZU dZded<   ded<    eej        ¬¦  «        Zded<   d	S )
Ú_SubscriptionzDInternal record for one active subscription on a `StreamController`.r   Úidr   Úparams)Údefault_factoryzasyncio.QueueÚqueueN)	r0   r1   r2   r3   Ú__annotations__r
   ÚasyncioÚQueuer;   r5   r   r   r7   r7   @   sM   € € € € € € àNÐNà€G€G�GØÐÐÑØ ˜5°´Ð?Ñ?Ô?€EÐ?Ð?Ð?Ñ?Ð?Ð?r   r7   g        )ÚdelayÚhandler   r?   Úfloatr   r   c             ƒ  óv   K  — |rt          j        |¦  «        ƒ d{V —† |                      ¦   «         ƒ d{V —† dS )zÆClose a handle, optionally after a brief delay.

    Used to detach closing the old stream from the synchronous rotation step
    so the new stream can absorb server-side replayed events first.
    N)r=   ÚsleepÚclose)r@   r?   s     r   Ú_close_afterrE   P   sX   è è € ð ð #ÝŒm˜EÑ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ø
�,Š,‰.Œ.ÐÐÐÐÐÐÐÐÐr   c                  óÊ   — e Zd ZdZdddddddœd@d„ZdddœdAd„ZdBd „ZdCd$„ZdDd&„ZeZ	eZ
dEd(„ZdBd)„ZeZdBd*„ZdFd,„ZdGd.„ZdHd0„ZdHd1„Z	 dIdJd5„ZdKd8„ZdLd;„ZdKd<„ZdMd=„ZdNd?„ZdS )OÚStreamControllera  Manages subscriptions and fan-out against one shared SSE connection.

    Responsibilities:
      - subscription registry (register / unregister)
      - shared-stream lifecycle (open on first subscribe, rotate on filter widen)
      - dedup of replayed events via a bounded LRU `_SeenEventIds`
      - fan-out from the shared stream to per-subscription queues

    Args:
        transport: the `AsyncProtocolTransport` bound to this thread session.
        run_start_gate: zero-argument async callable that resolves once the
            current `run.start` has committed server-side (no-op when no
            run is in flight).
        max_queue_size: per-subscription queue bound (default 1024).
        seen_event_ids_max: LRU cap for the dedup set (default 10_000).
    Ni   r   é   gš™™™™™¹?g       @)Úrun_start_gateÚmax_queue_sizeÚseen_event_ids_maxÚmax_reconnect_attemptsÚreconnect_backoff_baseÚreconnect_backoff_capÚ	transportr   rI   ú$Callable[[], Awaitable[None]] | NonerJ   r   rK   rL   rM   rA   rN   r   r   c               óþ   — || _         || _        t          |¬¦  «        | _        d| _        i | _        d | _        d | _        d | _        t          ¦   «         | _
        d| _        d | _        || _        || _        || _        d S )N©r   é   F)Ú
_transportÚ_max_queue_sizer   Ú_seen_event_idsÚ_next_subscription_idÚ_subscriptionsÚ_shared_streamÚ_shared_stream_filterÚ_fanout_taskÚsetÚ_rotation_close_tasksÚ_closedÚ_cursorÚ_max_reconnect_attemptsÚ_reconnect_backoff_baseÚ_reconnect_backoff_cap)r   rO   rI   rJ   rK   rL   rM   rN   s           r   r   zStreamController.__init__r   s‡   € ð $ˆŒØ-ˆÔÝ,Ð5GÐHÑHÔHˆÔØ%&ˆÔ"Ø8:ˆÔØ8<ˆÔØ<@ˆÔ"Ø7;ˆÔÝ>A¹e¼eˆÔ"ØˆŒØ#'ˆŒØ'=ˆÔ$Ø'=ˆÔ$Ø&;ˆÔ#Ð#Ð#r   )Ú
namespacesÚdepthÚchannelsú	list[str]rc   úlist[list[str]] | Nonerd   ú
int | NoneúAsyncIterator[Event]c               ój   — dt          |¦  «        i}|�||d<   |�||d<   |                      |¦  «        S )a  Open a typed subscription against the shared SSE.

        Returns an async iterator that yields raw `Event` dicts matching the
        given filter. Multiple concurrent subscribes share one HTTP connection
        whose union expands or rotates as subscriptions come and go.
        re   Nrc   rd   )ÚlistÚ_subscription_iter)r   re   rc   rd   r9   s        r   Ú	subscribezStreamController.subscribe�   sG   € ð $.­t°H©~¬~Ð">ˆØÐ!Ø#-ˆF�<Ñ ØÐØ#ˆF�7‰OØ×&Ò& vÑ.Ô.Ð.r   c              ƒ  ó’  K  — | j         rdS d| _         | j        �b| j                             ¦   «          t          j        t
          t          j        ¦  «        5  | j        ƒ d{V —† ddd¦  «         n# 1 swxY w Y   | j        �| j         	                    ¦   «         ƒ d{V —† | j
        rt          j        | j
        ddiŽƒ d{V —† dS dS )z?Tear down the controller, awaiting any pending rotation closes.NTÚreturn_exceptions)r^   r[   ÚcancelÚ
contextlibÚsuppressÚ	Exceptionr=   ÚCancelledErrorrY   rD   r]   Úgatherr.   s    r   rD   zStreamController.close¤   s9  è è € àŒ<ð 	ØˆFØˆŒØÔÐ(ØÔ×$Ò$Ñ&Ô&Ð&ÝÔ$¥YµÔ0FÑGÔGð (ð (ØÔ'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (àÔÐ*ØÔ%×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÔ%ð 	VÝ”. $Ô"<ÐUÐPTÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUð	Vð 	Vs   ÁA1Á1A5Á8A5r9   r   r7   c                ó¢   — t          | j        |t          j        | j        ¬¦  «        ¬¦  «        }| xj        dz  c_        || j        |j        <   |S )zDAllocate a subscription id, create a bounded queue, add to registry.rR   )r8   r9   r;   rS   )r7   rW   r=   r>   rU   rX   r8   )r   r9   Úsubs      r   Ú_register_subscriptionz'StreamController._register_subscription¶   s\   € åØÔ)ØÝ”-¨Ô(<Ð=Ñ=Ô=ð
ñ 
ô 
ˆð
 	Ð"Ô" aÑ'Ð"Ô"Ø&)ˆÔ˜CœFÑ#Øˆ
r   Úsubscription_idc                ó<   — | j                              |d¦  «         dS )zARemove a subscription from the registry. No-op if already absent.N)rX   Úpop)r   ry   s     r   Ú_unregister_subscriptionz)StreamController._unregister_subscriptionÁ   s!   € àÔ×Ò °Ñ6Ô6Ð6Ð6Ð6r   úAsyncGenerator[Event, None]c               ó   K  — |                       |¦  «        }	 | j        r	 |                      |j        ¦  «         d S |                      |¦  «        ƒ d {V —† |                      ¦   «          	 |j                             ¦   «         ƒ d {V —†}|€	 |                      |j        ¦  «         d S |W V — ŒD# |                      |j        ¦  «         w xY wr   )rx   r^   r|   r8   Ú_reconcile_streamÚ_ensure_fanout_runningr;   Úget)r   r9   rw   Úitems       r   rl   z#StreamController._subscription_iterÉ   s  è è € ð ×)Ò)¨&Ñ1Ô1ˆð	2ØŒ|ð Øð ×)Ò)¨#¬&Ñ1Ô1Ð1Ð1Ð1ð ×(Ò(¨Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ø×'Ò'Ñ)Ô)Ð)ðØ œYŸ]š]™_œ_Ð,Ð,Ð,Ð,Ð,Ð,�Ø�<Øð ×)Ò)¨#¬&Ñ1Ô1Ð1Ð1Ð1ð �
�
�
�
ð	øð ×)Ò)¨#¬&Ñ1Ô1Ð1Ð1øøøs   ™B1 ½AB1 Â+B1 Â1Cc                ó    — | j         �| j                              ¦   «         r-t          j        |                      ¦   «         ¦  «        | _         d S d S r   )r[   Údoner=   Úcreate_taskÚ_fanoutr.   s    r   r€   z'StreamController._ensure_fanout_runningÞ   sH   € ØÔÐ$¨Ô(9×(>Ò(>Ñ(@Ô(@Ð$Ý 'Ô 3°D·L²L±N´NÑ CÔ CˆDÔÐÐð %Ð$r   c              ƒ  óp  K  — ddl m} | j        �so| j        }|€dS 	 |                      |j        ¦  «        2 3 d{V —†}| j        r nVt          | j                             ¦   «         ¦  «        D ]-} |||j	        ¦  «        r|j
                             |¦  «         Œ.Œe6 n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w| j        |u rŸ|j        ƒ d{V —†}|��t!          |t"          j        ¦  «        su| j        snt'          j        t          ¦  «        5  | j                             ¦   «         ƒ d{V —† ddd¦  «         n# 1 swxY w Y   |                      ¦   «         ƒ d{V —†}|r�Œnn| j        �¯o| j                             ¦   «         D ]}|j
                             d¦  «         ŒdS )a2  Single consumer of the shared SSE; routes events to subscriptions.

        Why: rotation in `_reconcile_stream` replaces `_shared_stream` mid-loop.
        Re-read `self._shared_stream` on each outer iteration so we always
        consume from the current handle. The old handle's iterator exhausts
        naturally after `_close_after` closes it.

        On a post-ready transport drop (non-cancelled error in `shared.done`),
        attempts to reconnect up to `_max_reconnect_attempts` times before
        giving up and closing subscriber queues.
        r   )Úmatches_subscriptionNztransport drop in fanout: %r)Ú!langgraph_sdk.stream.subscriptionrˆ   r^   rY   Ú_dedup_iterÚeventsrk   rX   Úvaluesr9   r;   Ú
put_nowaitrs   Ú_loggerÚdebugr„   Ú
isinstancer=   rt   rq   rr   rD   Ú_reconnect_shared_stream)r   rˆ   ÚsharedÚeventrw   Údrop_errÚerrÚreconnecteds           r   r†   zStreamController._fanoutå   s‰  è è € ð 	KÐJÐJÐJÐJÐJà”,ñ 	ØÔ(ˆFØˆ~Ø�ðHØ#'×#3Ò#3°F´MÑ#BÔ#Bð 8ð 8ð 8ð 8ð 8ð 8ð 8˜%Ø”|ð Ø˜Ý# DÔ$7×$>Ò$>Ñ$@Ô$@ÑAÔAð 8ð 8˜Ø/Ð/°°s´zÑBÔBð 8ØœI×0Ò0°Ñ7Ô7Ð7øð8ð $Cøøõ ð Hð Hð HÝ—’Ð<¸hÑGÔGÐGÐGÐGÐGÐGÐGøøøøðHøøøð Ô" fÐ,Ð,Ø"œKÐ'Ð'Ð'Ð'Ð'Ð'�à�OÝ& s­GÔ,BÑCÔCð $à œLð $õ $Ô,­YÑ7Ô7ð :ð :Ø"Ô1×7Ò7Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :à(,×(EÒ(EÑ(GÔ(GÐ"GÐ"GÐ"GÐ"GÐ"GÐ"G�KØ"ð !Ù Øð5 ”,ñ 	ð< Ô&×-Ò-Ñ/Ô/ð 	'ð 	'ˆCØŒI× Ò  Ñ&Ô&Ð&Ð&ð	'ð 	's4   �B ·B½A B Â
CÂ(CÃCÄ" EÅEÅEÚattemptc              ƒ  ó¼   K  — | j         }| j        }t          ||d|z  z  ¦  «        }t          j        d|dz  ¦  «        }t          j        ||z   ¦  «        ƒ d{V —† dS )zJSleep with exponential backoff and jitter for reconnect attempt *attempt*.é   r   g      Ð?N)ra   rb   ÚminÚrandomÚuniformr=   rC   )r   r—   ÚbaseÚcapr?   Újitters         r   Ú_reconnect_sleepz!StreamController._reconnect_sleep  so   è è € àÔ+ˆØÔ)ˆÝ�C˜  G¡Ñ,Ñ-Ô-ˆÝ”  5¨4¡<Ñ0Ô0ˆÝŒm˜E F™NÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r   r)   c              ƒ  ó`  K  — | j         }|€dS t          | j        ¦  «        D ]‹}| j        r dS 	 | j                             |                      |¦  «        ¦  «        }|j        ƒ d{V —† n:# t          j	        $ r ‚ t          $ r |                      |¦  «        ƒ d{V —† Y Œ~w xY w|| _         dS dS )zØAttempt to reopen the shared stream after a transport drop.

        Returns True if a new stream was successfully opened, False if all
        reconnect attempts were exhausted or the controller was closed.
        NFT)rZ   Úranger`   r^   rT   Úopen_event_streamÚ_filter_with_sinceÚreadyr=   rt   rs   r    rY   )r   Úbase_filterr—   Ú
new_streams       r   r‘   z)StreamController._reconnect_shared_stream  s  è è € ð Ô0ˆØÐØ�5Ý˜TÔ9Ñ:Ô:ð 	ð 	ˆGØŒ|ð Ø�u�uð	Ø!œ_×>Ò>Ø×+Ò+¨KÑ8Ô8ñô �
ð !Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝÔ)ð ð ð ØÝð ð ð Ø×+Ò+¨GÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�ðøøøð #-ˆDÔØ�4�4Øˆus   ¯:A*Á*4B!Â B!Úcandidate_filterc              ƒ  óø  K  — ddl m} | j        �'| j        �  || j        t	          |¦  «        ¦  «        rdS |                      |¬¦  «        }| j                             |                      |¦  «        ¦  «        }| j        }|| _        || _        |j	        ƒ d{V —† |�\t          j        t          |¦  «        ¦  «        }| j                             |¦  «         |                     | j        j        ¦  «         dS dS )aT  Ensure the shared SSE covers `candidate_filter`. Rotate if not.

        Open-new-before-close-old: any events buffered server-side between
        the two opens are replayed on the new SSE, and `_seen_event_ids`
        dedupes the overlap. Awaits `new_stream.ready` so the HTTP connection
        is established before returning.
        r   )Úfilter_coversN)Úextra)r‰   rª   rY   rZ   ÚdictÚ_compute_current_unionrT   r£   r¤   r¥   r=   r…   rE   r]   r'   Úadd_done_callbackÚdiscard)r   r¨   rª   Ú
new_filterr§   Ú
old_streamÚtasks          r   r   z"StreamController._reconcile_stream?  s'  è è € ð 	DÐCÐCÐCÐCÐCð ÔÐ+ØÔ*Ð6Ø�˜dÔ8½$Ð?OÑ:PÔ:PÑQÔQð 7ð ˆFà×0Ò0Ð7GÐ0ÑHÔHˆ
Ø”_×6Ò6Ø×#Ò# JÑ/Ô/ñ
ô 
ˆ
ð Ô(ˆ
Ø(ˆÔØ%/ˆÔ"ØÔÐÐÐÐÐÐÐØÐ!ÝÔ&¥|°JÑ'?Ô'?Ñ@Ô@ˆDØÔ&×*Ò*¨4Ñ0Ô0Ð0Ø×"Ò" 4Ô#=Ô#EÑFÔFÐFÐFÐFð "Ð!r   c              ƒ  ó<   K  — |                       |¦  «        ƒ d{V —†S )z%Public alias for `_reconcile_stream`.N)r   )r   r¨   s     r   Úreconcile_streamz!StreamController.reconcile_stream]  s-   è è € à×+Ò+Ð,<Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=r   r«   úSubscribeParams | Noneúdict[str, Any]c                ó²   — ddl m} d„ | j                             ¦   «         D ¦   «         }|�"|                     t          |¦  «        ¦  «          ||¦  «        S )Nr   )Úcompute_union_filterc                ó6   — g | ]}t          |j        ¦  «        ‘ŒS r5   )r¬   r9   )Ú.0rw   s     r   ú
<listcomp>z;StreamController._compute_current_union.<locals>.<listcomp>f  s/   € ð )
ð )
ð )
Ø!$�D�”ÑÔð)
ð )
ð )
r   )r‰   r¸   rX   rŒ   Úappendr¬   )r   r«   r¸   Úfilterss       r   r­   z'StreamController._compute_current_uniona  su   € ð 	KÐJÐJÐJÐJÐJð)
ð )
Ø(,Ô(;×(BÒ(BÑ(DÔ(Dð)
ñ )
ô )
ˆð ÐØ�NŠN�4 ™;œ;Ñ'Ô'Ð'Ø#Ð# GÑ,Ô,Ð,r   Úseqr   c                ó0   — |                       |¦  «         dS )zCAdvance the reconnect cursor from a command response meta sequence.N)Ú_observe_seq©r   r¾   s     r   Úobserve_applied_through_seqz,StreamController.observe_applied_through_seqq  s   € à×Ò˜#ÑÔÐÐÐr   r“   r   c                óV   — |                       |                     d¦  «        ¦  «         d S )Nr¾   )rÀ   r�   )r   r“   s     r   Ú_observe_eventzStreamController._observe_eventu  s(   € Ø×Ò˜%Ÿ)š) EÑ*Ô*Ñ+Ô+Ð+Ð+Ð+r   c                ój   — t          |t          ¦  «        r| j        �|| j        k    r|| _        d S d S d S r   )r�   r   r_   rÁ   s     r   rÀ   zStreamController._observe_seqx  sB   € Ý�c�3ÑÔð 	 T¤\Ð%9¸SÀ4Ä<Ò=OÐ=OØˆDŒLˆLˆLð	ð 	Ð=OÐ=Or   c                óF   — t          |¦  «        }| j        �
| j        |d<   |S )NÚsince)r¬   r_   )r   r9   Úouts      r   r¤   z#StreamController._filter_with_since|  s%   € Ý�6‰lŒlˆØŒ<Ð#Øœ<ˆC�‰LØˆ
r   Úsourcec               óÊ   K  — |2 3 d {V —†}|                      d¦  «        }|�$|| j        v rŒ(| j                             |¦  «         |                      |¦  «         |W V — Œ]6 d S )Nr   )r�   rV   r'   rÄ   )r   rÉ   r“   r   s       r   rŠ   zStreamController._dedup_iter†  s—   è è € Ø!ð 	ð 	ð 	ð 	ð 	ð 	ð 	�%Ø—y’y Ñ,Ô,ˆHØÐ#Ø˜tÔ3Ð3Ð3ØØÔ$×(Ò(¨Ñ2Ô2Ð2Ø×Ò Ñ&Ô&Ð&ØˆKˆKˆKˆKˆKð "˜6˜6s   …A")rO   r   rI   rP   rJ   r   rK   r   rL   r   rM   rA   rN   rA   r   r   )re   rf   rc   rg   rd   rh   r   ri   )r   r   )r9   r   r   r7   )ry   r   r   r   )r9   r   r   r}   )r—   r   r   r   )r   r)   )r¨   r   r   r   r   )r«   rµ   r   r¶   )r¾   r   r   r   )r“   r   r   r   )r9   r¶   r   r¶   )rÉ   ri   r   ri   )r0   r1   r2   r3   r   rm   rD   rx   r|   Úregister_subscriptionÚunregister_subscriptionrl   r€   Úensure_fanout_runningr†   r    r‘   r   r´   r­   rÂ   rÄ   rÀ   r¤   rŠ   r5   r   r   rG   rG   `   sç  € € € € € ðð ð* @DØ"Ø"(Ø&'Ø(+Ø'*ð<ð <ð <ð <ð <ð <ðD .2Ø ð/ð /ð /ð /ð /ð /ð(Vð Vð Vð Vð$	ð 	ð 	ð 	ð7ð 7ð 7ð 7ð
 3ÐØ6Ðð2ð 2ð 2ð 2ð*Dð Dð Dð Dð
 3Ðð-'ð -'ð -'ð -'ð^,ð ,ð ,ð ,ðð ð ð ðFGð Gð Gð Gð<>ð >ð >ð >ð
 /3ð
-ð 
-ð 
-ð 
-ð 
-ð ð ð ð ð,ð ,ð ,ð ,ðð ð ð ðð ð ð ðð ð ð ð ð r   rG   )r@   r   r?   rA   r   r   ) r3   Ú
__future__r   r=   rq   Úloggingr›   Úcollectionsr   Úcollections.abcr   r   r   r   Údataclassesr	   r
   Útypingr   Úlangchain_protocolr   r   Úlanggraph_sdk.stream.transportr   r   r   Ú	getLoggerr0   rŽ   r7   rE   rG   r5   r   r   ú<module>r×      s³  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à TÐ TÐ TÐ TÐ TÐ TÐ TÐ Tð ð  ð  ð  ð  ñ  ô  ð  ð8 ˆ'Ô
˜HÑ
%Ô
%€ð ð@ð @ð @ð @ð @ñ @ô @ñ „ð@ð EHð ð ð ð ð ð ð nð nð nð nð nñ nô nð nð nð nr   