Ë
    tPêjá:  ã            "       óF	  — d dl Z d dlZd dlmZmZ d dlmZ d dlmZmZm	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 ddlmZ  G d	„ d
e«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z e
j0                  «       d„ «       Zej3                  «        e
j4                  ded¬«       e
j4                  ded¬«       e
j4                  ded¬«       e
j4                  ded¬«       e
j4                  ded¬«       e
j4                  ded¬«       e
j4                  ded ¬«       e
j4                  d!d"d"d#¬$«       e
j4                  d%d"d&¬'«       e
j4                  d(d) e
j:                  d*d+g«      d*d,¬-«      e
j<                  d.e
j>                  d/edz  d0edz  d1edz  d2edz  d3edz  d4edz  d5edz  d6e d)e	d7   d8e fd9„«       «       «       «       «       «       «       «       «       «       «       «       Z!ej3                  «        e
j4                  d:ed;¬«       e
j4                  d<ed=¬«       e
j4                  d>e"d?¬«       e
j4                  d@edA¬«       e
j4                  dedB¬«       e
j4                  dedC¬«       e
j4                  dedD¬«       e
j4                  dEedF¬«       e
j4                  dGedH¬«      e
j<                  d.e
j>                  dIedz  dJedz  dKe"dz  dLedz  d5edz  d2edz  d1edz  dMedz  dNedz  fdO„«       «       «       «       «       «       «       «       «       «       «       Z#ej3                  «        e
j4                  dPedQ¬«       e
j4                  dRedS¬«      e
j<                  d.e
j>                  dTedz  dUedz  fdV„«       «       «       «       Z$dWedz  dXedz  fdY„Z%dZed[edXeeee&f      fd\„Z'd]eeee&f      d^edz  dWedXeeee&f      fd_„Z(d]eeee&f      dXdfd`„Z)daeee&f   dXe*eef   fdb„Z+d]eeee&f      dcedXe,eef   fdd„Z-ej3                  de¬f«       e
j4                  dgd"dh¬i«       e
j4                  djdk¬l«       e
j4                  dmd"dn¬'«       e
j4                  dodp¬l«      e
j<                  d.e
j>                  d[edqedz  dre dWedz  f
ds„«       «       «       «       «       «       Z.y)té    N)ÚMappingÚSequence)Údatetime)ÚAnyÚFinalÚLiteral)ÚTable)ÚReadOnlyÚ	TypedDicté   )ÚKeysManagementClientc                   ó8   — e Zd ZU dZee   ed<   eedz     ed<   y)Ú_CliContextz;Values the top-level CLI group stores on the click context.Úbase_urlNÚapi_key)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   ÚstrÚ__annotations__© ó    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/client/cli/commands/keys.pyr   r      s   … ÙEà�s‰mÓØ�c˜D‘jÑ!Ô!r   r   c                   ó   — e Zd ZU ee   ed<   y)Ú_CliContextViewÚobjN)r   r   r   r
   r   r   r   r   r   r   r      s   … Ø	�+Ñ	Ôr   r   c                   ó.   — e Zd ZU eeeeef         ed<   y)Ú_KeyRowsViewÚrowsN)	r   r   r   r
   r   r   r   Úobjectr   r   r   r   r   r      s   … Ø
�8˜G C¨ KÑ0Ñ1Ñ
2Ô2r   r   c                   ó   — e Zd ZU ee   ed<   y)Ú_JsonBodyViewÚbodyN)r   r   r   r
   r!   r   r   r   r   r#   r#      s   … Ø
