§
    ÷žyj'€  ã            
       óÌ  — U d 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 ddl	m
Z
mZmZmZmZ ddlmZ ddlZ ej        e¦  «        ZdZdZd	Zi aeee
f         ed
<   daeed<   daeed<    ej        ¦   «         Z ej        ¦   «         Z da!e G d„ d¦  «        ¦   «         Z"e G d„ d¦  «        ¦   «         Z#i dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d“d!d!“d"d"“d#d#“d$d#“i d%d&“d'd(“d)d*“d+d+“d,d-“d.d/“d0d0“d1d2“d2d2“d3d3“d4d3“d5d5“d6d6“d7d7“d8d8“d9d9“d:d:“¥d;d<d=œ¥Z$eeef         ed><   dZ%eeeef                  ed?<   d@efdA„Z&d@eee
f         fdB„Z'd@ee         fdC„Z(dDeee
f         d@dfdE„Z)d@eee
f         fdF„Z*dkdG„Z+dDeee
f         dHed@dfdI„Z,dJe-dHed@dfdK„Z.dkdL„Z/dkdM„Z0	 dldNdOœdPe1dQe1d@eee
f         fdR„Z2dSedTed@ee3         fdU„Z4dVeee
f         d@ee3         fdW„Z5e G dX„ dY¦  «        ¦   «         Z6dSed@eeee
f                  fdZ„Z7d[eee
f         dTed@eeee
f                  fd\„Z8dSedTed@ee6         fd]„Z9dSed@ee         fd^„Z:ddl;Z; e;j<        d_e;j=        ¦  «        Z>e;j?        ed`<    e@h da£¦  «        ZAdSedbed@e1fdc„ZBdSed@ee         fdd„ZCdbedeeee
f         dfed@e"fdg„ZDdfedeeee
f         d@e#fdh„ZEdNdOœdfedQe1d@ee#         fdi„ZFdfedbed@ee"         fdj„ZGdS )mup  Models.dev registry integration â€” primary database for providers and models.

Fetches from https://models.dev/api.json â€” a community-maintained database
of 4000+ models across 109+ providers.  Provides:

- **Provider metadata**: name, base URL, env vars, documentation link
- **Model metadata**: context window, max output, cost/M tokens, capabilities
  (reasoning, tools, vision, PDF, audio), modalities, knowledge cutoff,
  open-weights flag, family grouping, deprecation status

Data resolution order:
  1. In-memory cache (fresh, or stale served immediately while a single
     background daemon thread refreshes)
  2. Disk cache (~/.hermes/models_dev_cache.json â€” any age; stale data is
     served rather than blocking callers on the network)
  3. Network fetch (https://models.dev/api.json) â€” only when no cache
     exists at all; failed refreshes back off for 5 minutes process-wide
Latency-sensitive callers (gateway route-identity checks) pass
``allow_network=False`` and never touch the network.

Other modules should import the dataclasses and query functions from here
rather than parsing the raw JSON themselves.
é    N)Ú	dataclass)ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)Úatomic_json_writezhttps://models.dev/api.jsoni  i,  Ú_models_dev_cacheÚ_models_dev_cache_timeÚ_models_dev_retry_afterFc                   óÒ  — e Zd ZU dZeed<   eed<   eed<   eed<   dZeed<   dZeed<   dZ	eed	<   dZ
eed
<   dZeed<   dZeed<   dZeedf         ed<   dZeedf         ed<   dZeed<   dZeed<   dZee         ed<   dZeed<   dZeed<   dZee         ed<   dZee         ed<   dZeed<   dZeed<   dZeed<   dZeed<   d efd!„Zd efd"„Z d efd#„Z!d efd$„Z"d efd%„Z#d efd&„Z$dS )'Ú	ModelInfoz1Full metadata for a single model from models.dev.ÚidÚnameÚfamilyÚprovider_idFÚ	reasoningÚ	tool_callÚ
attachmentÚtemperatureÚstructured_outputÚopen_weights© .Úinput_modalitiesÚoutput_modalitiesr   Úcontext_windowÚ
max_outputNÚ	max_inputg        Ú
cost_inputÚcost_outputÚcost_cache_readÚcost_cache_writeÚ Úknowledge_cutoffÚrelease_dateÚstatusÚinterleavedÚreturnc                 ó.   — | j         dk    p
| j        dk    S )Nr   )r    r!   ©Úselfs    ú6/home/ragecks/.hermes/hermes-agent/agent/models_dev.pyÚhas_cost_datazModelInfo.has_cost_data^   s   € ØŒ Ò"Ð: dÔ&6¸Ò&:Ð:ó    c                 ó"   — | j         pd| j        v S )NÚimage)r   r   r+   s    r-   Úsupports_visionzModelInfo.supports_visiona   s   € ØŒÐB '¨TÔ-BÐ"BÐBr/   c                 ó   — d| j         v S )NÚpdf©r   r+   s    r-   Úsupports_pdfzModelInfo.supports_pdfd   s   € Ø˜Ô-Ð-Ð-r/   c                 ó   — d| j         v S )NÚaudior5   r+   s    r-   Úsupports_audio_inputzModelInfo.supports_audio_inputg   s   € Ø˜$Ô/Ð/Ð/r/   c                 óÔ   — |                       ¦   «         sdS d| j        d›d�d| j        d›d�g}| j        �|                     d| j        d›d�¦  «         d	                     |¦  «        S )
z<Human-readable cost string, e.g. '$3.00/M in, $15.00/M out'.Úunknownú$z.2fz/M inz/M outNzcache read $z/Mú, )r.   r    r!   r"   ÚappendÚjoin)r,   Úpartss     r-   Úformat_costzModelInfo.format_costj   s†   € à×!Ò!Ñ#Ô#ð 	Ø�9Ø/�T”_Ð/Ð/Ð/Ð/Ð1Q°TÔ5EÐ1QÐ1QÐ1QÐ1QÐRˆØÔÐ+Ø�LŠLÐD¨Ô(<ÐDÐDÐDÐDÑEÔEÐEØ�yŠy˜ÑÔÐr/   c                 ó  — g }| j         r|                     d¦  «         | j        r|                     d¦  «         |                      ¦   «         r|                     d¦  «         |                      ¦   «         r|                     d¦  «         |                      ¦   «         r|                     d¦  «         | j        r|                     d¦  «         | j        r|                     d¦  «         |rd                     |¦  «        nd	S )
zBHuman-readable capabilities, e.g. 'reasoning, tools, vision, PDF'.r   ÚtoolsÚvisionÚPDFr8   zstructured outputzopen weightsr=   Úbasic)	r   r>   r   r2   r6   r9   r   r   r?   )r,   Úcapss     r-   Úformat_capabilitieszModelInfo.format_capabilitiess   s  € àˆØŒ>ð 	%Ø�KŠK˜Ñ$Ô$Ð$ØŒ>ð 	!Ø�KŠK˜Ñ Ô Ð Ø×ÒÑ!Ô!ð 	"Ø�KŠK˜Ñ!Ô!Ð!Ø×ÒÑÔð 	Ø�KŠK˜ÑÔÐØ×$Ò$Ñ&Ô&ð 	!Ø�KŠK˜Ñ Ô Ð ØÔ!ð 	-Ø�KŠKÐ+Ñ,Ô,Ð,ØÔð 	(Ø�KŠK˜Ñ'Ô'Ð'Ø"&Ð3ˆt�yŠy˜‰Œˆ¨GÐ3r/   )%Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   Úboolr   r   r   r   r   r   r	   r   r   Úintr   r   r   r    Úfloatr!   r"   r#   r%   r&   r'   r(   r   r.   r2   r6   r9   rA   rH   r   r/   r-   r   r   8   sE  € € € € € € à;Ð;à€G€G�GØ
€I€I�IØ€K€K�KØÐÐÑð €IˆtÐÐÑØ€IˆtÐÐÑØ€J�ÐÐÑØ€K�ÐÐÑØ#Ð�tÐ#Ð#Ñ#Ø€L�$ÐÐÑð )+Ð�e˜C ˜H”oÐ*Ð*Ñ*Ø)+Ð�u˜S #˜X”Ð+Ð+Ñ+ð €N�CÐÐÑØ€J�ÐÐÑØ#€Iˆx˜Œ}Ð#Ð#Ñ#ð €J�ÐÐÑØ€K�ÐÐÑØ'+€O�X˜e”_Ð+Ð+Ñ+Ø(,Ð�h˜u”oÐ,Ð,Ñ,ð Ð�cÐÐÑØ€L�#ÐÐÑØ€FˆCÐÐÑØ€K�ÐÐÑð;˜tð ;ð ;ð ;ð ;ðC ð Cð Cð Cð Cð.˜dð .ð .ð .ð .ð0 dð 0ð 0ð 0ð 0ð ˜Sð  ð  ð  ð  ð4 Sð 4ð 4ð 4ð 4ð 4ð 4r/   r   c                   óh   — e Zd ZU dZeed<   eed<   eedf         ed<   eed<   dZeed<   d	Ze	ed
<   dS )ÚProviderInfoz-Full metadata for a provider from models.dev.r   r   .ÚenvÚapir$   Údocr   Úmodel_countN)
rI   rJ   rK   rL   rM   rN   r	   rV   rW   rP   r   r/   r-   rS   rS   ‡   sd   € € € € € € à7Ð7à€G€G�GØ
€I€I�IØ	ˆs�CˆxŒÐÐÑØ	€H€H�HØ€Cˆ€M€M�MØ€K�ÐÐÑÐÐr/   rS   Ú
openrouterÚnovitaz	novita-aiÚ	anthropicÚopenaizopenai-codexÚzaiÚkimizkimi-for-codingzkimi-codingÚmoonshotÚstepfunzkimi-coding-cnÚminimaxzminimax-oauthz
minimax-cnÚdeepseekÚalibabaz
qwen-oauthÚcopilotzgithub-copilotz
ai-gatewayÚvercelzopencode-zenÚopencodezopencode-goÚkilocodeÚkiloÚ	fireworkszfireworks-aiÚhuggingfaceÚgeminiÚgoogleÚxaiz	xai-oauthÚxiaomiÚnvidiaÚgroqÚmistralÚ
togetheraiÚ
perplexityÚcohereúollama-cloud)rs   rt   ÚPROVIDER_TO_MODELS_DEVÚ_MODELS_DEV_TO_PROVIDERr)   c                  ó(   — ddl m}   | ¦   «         dz  S )zReturn path to disk cache file.r   ©Úget_hermes_homezmodels_dev_cache.json)Úhermes_constantsry   rx   s    r-   Ú_get_cache_pathr{   Æ   s(   € à0Ð0Ð0Ð0Ð0Ð0Øˆ?ÑÔÐ6Ñ6Ð6r/   c                  ó,  — 	 t          ¦   «         } |                      ¦   «         r=t          | d¬¦  «        5 }t          j        |¦  «        cddd¦  «         S # 1 swxY w Y   n2# t
          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wi S )z%Load models.dev data from disk cache.zutf-8)ÚencodingNz(Failed to load models.dev disk cache: %s)r{   ÚexistsÚopenÚjsonÚloadÚ	ExceptionÚloggerÚdebug)Ú
cache_pathÚfÚes      r-   Ú_load_disk_cacherˆ   Ì   sé   € ðDÝ$Ñ&Ô&ˆ
Ø×ÒÑÔð 	$Ý�j¨7Ð3Ñ3Ô3ð $°qÝ”y ‘|”|ð$ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $øøåð Dð Dð DÝ�ŠÐ?ÀÑCÔCÐCÐCÐCÐCÐCÐCøøøøðDøøøà€Is:   ‚3A" µAÁ	A" ÁAÁA" ÁAÁA" Á"
BÁ,BÂBc                  ó$  — 	 t          ¦   «         } |                      ¦   «         sdS |                      ¦   «         j        }t	          j        ¦   «         |z
  }|dk     rdS |S # t
          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)u<  Return age (in seconds) of the disk cache file, or None if missing.

    Used by ``fetch_models_dev`` to short-circuit the network probe when
    a recent on-disk cache exists. Errors (missing file, permission
    denied, weird filesystem) all return None â€” callers fall through
    to the network fetch path.
    Nr   z(Failed to stat models.dev disk cache: %s)r{   r~   ÚstatÚst_mtimeÚtimer‚   rƒ   r„   )r…   ÚmtimeÚager‡   s       r-   Ú_disk_cache_age_secondsr�   Ø   s£   € ðÝ$Ñ&Ô&ˆ
Ø× Ò Ñ"Ô"ð 	Ø�4Ø—’Ñ!Ô!Ô*ˆÝŒi‰kŒk˜EÑ!ˆð
 �Š7ˆ7Ø�4Øˆ
øÝð ð ð Ý�ŠÐ?ÀÑCÔCÐCØˆtˆtˆtˆtˆtøøøøðøøøs"   ‚"A ¦5A ÁA Á
BÁ)B
Â
BÚdatac                 ó°   — 	 t          ¦   «         }t          || dd¬¦  «         dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)z.Save models.dev data to disk cache atomically.N)Ú,ú:)ÚindentÚ
separatorsz(Failed to save models.dev disk cache: %s)r{   r
   r‚   rƒ   r„   )r�   r…   r‡   s      r-   Ú_save_disk_cacher–   ò   sz   € ðDÝ$Ñ&Ô&ˆ
Ý˜* d°4ÀJÐOÑOÔOÐOÐOÐOøÝð Dð Dð DÝ�ŠÐ?ÀÑCÔCÐCÐCÐCÐCÐCÐCÐCøøøøðDøøøs   ‚!% ¥
A¯AÁAc                  óØ   — t          j        t          d¬¦  «        } |                      ¦   «          |                      ¦   «         }t          |t          ¦  «        r|st          d¦  «        ‚|S )zŽFetch the live models.dev registry without touching local caches.

    Raises on network errors and on an empty/invalid registry payload.
    )é   é
   )Útimeoutz0models.dev returned an empty or invalid registry)ÚrequestsÚgetÚMODELS_DEV_URLÚraise_for_statusr€   Ú
isinstanceÚdictÚ
ValueError)Úresponser�   s     r-   Ú_fetch_models_dev_from_networkr£   û   sf   € õ Œ|�N°GÐ<Ñ<Ô<€HØ×ÒÑÔÐØ�=Š=‰?Œ?€DÝ�d�DÑ!Ô!ð M¨ð MÝÐKÑLÔLÐLØ€Kr/   c                  ój   — t          j         ¦   «         t          z
  t          z   } | t          k    r| adS dS )a$  Give stale cache data a short in-memory grace before retrying refresh.

    Only ever moves the timestamp forward: if a background refresh completed
    between the caller's staleness check and this call, the fresh timestamp
    is preserved instead of being rewound to a 5-minute grace.
    N)rŒ   Ú_MODELS_DEV_CACHE_TTLÚ_MODELS_DEV_RETRY_DELAYr   )Ú
grace_times    r-   Ú_mark_stale_cache_gracer¨     s;   € õ ”‘”Õ4Ñ4Õ7NÑN€JØÕ*Ò*Ð*Ø!+ÐÐÐð +Ð*r/   Úwherec          
      óø   — t          | ¦  «         | at          j        ¦   «         adat
                               d|t          | ¦  «        t          d„ |  	                    ¦   «         D ¦   «         ¦  «        ¦  «         dS )aa  Persist a freshly fetched registry: disk + in-mem + clear backoff.

    Callers must hold ``_models_dev_fetch_lock`` so a failing refresh on one
    path can never stomp the state a succeeding refresh on the other path
    just committed (e.g. a failing background worker re-arming the backoff
    immediately after a successful ``force_refresh``).
    r   zARefreshed models.dev registry (%s): %d providers, %d total modelsc              3   ó†   K  — | ]<}t          |t          ¦  «        ¯t          |                     d i ¦  «        ¦  «        V — Œ=dS )ÚmodelsN)rŸ   r    Úlenrœ   )Ú.0Úps     r-   ú	<genexpr>z#_commit_registry.<locals>.<genexpr>+  sG   è è € ÐSÐS¨½zÈ!ÍTÑ?RÔ?RÐS�C�—’�h Ñ#Ô#Ñ$Ô$ÐSÐSÐSÐSÐSÐSr/   N)
r–   r   rŒ   r   r   rƒ   r„   r­   ÚsumÚvalues)r�   r©   s     r-   Ú_commit_registryr³     s{   € õ �TÑÔÐØÐÝ!œY™[œ[ÐØÐÝ
‡L‚LØKØÝˆD‰	Œ	ÝÐSÐS¨d¯kªk©m¬mÐSÑSÔSÑSÔSñ	ô ð ð ð r/   Úexcc                ó€   — t          j         ¦   «         t          z   at                               d|t          | ¦  «         dS )z’Record a failed refresh: arm the process-wide 5-minute backoff.

    Callers must hold ``_models_dev_fetch_lock`` (see ``_commit_registry``).
    z<models.dev refresh failed (%s); retry suppressed for %ds: %sN)rŒ   r¦   r   rƒ   r„   )r´   r©   s     r-   Ú_note_refresh_failurer¶   /  sB   € õ #œi™kœkÕ,CÑCÐÝ
‡L‚LØFØÝØñ	ô ð ð ð r/   c                  ó¤  — 	 t          ¦   «         } t          5  t          | d¬¦  «         ddd¦  «         n# 1 swxY w Y   nG# t          $ r:}t          5  t	          |d¬¦  «         ddd¦  «         n# 1 swxY w Y   Y d}~nd}~ww xY wt
          5  daddd¦  «         dS # 1 swxY w Y   dS # t
          5  daddd¦  «         w # 1 swxY w Y   w xY w)z3Best-effort refresh after serving stale cache data.Ú
background©r©   NF)r£   Ú_models_dev_fetch_lockr³   r‚   r¶   Ú_models_dev_refresh_lockÚ_models_dev_refresh_in_flight)r�   r‡   s     r-   Ú_background_refresh_models_devr½   >  sï  € ð	2Ý-Ñ/Ô/ˆÝ#ð 	7ð 	7Ý˜T¨Ð6Ñ6Ô6Ð6ð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7øøåð 9ð 9ð 9Ý#ð 	9ð 	9Ý! !¨<Ð8Ñ8Ô8Ð8ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9øøøøøøøøøð9øøøõ &ð 	2ð 	2Ø,1Ð)ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øÕ%ð 	2ð 	2Ø,1Ð)ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð 	2øøøs¤   ‚A —5©A µ9¹A ¼9½A Á B, Á
BÁB ÁA0Á$B Á0A4	Á4B Á7A4	Á8B Á;B, Â BÂB, ÂBÂB#Â&B#Â,CÂ4CÂ7CÃCÃCÃ
CÃCc                  ó¸  — t          j         ¦   «         t          k     rdS t          5  t          r	 ddd¦  «         dS daddd¦  «         n# 1 swxY w Y   t	          j        t          dd¬¦  «        } 	 |                      ¦   «          dS # t          $ rG}t          5  daddd¦  «         n# 1 swxY w Y   t           
                    d|¦  «         Y d}~dS d}~ww xY w)zÑStart one daemon refresh worker if none is already running.

    Honors the process-wide failure backoff: after a failed refresh,
    no new background worker is spawned until ``_models_dev_retry_after``.
    NTzmodels-dev-refresh)Útargetr   ÚdaemonFz-Failed to start models.dev refresh thread: %s)rŒ   r   r»   r¼   Ú	threadingÚThreadr½   Ústartr‚   rƒ   r„   )Úthreadr‡   s     r-   Ú$_start_background_refresh_models_devrÅ   M  s—  € õ „y�{„{Õ,Ò,Ð,ØˆÝ	!ð -ð -Ý(ð 	Øð-ð -ð -ñ -ô -ð -ð -ð -ð )-Ð%ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -õ ÔÝ-Ø!Øðñ ô €Fð
IØ�Š‰ŒˆˆˆøÝð Ið Ið Iõ &ð 	2ð 	2Ø,1Ð)ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2å�ŠÐDÀaÑHÔHÐHÐHÐHÐHÐHÐHÐHøøøøðIøøøsR   ¦	A
¼A
Á
AÁAÁ2B Â
CÂCÂB(ÂCÂ(B,	Â,CÂ/B,	Â0CÃCT©Úallow_networkÚforce_refreshrÇ   c                óh  — |sOt           rt           S t          ¦   «         }|r*|a t          ¦   «         }|�t          j        ¦   «         |z
  ndat           S | s2t           r+t          j        ¦   «         t          z
  t
          k     rt           S | sDt           r=t          ¦   «          t          ¦   «          t           	                    d¦  «         t           S | s«t          ¦   «         }|�›t          ¦   «         }|r‹|a |t
          k     r@t          j        ¦   «         |z
  at           	                    dt          |¦  «        |¦  «         n7t          ¦   «          t          ¦   «          t           	                    d|¦  «         t           S | s#t          j        ¦   «         t          k     rt           S t          5  t          j        ¦   «         }| s8t           rt           cddd¦  «         S |t          k     rt           cddd¦  «         S 	 t          ¦   «         }t          |d¬¦  «         |cddd¦  «         S # t          $ r}t!          |d¬¦  «         Y d}~nd}~ww xY wt           sDt          ¦   «         a dat           r-t           	                    dt          t           ¦  «        ¦  «         t           cddd¦  «         S # 1 swxY w Y   dS )	u°  Fetch models.dev registry. Cache hierarchy: in-mem â†’ disk â†’ network.

    Returns the full registry dict keyed by provider ID, or empty dict on failure.

    Cache hierarchy (when ``force_refresh=False``):
      1. Fresh in-memory cache â†’ return immediately.
      2. Stale in-memory cache â†’ return immediately and refresh in a single
         background daemon thread. Callers never block on the network while
         any cache exists; ``models.dev`` only changes when providers add
         new models, so stale data is preferable to a foreground timeout.
      3. Disk cache file (any age) â†’ load, populate in-mem, return
         immediately. Stale disk caches trigger the same background refresh.
      4. No cache at all â†’ singleflight foreground network fetch. On
         success, save to disk + in-mem and return.
      5. Any failed refresh (foreground or background) suppresses further
         automatic refreshes for 5 minutes process-wide.

    When ``force_refresh=True`` (used by ``hermes config refresh``, the
    "refresh model catalog" code path), cache fast paths and the failure
    backoff are bypassed; the function hits the network and only falls back
    to cached data if the call fails. When ``allow_network=False``, any
    memory or disk cache is returned regardless of age and no request is
    made â€” used by latency-sensitive paths (gateway route-identity checks)
    that must never wait on the network.
    Nr   z@Using stale in-memory models.dev cache; refreshing in backgroundzALoaded models.dev from fresh disk cache (%d providers, age=%.0fs)zGUsing stale models.dev disk cache (age=%.0fs); refreshing in backgroundÚ
foregroundr¹   z1Loaded stale models.dev disk cache (%d providers))r   rˆ   r�   rŒ   r   r¥   r¨   rÅ   rƒ   r„   r­   r   rº   r£   r³   r‚   r¶   )rÈ   rÇ   Ú	disk_dataÚdisk_ageÚnowr�   r‡   s          r-   Úfetch_models_devrÎ   i  s‰  € ð< ð 
!Ýð 	%Ý$Ð$Ý$Ñ&Ô&ˆ	Øð 	Ø )ÐÝ.Ñ0Ô0ˆHà*2Ð*>•”	‘”˜hÑ&Ð&ÀAð #õ !Ð ð
 ð!åð!õ ŒY‰[Œ[Õ1Ñ1Õ5JÒJÐJå Ð ð ð !Õ.ð !ÝÑ!Ô!Ð!Ý,Ñ.Ô.Ð.Ý�ŠØNñ	
ô 	
ð 	
õ !Ð ð ð )Ý*Ñ,Ô,ˆØÐÝ(Ñ*Ô*ˆIØð )Ø$-Ð!ØÕ3Ò3Ð3õ .2¬Y©[¬[¸8Ñ-CÐ*Ý—L’Lð4Ý58¸±^´^ÀXñô ð ð õ
 ,Ñ-Ô-Ð-Ý8Ñ:Ô:Ð:Ý—L’Lð3à ñô ð õ
 )Ð(ð ð !�TœY™[œ[Õ+BÒBÐBÝ Ð õ 
 ð !ð !ÝŒi‰kŒkˆØð 	)Ý ð )Ý(ð	!ð !ð !ð !ñ !ô !ð !ð !ð
 Õ,Ò,Ð,Ý(ð!ð !ð !ð !ñ !ô !ð !ð !ð	9Ý1Ñ3Ô3ˆDÝ˜T¨Ð6Ñ6Ô6Ð6Øð!ð !ð !ð !ñ !ô !ð !ð !øõ ð 	9ð 	9ð 	9Ý! !¨<Ð8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð	9øøøõ !ð 	Ý 0Ñ 2Ô 2ÐØ%&Ð"Ý ð Ý—’ØGÝÕ)Ñ*Ô*ñô ð õ
 !ð7!ð !ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð !ð !s=   Æ%#J'ÇJ'Ç4 H!È!
IÈ+IÈ<J'ÉIÉAJ'Ê'J+Ê.J+ÚproviderÚmodelc                 ó"  — t                                | ¦  «        }|sdS t          ¦   «         }|                     |¦  «        }t          |t          ¦  «        sdS |                     di ¦  «        }t          |t          ¦  «        sdS |                     |¦  «        }|rt          |¦  «        }|r|S |                     ¦   «         }|                     ¦   «         D ]2\  }	}
|	                     ¦   «         |k    rt          |
¦  «        }|r|c S Œ3dD ]�}||z   }|                     |¦  «        }|rt          |¦  «        }|r|c S ||z   }|                     ¦   «         D ]4\  }	}
|	                     ¦   «         |k    rt          |
¦  «        }|r|c c S Œ5Œ‚dS )zÏLook up context_length for a provider+model combo in models.dev.

    Returns the context window in tokens, or None if not found.
    Handles case-insensitive matching and filters out context=0 entries.
    Nr¬   )z:cloudz-cloud)ru   rœ   rÎ   rŸ   r    Ú_extract_contextÚlowerÚitems)rÏ   rÐ   Úmdev_provider_idr�   Úprovider_datar¬   ÚentryÚctxÚmodel_lowerÚmidÚmdataÚsuffixÚsuffixed_keyÚsuffixed_lowers                 r-   Úlookup_models_dev_contextrß   ê  sÎ  € õ .×1Ò1°(Ñ;Ô;ÐØð ØˆtåÑÔ€DØ—H’HÐ-Ñ.Ô.€MÝ�m¥TÑ*Ô*ð Øˆtà×Ò˜x¨Ñ,Ô,€FÝ�f�dÑ#Ô#ð Øˆtð �JŠJ�uÑÔ€EØð Ý˜uÑ%Ô%ˆØð 	ØˆJð —+’+‘-”-€KØ—l’l‘n”nð ð ‰
ˆˆUØ�9Š9‰;Œ;˜+Ò%Ð%Ý" 5Ñ)Ô)ˆCØð Ø�
�
�
øð 'ð ð ˆØ˜v‘~ˆØ—
’
˜<Ñ(Ô(ˆØð 	Ý" 5Ñ)Ô)ˆCØð Ø�
�
�
à$ vÑ-ˆØ Ÿ,š,™.œ.ð 	ð 	‰JˆC�Ø�yŠy‰{Œ{˜nÒ,Ð,Ý& uÑ-Ô-�Øð Ø�J�J�J�J�Jøð		ð ˆ4r/   r×   c                 ó  — t          | t          ¦  «        sdS |                      d¦  «        }t          |t          ¦  «        sdS |                     d¦  «        }t          |t          t          f¦  «        r|dk    rt          |¦  «        S dS )zŽExtract context_length from a models.dev model entry.

    Returns None for invalid/zero values (some audio/image models have context=0).
    NÚlimitÚcontextr   )rŸ   r    rœ   rP   rQ   )r×   rá   rØ   s      r-   rÒ   rÒ   %  s‚   € õ
 �e�TÑ"Ô"ð ØˆtØ�IŠI�gÑÔ€EÝ�e�TÑ"Ô"ð ØˆtØ
�)Š)�IÑ
Ô
€CÝ�#��U�|Ñ$Ô$ð ¨¨qª¨Ý�3‰xŒxˆØˆ4r/   c                   óh   — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	e
ed<   d	Ze
ed
<   dZeed<   dS )ÚModelCapabilitiesz;Structured capability metadata for a model from models.dev.TÚsupports_toolsFr2   Úsupports_reasoningé@ r   é    Úmax_output_tokensr$   Úmodel_familyN)rI   rJ   rK   rL   rå   rO   rN   r2   ræ   r   rP   ré   rê   rM   r   r/   r-   rä   rä   :  sz   € € € € € € àEÐEà€N�DÐÐÑØ!€O�TÐ!Ð!Ñ!Ø$Ð˜Ð$Ð$Ñ$Ø €N�CÐ Ð Ñ Ø!Ð�sÐ!Ð!Ñ!Ø€L�#ÐÐÑÐÐr/   rä   c                 ó  — t                                | ¦  «        }|sdS t          ¦   «         }|                     |¦  «        }t          |t          ¦  «        sdS |                     di ¦  «        }t          |t          ¦  «        sdS |S )z•Resolve a Hermes provider ID to its models dict from models.dev.

    Returns the models dict or None if the provider is unknown or has no data.
    Nr¬   )ru   rœ   rÎ   rŸ   r    )rÏ   rÕ   r�   rÖ   r¬   s        r-   Ú_get_provider_modelsrì   F  sŠ   € õ
 .×1Ò1°(Ñ;Ô;ÐØð ØˆtåÑÔ€DØ—H’HÐ-Ñ.Ô.€MÝ�m¥TÑ*Ô*ð Øˆtà×Ò˜x¨Ñ,Ô,€FÝ�f�dÑ#Ô#ð Øˆtà€Mr/   r¬   c                 ó  — |                       |¦  «        }t          |t          ¦  «        r|S |                     ¦   «         }|                      ¦   «         D ]6\  }}|                     ¦   «         |k    rt          |t          ¦  «        r|c S Œ7dS )zBFind a model entry by exact match, then case-insensitive fallback.N)rœ   rŸ   r    rÓ   rÔ   )r¬   rÐ   r×   rÙ   rÚ   rÛ   s         r-   Ú_find_model_entryrî   [  s‡   € ð �JŠJ�uÑÔ€EÝ�%�ÑÔð Øˆð —+’+‘-”-€KØ—l’l‘n”nð ð ‰
ˆˆUØ�9Š9‰;Œ;˜+Ò%Ð%­*°U½DÑ*AÔ*AÐ%ØˆLˆLˆLøàˆ4r/   c                 ó°  — t          | ¦  «        }|€dS t          ||¦  «        }|€dS t          |                     dd¦  «        ¦  «        }|                     di ¦  «        }t	          |t
          ¦  «        r|                     d¦  «        }nd}t	          |t          ¦  «        rd|v }n#t          |                     dd¦  «        ¦  «        }t          |                     dd¦  «        ¦  «        }|                     d	i ¦  «        }t	          |t
          ¦  «        si }|                     d
¦  «        }	t	          |	t          t          f¦  «        r|	dk    rt          |	¦  «        nd}
|                     d¦  «        }t	          |t          t          f¦  «        r|dk    rt          |¦  «        nd}|                     dd¦  «        pd}t          ||||
||¬¦  «        S )uò  Look up full capability metadata from models.dev cache.

    Uses the existing fetch_models_dev() and PROVIDER_TO_MODELS_DEV mapping.
    Returns None if model not found.

    Extracts from model entry fields:
      - reasoning  (bool)  â†’ supports_reasoning
      - tool_call  (bool)  â†’ supports_tools
      - attachment (bool)  â†’ supports_vision
      - limit.context (int) â†’ context_window
      - limit.output  (int) â†’ max_output_tokens
      - family     (str)   â†’ model_family
    Nr   FÚ
modalitiesÚinputr1   r   r   rá   râ   r   rç   Úoutputrè   r   r$   )rå   r2   ræ   r   ré   rê   )
rì   rî   rO   rœ   rŸ   r    ÚlistrP   rQ   rä   )rÏ   rÐ   r¬   r×   rå   Ú
input_modsr2   ræ   rá   rØ   r   Úoutré   rê   s                 r-   Úget_model_capabilitiesrö   k  sË  € õ " (Ñ+Ô+€FØ€~Øˆtå˜f eÑ,Ô,€EØ€}Øˆtõ ˜%Ÿ)š) K°Ñ7Ô7Ñ8Ô8€Nð —’˜<¨Ñ,Ô,€JÝ�*�dÑ#Ô#ð Ø—^’^ GÑ,Ô,ˆ
ˆ
àˆ
Ý�*�dÑ#Ô#ð ?Ø! ZÐ/ˆˆå˜uŸyšy¨°uÑ=Ô=Ñ>Ô>ˆÝ˜eŸiši¨°UÑ;Ô;Ñ<Ô<Ðð �IŠI�g˜rÑ"Ô"€EÝ�e�TÑ"Ô"ð Øˆà
�)Š)�IÑ
Ô
€CÝ!+¨Cµ#µu°Ñ!>Ô!>ÐVÀ3ÈÂ7À7•S˜‘X”X�XÐPV€Nà
�)Š)�HÑ
Ô
€CÝ$.¨sµS½%°LÑ$AÔ$AÐWÀcÈAÂgÀg�˜C™œ˜ÐSWÐà—9’9˜X rÑ*Ô*Ð0¨b€LåØ%Ø'Ø-Ø%Ø+Ø!ðñ ô ð r/   c                 ó�   ‡ — ddl m}  |‰ ¦  «        p‰ Š t          ‰ ¦  «        }|€g S ˆ fd„|                     ¦   «         D ¦   «         S )zReturn all model IDs for a provider from models.dev.

    Returns an empty list if the provider is unknown or has no data.
    r   )Únormalize_providerNc                 ó4   •— g | ]}t          ‰|¦  «        °|‘ŒS r   )Ú"_should_hide_from_provider_catalog)r®   rÚ   rÏ   s     €r-   ú
<listcomp>z(list_provider_models.<locals>.<listcomp>³  s9   ø€ ð ð ð ØÝ1°(¸CÑ@Ô@ðØðð ð r/   )Úhermes_cli.modelsrø   rì   Úkeys)rÏ   rø   r¬   s   `  r-   Úlist_provider_modelsrþ   ¨  sv   ø€ ð
 5Ð4Ð4Ð4Ð4Ð4Ø!Ð! (Ñ+Ô+Ð7¨x€Hå! (Ñ+Ô+€FØ€~Øˆ	ðð ð ð Ø—{’{‘}”}ðñ ô ð r/   zZ-tts\b|embedding|live-|-(preview|exp)-\d{2,4}[-_]|-image\b|-image-preview\b|-customtools\bÚ_NOISE_PATTERNS>   ú
gemma-3-1bú
gemma-3-2bú
gemma-3-4búgemma-3-12búgemma-3-27búgemma-3-1b-itúgemma-3-2b-itúgemma-3-4b-itúgemini-1.5-proúgemma-3-12b-itúgemma-3-27b-itúgemma-4-26b-itúgemma-4-31b-itúgemini-1.5-flashúgemini-2.0-flashúgemma-4-26b-a4b-itúgemini-1.5-flash-8búgemini-2.0-flash-liteÚmodel_idc                 óÄ   — | pd                      ¦   «                              ¦   «         }|pd                      ¦   «                              ¦   «         }|dv r|t          v rdS dS )Nr$   >   rj   rk   TF)ÚstriprÓ   Ú_GOOGLE_HIDDEN_MODELS)rÏ   r  Úprovider_lowerrÙ   s       r-   rú   rú   à  se   € Ø�n "×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5€NØ�>˜r×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2€KØÐ-Ð-Ð-°+ÕAVÐ2VÐ2VØˆtØˆ5r/   c                 ó@  — t          | ¦  «        }|€g S g }|                     ¦   «         D ]s\  }}t          |t          ¦  «        sŒt	          | |¦  «        rŒ,|                     dd¦  «        sŒCt                               |¦  «        rŒ^|                     |¦  «         Œt|S )zîReturn model IDs suitable for agentic use from models.dev.

    Filters for tool_call=True and excludes noise (TTS, embedding,
    dated preview snapshots, live/streaming, image-only models).
    Returns an empty list on any failure.
    Nr   F)	rì   rÔ   rŸ   r    rú   rœ   rÿ   Úsearchr>   )rÏ   r¬   ÚresultrÚ   r×   s        r-   Úlist_agentic_modelsr  è  s±   € õ " (Ñ+Ô+€FØ€~Øˆ	à€FØ—l’l‘n”nð 	ð 	‰