�6Ñ
Ôr   r#   c                   ó   — y)z,Manage API keys for the LiteLLM proxy serverNr   r   r   r   Úkeysr&   #   s   � r   z--pagezPage number for pagination)ÚtypeÚhelpz--sizezNumber of items per pagez	--user-idzFilter keys by user IDz	--team-idzFilter keys by team IDz--organization-idzFilter keys by organization IDz
--key-hashzFilter by specific key hashz--key-aliaszFilter by key aliasz--return-full-objectTzReturn the full key object)Úis_flagÚdefaultr(   z--include-team-keysz!Include team keys in the response)r)   r(   z--formatÚoutput_formatÚtableÚjsonzOutput format (table or json))r'   r*   r(   ÚctxÚpageÚsizeÚuser_idÚteam_idÚorganization_idÚkey_hashÚ	key_aliasÚinclude_team_keys)r,   r-   Úreturn_full_objectc                 óÖ  — d| j                   i}t        |d   d   |d   d   «      }|j                  ||||||||
|¬«	      }t        |t        «      sJ ‚|	dk(  rt        j                  |¬«       y d|j                  dg «      i}t        j                  d	t        |d   «      › d
|j                  dd«      › �«       t        d¬«      }|j                  dd¬«       |j                  dd¬«       |j                  dd¬«       |j                  dd¬«       |j                  dd¬«       d|j                  dg «      i}|d   D ]”  }|j                  t        |j                  dd«      «      t        |j                  dd«      «      t        |j                  dd«      «      t        |j                  dd«      «      t        |j                  dd«      «      «       Œ– t        j                  |«       y )!zList all API keysr   r   r   )	r/   r0   r1   r2   r3   r4   r5   r7   r6   r-   ©Údatar    r&   zShowing z keys out of Útotal_countr   zAPI Keys©ÚtitlezKey HashÚcyan©ÚstyleÚAliasÚgreenúUser IDÚmagentazTeam IDÚyellowÚSpendÚredÚtokenÚ r5   r1   r2   ÚspendN)r   r   ÚlistÚ
isinstanceÚdictÚrichÚ
print_jsonÚgetÚprintÚlenr	   Ú
add_columnÚadd_rowr   )r.   r/   r0   r1   r2   r3   r4   r5   r6   r+   r7   ÚcontextÚclientÚresponseÚlistedr,   Úkey_rowsÚkeys                     r   rK   rK   (   sÖ  € ðJ (-¨c¯g©gÐ&6€GÜ(¨°©¸
Ñ)CÀWÈUÁ^ÐT]ÑE^Ó_€FØ—k‘kØØØØØ'ØØØ-Ø+ð "ó 
€Hô �h¤Ô%Ð%Ð%à˜ÒÜ�‰˜XÖ&à'-¨x¯|©|¸FÀBÓ/GÐ&HˆÜ�
‰
�Xœc &¨¡.Ó1Ð2°-ÀÇÁÈ]Ð\]Ó@^Ð?_Ð`ÔaÜ :Ô.ˆØ×Ñ˜¨6ÐÔ2Ø×Ñ˜¨ÐÔ0Ø×Ñ˜¨)ÐÔ4Ø×Ñ˜¨(ÐÔ3Ø×Ñ˜¨ÐÔ.Ø)/°·±¸fÀbÓ1IÐ(JˆØ˜FÑ#ò 	ˆCØ�M‰MÜ�C—G‘G˜G RÓ(Ó)Ü�C—G‘G˜K¨Ó,Ó-Ü�C—G‘G˜I rÓ*Ó+Ü�C—G‘G˜I rÓ*Ó+Ü�C—G‘G˜G RÓ(Ó)õð	ô 	�
‰
�5Õr   z--modelsz&Comma-separated list of allowed modelsz	--aliasesz#JSON string of model alias mappingsz--spendz Maximum spend limit for this keyz
--durationz6Duration for which the key is valid (e.g. '24h', '7d')zAlias/name for the keyz!Team ID to associate the key withz!User ID to associate the key withz--budget-idz#Budget ID to associate the key withz--configz2JSON string of additional configuration parametersÚmodelsÚaliasesrJ   ÚdurationÚ	budget_idÚconfigc
                 óÒ  — d| j                   i}
t        |
d   d   |
d   d   «      }	 |r-|j                  d«      D �cg c]  }|j                  «       ‘Œ c}nd}|rt	        j
                  |«      nd}|	rt	        j
                  |	«      nd}	 |j                  |||||||||¬«	      }t        j                  |¬«       yc c}w # t        j                  $ r}t        j                  d|› �«      ‚d}~ww xY w# t        j                  j                  $ rÔ}t        j                  d	|j                   j"                  › �d
¬«       	 d|j                   j	                  «       i}t        j                  |d   ¬«       t        j&                  «       ‚# t        j                  $ rA t        j                  |j                   j$                  d
¬«       Y t        j&                  «       ‚w xY wd}~ww xY w)zGenerate a new API keyr   r   r   ú,NzInvalid JSON: )	r[   r\   rJ   r]   r5   r2   r1   r^   r_   r9   úError: HTTP T©Úerrr$   )r   r   ÚsplitÚstripr-   ÚloadsÚJSONDecodeErrorÚclickÚBadParameterÚgeneraterN   rO   ÚrequestsÚ
exceptionsÚ	HTTPErrorÚechorW   Ústatus_codeÚtextÚAbort)r.   r[   r\   rJ   r]   r5   r2   r1   r^   r_   rU   rV   ÚmÚmodels_listÚaliases_dictÚconfig_dictÚerW   Ú
error_bodys                      r   rk   rk   s   s£  € ð8 (-¨c¯g©gÐ&6€GÜ(¨°©¸
Ñ)CÀWÈUÁ^ÐT]ÑE^Ó_€Fð7ÙGM°·±¸cÓ1BÖC¨A˜aŸg™g�iÓCÐSWˆÙ5<œdŸj™j¨Ô1À$ˆÙ39œTŸZ™Z¨Ô/¸tˆðØ Ÿ/™/ØØ ØØØØØØØð *ó 

ˆô 	�‰˜XÖ&ùò# Døô ×Ñò 7Ü× Ñ  >°!°Ð!5Ó6Ð6ûð7ûô ×Ñ×(Ñ(ò Ü�
‰
�\ !§*¡*×"8Ñ"8Ð!9Ð:ÀÕEð	2Ø06¸¿
¹
¿¹Ó8IÐ/JˆJÜ�O‰O ¨FÑ!3Õ4ô �k‰k‹mÐøô ×#Ñ#ò 	2Ü�J‰J�q—z‘z—‘¨DÖ1Ü�k‰k‹mÐð	2þðúsd   ¨C ½B=Á7C Â0C5 Â=C ÃC2ÃC-Ã-C2Ã5G&Ä.G!Å5F
Å6G!Æ
>GÇG!ÇGÇG!Ç!G&z--keysz*Comma-separated list of API keys to deletez--key-aliasesz-Comma-separated list of key aliases to deleter&   Úkey_aliasesc                 ód  — d| j                   i}t        |d   d   |d   d   «      }|r-|j                  d«      D �cg c]  }|j                  «       ‘Œ c}nd}|r-|j                  d«      D �cg c]  }|j                  «       ‘Œ c}nd}	 |j	                  ||¬«      }	t        j                  |	¬«       yc c}w c c}w # t        j                  j                  $ rÔ}
t        j                  d|
j                  j                  › �d	¬
«       	 d|
j                  j                  «       i}t        j                  |d   ¬«       t        j"                  «       ‚# t        j                  $ rA t        j                  |
j                  j                   d	¬
«       Y t        j"                  «       ‚w xY wd}
~
ww xY w)zDelete API keys by key or aliasr   r   r   ra   N)r&   ry   r9   rb   Trc   r$   )r   r   re   rf   ÚdeleterN   rO   rl   rm   rn   ri   ro   rW   rp   r-   rh   rq   rr   )r.   r&   ry   rU   rV   ÚkÚ	keys_listÚaÚaliases_listrW   rw   rx   s               r   r{   r{   ®   sS  € ð (-¨c¯g©gÐ&6€GÜ(¨°©¸
Ñ)CÀWÈUÁ^ÐT]ÑE^Ó_€FÙ?C¨4¯:©:°c«?Ö; a˜Ÿ™�	Ó;È€IÙIT¨k×.?Ñ.?ÀÓ.DÖE¨˜1Ÿ7™7�9ÓEÐZ^€Lð
Ø Ÿ-™-¨YÀL˜-ÓQˆÜ�‰˜XÖ&ùò	 <ùÚEøô ×Ñ×(Ñ(ò Ü�
‰
�\ !§*¡*×"8Ñ"8Ð!9Ð:ÀÕEð	2Ø06¸¿
¹
¿¹Ó8IÐ/JˆJÜ�O‰O ¨FÑ!3Õ4ô �k‰k‹mÐøô ×#Ñ#ò 	2Ü�J‰J�q—z‘z—‘¨DÖ1Ü�k‰k‹mÐð	2þðúsG   ¼B4Á-B9Â
)B> Â>F/Ã.F*Ä
5EÄ?F*Å>F'ÆF*Æ&F'Æ'F*Æ*F/Úcreated_sinceÚreturnc                 óâ   — | sy	 d| v rt        j                  | d«      S t        j                  | d«      S # t        $ r0 t        j                  d| › d�d¬«       t        j
                  «       ‚w xY w)	z1Parse and validate the created_since date filter.NÚ_z%Y-%m-%d_%H:%Mz%Y-%m-%dzError: Invalid date format 'z%'. Use YYYY-MM-DD_HH:MM or YYYY-MM-DDTrc   )r   ÚstrptimeÚ
ValueErrorri   ro   rr   )r€   s    r   Ú_parse_created_since_filterr†   Å   su   € áØðà�-ÑÜ×$Ñ$ ]Ð4DÓEÐEä×$Ñ$ ]°JÓ?Ð?øÜò Ü�
‰
Ø*¨=¨/Ð9^Ð_Øõ	
ô �k‰k‹mÐðús   …5 Ÿ5 µ9A.Úsource_clientÚsource_base_urlc                 ó^  — t        j                  d|› �«       g }d}d}	 | j                  d||¬«      }t        |t        «      sJ d«       ‚|j                  dg «      }|s	 |S |j                  |«       t        j                  d|› d	t        |«      › d
�«       t        |«      |k  r	 |S |dz  }Œ�)z5Fetch all keys from source instance using pagination.z"Fetching keys from source server: é   éd   T)r7   r/   r0   z$Expected dict response from list APIr&   zFetched page ú: z keys)ri   ro   rK   rL   rM   rP   ÚextendrR   )r‡   rˆ   Úsource_keysr/   Ú	page_sizeÚsource_responseÚ	page_keyss          r   Ú_fetch_all_keys_with_paginationr’   Ø   sÓ   € ô 
‡J�JÐ3°OÐ3DÐEÔFØ>@€KØ€DØ€Ià
Ø'×,Ñ,ÀÈ4ÐV_Ð,Ó`ˆä˜/¬4Ô0ÐXÐ2XÓXÐ0Ø4C×4GÑ4GÈÐPRÓ4Sˆ	áØð Ðð 	×Ñ˜9Ô%Ü�
‰
�] 4 &¨¬3¨y«>Ð*:¸%Ð@ÔAô ˆy‹>˜IÒ%Øð Ðð 	�‰	ˆð! r   rŽ   Úcreated_since_dtc                 ó²  — |s| S g }| D ]›  }|j                  d«      }|sŒt        |t        «      sŒ(d|v r&t        j                  |j                  dd«      «      }nt        j                  |«      }|j                  r|j                  d¬«      }||k\  sŒ‹|j                  |«       Œ� t        j                  dt        | «      › dt        |«      › d	|› �«       |S )
z/Filter keys by created_since date if specified.Ú
created_atÚTÚZú+00:00N)Útzinfoz	Filtered z	 keys to z keys created since )rP   rL   r   r   ÚfromisoformatÚreplacer™   Úappendri   ro   rR   )rŽ   r“   r€   Úfiltered_keysrZ   Úkey_created_atÚkey_dts          r   Ú_filter_keys_by_created_sincer    ö   sØ   € ñ ØÐà@B€MØò .ˆØŸ™ Ó.ˆÚä˜.¬#Õ.Ø˜.Ñ(Ü%×3Ñ3°N×4JÑ4JÈ3ÐPXÓ4YÓZ‘Fä%×3Ñ3°NÓC�Fð —=’=Ø#Ÿ^™^°4˜^Ó8�FàÐ-Ó-Ø!×(Ñ(¨Õ-ð.ô" 
‡J�J�œ3˜{Ó+Ð,¨I´c¸-Ó6HÐ5IÐI]Ð^kÐ]lÐmÔnØÐr   c           
      óH  — t        j                  d«       t        d¬«      }|j                  dd¬«       |j                  dd¬«       |j                  d	d
¬«       | D ]®  }|j	                  dd«      }|rJt        |t        «      r:d|v r6t        j                  |j                  dd«      «      }|j                  d«      }|j                  t        |j	                  dd«      «      t        |j	                  dd«      «      t        |«      «       Œ° t        j                  |«       y)z?Display a table of keys that would be imported in dry-run mode.z
--- DRY RUN MODE ---zKeys that would be importedr<   z	Key AliasrB   r?   rC   rD   ÚCreatedr>   r•   rI   r–   r—   r˜   z%Y-%m-%d %H:%Mr5   r1   N)ri   ro   r	   rS   rP   rL   r   r   rš   r›   ÚstrftimerT   rN   rQ   )rŽ   r,   rZ   r•   Údts        r   Ú_display_dry_run_tabler¥     sú   € ä	‡J�JÐ'Ô(ÜÐ<Ô=€EØ	×Ñ�[¨ÐÔ0Ø	×Ñ�Y iÐÔ0Ø	×Ñ�Y fÐÔ-àò cˆØ—W‘W˜\¨2Ó.ˆ
áä˜*¤cÔ*à˜*Ñ$Ü!×/Ñ/°
×0BÑ0BÀ3ÈÓ0QÓR�BØ!#§¡Ð-=Ó!>�Jà�‰”c˜#Ÿ'™' +¨rÓ2Ó3´S¸¿¹ÀÈBÓ9OÓ5PÔRUÐV`ÓRaÕbðcô 	‡J�JˆuÕr   rZ   c                 óL   — i }dD ]  }| j                  |«      sŒ| |   ||<   Œ |S )z:Prepare key data for import by extracting relevant fields.)r[   r\   rJ   r5   r2   r1   r^   r_   )rP   )rZ   Úimport_dataÚfields      r   Ú_prepare_key_import_datar©   ,  s;   € à€Kð	ò ,ˆð �7‰7�5�>Ø!$ U¡ˆK˜Òð,ð Ðr   Údest_clientc                 ó~  — d}d}| D ]g  }	 t        |«      } |j                  di |¤Ž}t        j                  d|› �«       |dz  }|j	                  dd«      }t        j                  d|› �«       Œi ||fS # t
        $ r>}|dz  }|j	                  dd«      }t        j                  d|› d|› �d	¬