ˆˆUÝ˜%¥Ñ&Ô&ð 	ØÝ-¨h¸Ñ<Ô<ð 	ØØ�yŠy˜ eÑ,Ô,ð 	ØÝ×!Ò! #Ñ&Ô&ð 	ØØ�Š�cÑÔÐÐØ€Mr/   Úrawr   c                 óð  — |                      d¦  «        pi }t          |t          ¦  «        si }|                      d¦  «        pi }t          |t          ¦  «        si }|                      d¦  «        pi }t          |t          ¦  «        si }|                      d¦  «        pg }|                      d¦  «        pg }|                      d¦  «        }t          |t          t          f¦  «        r|dk    rt          |¦  «        nd}	|                      d¦  «        }
t          |
t          t          f¦  «        r|
dk    rt          |
¦  «        nd}|                      d¦  «        }t          |t          t          f¦  «        r|dk    rt          |¦  «        nd}t          di d	| “d
|                      d
d¦  «        p| “d|                      dd¦  «        pd“d|“dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |t          ¦  «        rt          |¦  «        nd“dt          |t          ¦  «        rt          |¦  «        nd“d|	“d|“d|“dt	          |                      dd¦  «        pd¦  «        “dt	          |                      dd¦  «        pd¦  «        “dd|v r|d         �t	          |d         ¦  «        nd“dd |v r|d          �t	          |d          ¦  «        nd“d!|                      d"d¦  «        pd“d#|                      d#d¦  «        pd“d$|                      d$d¦  «        pd“d%|                      d%d¦  «        “ŽS )&zEConvert a raw models.dev model entry dict into a ModelInfo dataclass.rá   Úcostrð   rñ   rò   râ   r   Nr   r   r$   r   r   r   Fr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   Ú
cache_readr#   Úcache_writer%   Ú	knowledger&   r'   r(   )	rœ   rŸ   r    rP   rQ   r   rO   ró   Útuple)r  r  r   rá   r  rð   rô   Úoutput_modsrØ   Úctx_intrõ   Úout_intÚinpÚinp_ints                 r-   Ú_parse_model_infor'    s@  € à�GŠG�GÑÔÐ" €EÝ�e�TÑ"Ô"ð Øˆà�7Š7�6‰?Œ?Ð ˜b€DÝ�d�DÑ!Ô!ð Øˆà—’˜Ñ&Ô&Ð,¨"€JÝ�j¥$Ñ'Ô'ð Øˆ
à—’ Ñ(Ô(Ð.¨B€JØ—.’. Ñ*Ô*Ð0¨b€Kà
�)Š)�IÑ
Ô
€CÝ$ S­3µ¨,Ñ7Ô7ÐJ¸CÀ!ºG¸G�c�#‰hŒhˆhÈ€GØ
�)Š)�HÑ
Ô
€CÝ$ S­3µ¨,Ñ7Ô7ÐJ¸CÀ!ºG¸G�c�#‰hŒhˆhÈ€GØ
�)Š)�GÑ
Ô
€CÝ$ S­3µ¨,Ñ7Ô7ÐM¸CÀ!ºG¸G�c�#‰hŒhˆhÈ€Gåð ð ð Øˆ8ðà�WŠW�V˜RÑ Ô Ð, Høðð �wŠw�x Ñ$Ô$Ð*¨øðð  �Kð	õ
 �s—w’w˜{¨EÑ2Ô2Ñ3Ô3Ð3ðõ �s—w’w˜{¨EÑ2Ô2Ñ3Ô3Ð3ðõ ˜Ÿš ¨eÑ4Ô4Ñ5Ô5Ð5ðõ ˜Ÿš °Ñ6Ô6Ñ7Ô7Ð7ðõ ˜sŸwšwÐ':¸EÑBÔBÑCÔCÐCðõ ˜#Ÿ'š' .°%Ñ8Ô8Ñ9Ô9Ð9ðõ /9¸ÅTÑ.JÔ.JÐR�˜zÑ*Ô*Ð*ÐPRøðõ 1;¸;ÍÑ0MÔ0MÐU�% Ñ,Ô,Ð,ÐSUøðð �wðð �7ðð �'ðõ  ˜Ÿš '¨1Ñ-Ô-Ð2°Ñ3Ô3Ð3ð!õ" ˜$Ÿ(š( 8¨QÑ/Ô/Ð4°1Ñ5Ô5Ð5ð#ð$ 6BÀTÐ5IÐ5IÈdÐS_ÔN`ÐNl�˜d <Ô0Ñ1Ô1Ð1Ðrvøð%ð& 8EÈÐ7LÐ7LÐQUÐVcÔQdÐQp�˜t MÔ2Ñ3Ô3Ð3Ðvzøð'ð( Ÿš ¨bÑ1Ô1Ð7°Røð)ð* —W’W˜^¨RÑ0Ô0Ð6°Bøð+ð, �wŠw�x Ñ$Ô$Ð*¨øð-ð. —G’G˜M¨5Ñ1Ô1Ð1ð/ð r/   c                 óœ  — |                      d¦  «        pg }|                      d¦  «        pi }t          | |                      dd¦  «        p| t          |t          ¦  «        rt	          |¦  «        nd|                      dd¦  «        pd|                      dd¦  «        pdt          |t
          ¦  «        rt          |¦  «        nd¬	¦  «        S )
zAConvert a raw models.dev provider entry dict into a ProviderInfo.rT   r¬   r   r$   r   rU   rV   r   )r   r   rT   rU   rV   rW   )rœ   rS   rŸ   ró   r!  r    r­   )r   r  rT   r¬   s       r-   Ú_parse_provider_infor)  9  sÀ   € à
�'Š'�%‰.Œ.Ð
˜B€CØ�WŠW�XÑÔÐ$ "€FÝØØ�WŠW�V˜RÑ Ô Ð/ KÝ$ S­$Ñ/Ô/Ð7�E�#‰JŒJˆJ°RØ�GŠG�E˜2ÑÔÐ$ "Ø�GŠG�E˜2ÑÔÐ$ "Ý#-¨fµdÑ#;Ô#;ÐB•C˜‘K”K�KÀðñ ô ð r/   c                óð   — t                                | | ¦  «        }|rt          ¦   «         nt          d¬¦  «        }|                     |¦  «        }t          |t          ¦  «        sdS t          ||¦  «        S )zÆGet full provider metadata from models.dev.

    Accepts either a Hermes provider ID (e.g. "kilocode") or a models.dev
    ID (e.g. "kilo").  Returns None if the provider is not in the catalog.
    FrÆ   N)ru   rœ   rÎ   rŸ   r    r)  )r   rÇ   Úmdev_idr�   r  s        r-   Úget_provider_infor,  K  s|   € õ %×(Ò(¨°kÑBÔB€Gð ð	3ÕÑÔÐå¨EÐ2Ñ2Ô2ð 	ð
 �(Š(�7Ñ
Ô
€CÝ�c�4Ñ Ô ð Øˆtå ¨Ñ-Ô-Ð-r/   c                 ó\  — t                                | | ¦  «        }t          ¦   «         }|                     |¦  «        }t          |t          ¦  «        sdS |                     di ¦  «        }t          |t          ¦  «        sdS |                     |¦  «        }t          |t          ¦  «        rt          |||¦  «        S |                     ¦   «         }|                     ¦   «         D ]E\  }}	|                     ¦   «         |k    r(t          |	t          ¦  «        rt          ||	|¦  «        c S ŒFdS )z¯Get full model metadata from models.dev.

    Accepts Hermes or models.dev provider ID.  Tries exact match then
    case-insensitive fallback.  Returns None if not found.
    Nr¬   )ru   rœ   rÎ   rŸ   r    r'  rÓ   rÔ   )