«       Y d}~Œ°d}~ww xY w)z>Import each key to the destination instance and return counts.r   zGenerated key: rŠ   r5   zN/AzImported key: zFailed to import key rŒ   Trc   Nr   )r©   rk   ri   ro   rP   Ú	Exception)	rŽ   rª   Úimported_countÚfailed_countrZ   r§   rW   r5   rw   s	            r   Ú_import_keys_to_destinationr¯   A  sà   € ð €NØ€Làò Kˆð	Kä2°3Ó7ˆKð ,�{×+Ñ+Ñ:¨kÑ:ˆHÜ�J‰J˜¨¨
Ð3Ô4à˜aÑˆNàŸ™ ¨UÓ3ˆIÜ�J‰J˜¨	 {Ð3Õ4ðKð& ˜<Ð'Ð'øô ò 	KØ˜AÑˆLØŸ™ ¨UÓ3ˆIÜ�J‰JÐ.¨y¨k¸¸A¸3Ð?ÀT×JÒJûð	Kús   ‹A$A5Á5	B<Á>4B7Â7B<Úimport)Únamez--source-base-urlz?Base URL of the source LiteLLM proxy server to import keys from)Úrequiredr(   z--source-api-keyz/API key for authentication to the source server)r(   z	--dry-runz6Show what would be imported without actually importingz--created-sincezVOnly import keys created after this date/time (format: YYYY-MM-DD_HH:MM or YYYY-MM-DD)Úsource_api_keyÚdry_runc                 óŒ  — t        |«      }t        ||«      }d| j                  i}t        |d   d   |d   d   «      }	 t        ||«      }	|rt	        |	||«      }	|	st        j                  d«       yt        j                  dt        |	«      › d�«       |rt        |	«       yt        |	|«      \  }
}t        j                  d«       t        j                  d	|
› �«       t        j                  d
|› �«       t        j                  dt        |	«      › �«       y# t        j                  j                  $ rÔ}t        j                  d|j                  j                  › �d¬«       	 d|j                  j                  «       i}t!        j"                  |d   ¬«       t        j(                  «       ‚# t        j$                  $ rA t        j                  |j                  j&                  d¬«       Y t        j(                  «       ‚w xY wd}~wt*        $ r3}t        j                  d|› �d¬«       t        j(                  «       ‚d}~ww xY w)z-Import API keys from another LiteLLM instancer   r   r   z!No keys found in source instance.NzFound z keys in source instance.z
Import completed:z  Successfully imported: z  Failed to import: z  Total keys processed: rb   Trc   r$   r9   zError: )r†   r   r   r’   r    ri   ro   rR   r¥   r¯   rl   rm   rn   rW   rp   r-   rN   rO   rh   rq   rr   r¬   )r.   rˆ   r³   r´   r€   r“   r‡   rU   rª   rŽ   r­   r®   rw   rx   s                 r   Úimport_keysr¶   ^  sí  € ô4 :¸-ÓHÐô 0°ÀÓP€MØ',¨c¯g©gÐ&6€GÜ-¨g°e©n¸ZÑ.HÈ'ÐRWÉ.ÐYbÑJcÓd€Kð%ä5°mÀ_ÓUˆñ Ü7¸ÐEUÐWdÓeˆKáÜ�J‰JÐ:Ô;Øä�
‰
�VœC Ó,Ð-Ð-FÐGÔHáÜ" ;Ô/Øô (CÀ;ÐP[Ó'\Ñ$ˆ˜ô 	�
‰
Ð(Ô)Ü�
‰
Ð.¨~Ð.>Ð?Ô@Ü�
‰
Ð)¨,¨Ð8Ô9Ü�
‰
Ð-¬c°+Ó.>Ð-?Ð@ÕAøä×Ñ×(Ñ(ò Ü�
‰
�\ !§*¡*×"8Ñ"8Ð!9Ð:ÀÕEð	2Ø06¸¿
¹
¿¹Ó8IÐ/JˆJÜ�O‰O ¨FÑ!3Õ4ô �k‰k‹mÐøô ×#Ñ#ò 	2Ü�J‰J�q—z‘z—‘¨DÖ1Ü�k‰k‹mÐð	2þô ò Ü�
‰
�W˜Q˜C�= dÕ+Ü�k‰k‹mÐûðúsT   ¿2D Á2/D Â"A5D ÄIÄ5.HÅ$5F-ÆHÆ->HÇ+HÈ HÈHÈIÈ.H>È>I)/Úbuiltinsr-   Úcollections.abcr   r   r   Útypingr   r   r   ri   rl   rN   Ú
rich.tabler	   Útyping_extensionsr
   r   r&   r   r   r   r   r#   ÚgroupÚcommandÚoptionÚintr   ÚChoiceÚpass_contextÚContextÚboolrK   Úfloatrk   r{   r†   r!   r’   r    r¥   rM   r©   Útupler¯   r¶   r   r   r   ú<module>rÆ      s;  ðÛ Û ß -Ý ß &Ñ &ã Û Û Ý ß 1å (ô"�)ô "ô�iô ô3�9ô 3ô�Iô ð €‡�ƒñ7ó ð7ð ‡�ƒØ€‡�ˆh˜SÐ'CÔDØ€‡�ˆh˜SÐ'AÔBØ€‡�ˆk Ð*BÔCØ€‡�ˆk Ð*BÔCØ€‡�Ð!¨Ð2RÔSØ€‡�ˆl Ð+HÔIØ€‡�ˆm #Ð,AÔBØ€‡�ØØØØ	%ô	ð €‡�Ð#¨TÐ8[Ô\Ø€‡�ØØØ	ˆ�‰�w Ð'Ó	(ØØ	(ôð ×Ñð1Ø	�‰ð1à
�‰*ð1ð �‰*ð1ð �4‰Zð	1ð
 �4‰Zð1ð ˜4‘Zð1ð �D‰jð1ð �T‰zð1ð ð1ð ˜?Ñ+ð1ð ò1ó óó ]óó Có Jó Tó Dó Dó Có Eó ð.1ðh ‡�ƒØ€‡�ˆj˜sÐ)QÔRØ€‡�ˆk Ð*OÔPØ€‡�ˆi˜eÐ*LÔMØ€‡�ØØ	Ø	Aôð
 €‡�ˆm #Ð,DÔEØ€‡�ˆk Ð*MÔNØ€‡�ˆk Ð*MÔNØ€‡�ˆm #Ð,QÔRØ€‡�ˆj˜sÐ)]Ô^Ø×Ñð)Ø	�‰ð)à�$‰Jð)ð �4‰Zð)ð �4‰<ð	)ð
 �D‰jð)ð �T‰zð)ð �4‰Zð)ð �4‰Zð)ð �T‰zð)ð �$‰Jò)ó ó _ó Só Oó Oó Fóó Nó Qó Só ð)ðX ‡�ƒØ€‡�ˆh˜SÐ'SÔTØ€‡�ˆo CÐ.]Ô^Ø×Ñð�—‘ð  S¨4¡Zð ¸cÀD¹jò ó ó _ó Uó ðð&¨s°T©zð ¸hÈ¹oó ð&Ø'ðØ:=ðàˆg�c˜6�kÑ"Ñ#óð<Ø˜' # v +Ñ.Ñ/ðà ‘oðð ðð ˆg�c˜6�kÑ"Ñ#ó	ð>¨°¸¸f¸Ñ1EÑ(Fð È4ó ð. '¨#¨v¨+Ñ"6ð ¸4ÀÀSÀ¹>ó ð*(Ø˜' # v +Ñ.Ñ/ð(Ø>Rð(à
ˆ3�ˆ8�_ó(ð: ‡��8€ÓØ€‡�ØØØ	Jôð
 €‡�Ð Ð'XÔYØ€‡�ØØØ	Aôð
 €‡�ØØ	aôð ×Ñð5Ø	�‰ð5àð5ð ˜$‘Jð5ð ð	5ð
 ˜‘:ò5ó ó	óó Zóó ñ"5r   