r   r  r+  r�   Úpdatar¬   r  rÙ   rÚ   rÛ   s
             r-   Úget_model_infor/  i  s  € õ %×(Ò(¨°kÑBÔB€GåÑÔ€DØ�HŠH�WÑÔ€EÝ�e�TÑ"Ô"ð Øˆtà�YŠY�x Ñ$Ô$€FÝ�f�dÑ#Ô#ð Øˆtð �*Š*�XÑ
Ô
€CÝ�#•tÑÔð 9Ý  ¨3°Ñ8Ô8Ð8ð —.’.Ñ"Ô"€KØ—l’l‘n”nð :ð :‰
ˆˆUØ�9Š9‰;Œ;˜+Ò%Ð%­*°U½DÑ*AÔ*AÐ%Ý$ S¨%°Ñ9Ô9Ð9Ð9Ð9øàˆ4r/   )r)   N)F)HrL   r€   ÚloggingrÁ   rŒ   Údataclassesr   Úpathlibr   Útypingr   r   r   r   r	   Úutilsr
   r›   Ú	getLoggerrI   rƒ   r�   r¥   r¦   r   rM   rN   r   rQ   r   ÚLockrº   r»   r¼   r   rS   ru   rv   r{   rˆ   r�   r–   r£   r¨   r³   r‚   r¶   r½   rÅ   rO   rÎ   rP   rß   rÒ   rä   rì   rî   rö   rþ   ÚreÚcompileÚ
IGNORECASErÿ   ÚPatternÚ	frozensetr  rú   r  r'  r)  r,  r/  r   r/   r-   ú<module>r<     s+  ððð ð ð0 €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à #Ð #Ð #Ð #Ð #Ð #à €€€à	ˆÔ	˜8Ñ	$Ô	$€à.€ØÐ ØÐ ð %'Ð �4˜˜S˜”>Ð &Ð &Ñ &Ø !Ð ˜Ð !Ð !Ñ !Ø!"Ð ˜Ð "Ð "Ñ "Ø'˜œÑ)Ô)Ð Ø)˜9œ>Ñ+Ô+Ð Ø %Ð ð ðK4ð K4ð K4ð K4ð K4ñ K4ô K4ñ „ðK4ð\ ðð ð ð ð ñ ô ñ „ðð '*Ø�,ð'*àˆkð'*ð �ð'*ð ˆhð	'*ð
 �Hð'*ð 
ˆ5ð'*ð Ðð'*ð Ð$ð'*ð Ð!ð'*ð ˆyð'*ð Ð'ð'*ð ˆyð'*ð �Yð'*ð �,ð'*ð �
ð'*ð  ˆyð!'*ð" �)ð#'*ð '*ð$ Ðð%'*ð& �(ð''*ð( �Jð)'*ð* �=ð+'*ð, �ð-'*ð. �ð/'*ð0 �=ð1'*ð2 ˆhð3'*ð4 ˆhð5'*ð6 
ˆ5ð7'*ð< �ð='*ð> ˆhð?'*ð@ ˆhðA'*ðB ˆFðC'*ðD ˆyðE'*ðF �,ðG'*ðH �,ðI'*ð '*ðJ Ø"ðM'*ð '*ð '*Ð ˜˜S #˜Xœð 'ð 'ñ 'ðT 59Ð ˜ $ s¨C x¤.Ô1Ð 8Ð 8Ñ 8ð7˜ð 7ð 7ð 7ð 7ð	˜$˜s C˜xœ.ð 	ð 	ð 	ð 	ð ¨%¤ð ð ð ð ð4D˜4  S œ>ð D¨dð Dð Dð Dð Dð¨¨S°#¨X¬ð ð ð ð ð$
,ð 
,ð 
,ð 
,ð˜4  S œ>ð °Sð ¸Tð ð ð ð ð*˜yð °Cð ¸Dð ð ð ð ð2ð 2ð 2ð 2ðIð Ið Ið Ið:  ð~!Ø:>ð~!ð ~!ð ~!Øð~!Ø37ð~!à	ˆ#ˆsˆ(„^ð~!ð ~!ð ~!ð ~!ðB8¨ð 8°Cð 8¸HÀS¼Mð 8ð 8ð 8ð 8ðv˜D  c œNð ¨x¸¬}ð ð ð ð ð* ðð ð ð ð ñ ô ñ „ðð 3ð ¨8°D¸¸c¸´NÔ+Cð ð ð ð ð*˜d 3¨ 8œnð °Sð ¸XÀdÈ3ÐPSÈ8ÄnÔ=Uð ð ð ð ð : Sð :°ð :¸ÐBSÔ9Tð :ð :ð :ð :ðz 3ð ¨4°¬9ð ð ð ð ð& 
€	€	€	Ø(˜bœjð0à„Mñô €�”ð ð ñ ð "˜	ð #ð #ð #ñ ô Ð ð4°ð Àð Èð ð ð ð ð #ð ¨$¨s¬)ð ð ð ð ð<0 ð 0¨$¨s°C¨x¬.ð 0Àsð 0Èyð 0ð 0ð 0ð 0ðf cð °°S¸#°X´ð À<ð ð ð ð ð& 04ð.ð .ð .Øð.Ø(,ð.àˆlÔð.ð .ð .ð .ð<ØðØ #ðàˆiÔðð ð ð ð ð r/   