§
    ìXÊj<  ã                   ó  — d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZ ddlmZmZ  ej        e¦  «        Zd	Zd
ZdZdZde› �ZdZdZdZdZ  ej!        d¦  «        Z" ej!        d¦  «        Z#de$de$fd„Z% e	d¬¦  «         G d„ d¦  «        ¦   «         Z&e	 G d„ d¦  «        ¦   «         Z'e	 G d„ d¦  «        ¦   «         Z(defd„Z)d e$de$fd!„Z*d e$d"e&defd#„Z+d e$d"e&de(dz  fd$„Z,dd%œd e$d"e&d&e$d'e$d(e-d)e-dz  d*e-dz  d+ee'         d,e.e$         dz  ddfd-„Z/d>d e$d"e&dz  ddfd.„Z0d/eddfd0„Z1d/ed1e(ddfd2„Z2ded3œd4ed5e-d6e-de3fd7„Z4d4ede3fd8„Z5d9d:œd4ed;e3de3fd<„Z6d1e(d e$d"e&de$dz  fd=„Z7dS )?z?Best-effort local cache for SandboxPool hosts (host/pool mode).é    N)ÚasdictÚ	dataclassÚfield)ÚPath)ÚAnyÚListé   )Ú	constants)ÚWeakFileLockÚloggingé   g      @i„  iÀ  zhf-sandbox-pool-cache/vi@B i Ìl    (Ö\ i   z[A-Za-z0-9._-]{1,128}z[0-9a-fA-F]{16,128}ÚpartsÚreturnc                  ó®   — d                      t          g| ¢R ¦  «        }t          j        |                     ¦   «         ¦  «                             ¦   «         S )zAShort, stable digest of `parts` (which are joined unambiguously).ú )ÚjoinÚ_DIGEST_PREFIXÚhashlibÚsha256ÚencodeÚ	hexdigest)r   Úmaterials     úOC:\Projects\Historical\venv\Lib\site-packages\huggingface_hub/_sandbox_cache.pyÚ_digestr   D   sD   € à�{Š{�NÐ3¨UÐ3Ð3Ñ4Ô4€HÝŒ>˜(Ÿ/š/Ñ+Ô+Ñ,Ô,×6Ò6Ñ8Ô8Ð8ó    T)Úfrozenc            	       ó‚   — e Zd ZU dZeed<   eed<   edz  ed<   ededededz  dd fd„¦   «         Zedefd	„¦   «         Z	dS )
ÚCacheContextal  The security context a cache entry belongs to.

    A cached entry is not just data: the fast path rebuilds a host transport from it and
    sends it the HF bearer plus the derived host token. So it may only ever be read back by
    the same *endpoint*, *credential* and *namespace* that wrote it -- anything else is a
    plain cache miss, which is what the docs promise and what keeps a `connect(namespace=...)`
    from being served hosts that belong to another namespace.

    `principal` is an opaque, stable id for the credential; the token itself is never stored
    nor used as a key (see `for_credential`).
    ÚendpointÚ	principalNÚ	namespaceÚtokenr   c                óJ   —  | |t          d|¦  «        dd…         |¬¦  «        S )aE  Build the context of a given HF token, identified by its fingerprint.

        The fingerprint is a local computation, which is what keeps a cache hit at zero
        round-trips -- resolving the credential to a user id would cost a `whoami` and defeat
        the purpose of the cache. It is derived from the token but does not contain it: only
        the digest is ever written to disk.

        A rotated or swapped credential therefore reads as a different principal and gets a
        cache miss (the cold path, which always works), rather than someone else's hosts.
        r    Né    )r   r    r!   )r   )Úclsr   r"   r!   s       r   Úfor_credentialzCacheContext.for_credential\   s/   € ð ˆs˜Hµ¸ÀUÑ0KÔ0KÈCÈRÈCÔ0PÐ\eÐfÑfÔfÐfr   c                 óX   — t          d| j        | j        | j        pd¦  «        dd…         S )zHDigest of the whole context; the name of the cache subdirectory it owns.ÚcontextÚ Né   )r   r   r    r!   )Úselfs    r   ÚkeyzCacheContext.keyj   s0   € õ �y $¤-°´ÀÄÐAUÐSUÑVÔVÐWZÐXZÐWZÔ[Ð[r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__Úclassmethodr&   Úpropertyr,   © r   r   r   r   J   s¹   € € € € € € ð
ð 
ð €M€M�MØ€N€N�NØ�T‰zÐÐÑàðg¨ð g°Sð gÀSÈ4ÁZð gÐTbð gð gð gñ „[ðgð ð\�Sð \ð \ð \ñ „Xð\ð \ð \r   r   c                   ó^   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   dZeed	<   d
S )Ú
CachedHostaC  A single host Job of a pool, as last seen by some process.

    `base_url` + `nonce` are everything needed to rebuild the in-job server transport
    (`_SandboxServer`) without an `inspect_job` round-trip: the per-sandbox auth token is
    re-derived from the user's HF token and `nonce` (see `_derive_sandbox_token`).
    Újob_idÚownerÚbase_urlÚnonceÚcapacityÚliveç        Ú
updated_atN)	r-   r.   r/   r0   r1   r2   Úintr?   Úfloatr5   r   r   r7   r7   p   sd   € € € € € € ðð ð €K€K�KØ€J€J�JØ€M€M�MØ€J€J�JØ€M€M�MØ
€I€I�IØ€J�ÐÐÑÐÐr   r7   c                   óÒ   — e Zd ZU dZeed<   eed<   eed<   eed<   edz  ed<   edz  ed<   edz  ed	<   d
Zeed<   d
Zeed<    e	e
¬¦  «        Zee         ed<   eZeed<   dZeed<   dS )Ú	PoolCachezJCached view of one pool: its config (to boot new hosts) + its known hosts.Úpool_idÚimageÚflavorÚsandboxes_per_hostNÚ	max_hostsÚidle_timeoutr!   r)   r   r(   )Údefault_factoryÚhostsÚversionr>   r?   )r-   r.   r/   r0   r1   r2   r@   r   r(   r   ÚlistrK   r   r7   Ú_CACHE_VERSIONrL   r?   rA   r5   r   r   rC   rC   ‚   sÓ   € € € € € € àTÐTà€L€L�LØ€J€J�JØ€K€K�KØÐÐÑØ�T‰zÐÐÑØ˜‘*ÐÐÑØ�T‰zÐÐÑð €HˆcÐÐÑØ€GˆSÐÐÑØ#˜e°DÐ9Ñ9Ô9€Eˆ4�
ÔÐ9Ð9Ñ9Ø!€GˆSÐ!Ð!Ñ!Ø€J�ÐÐÑÐÐr   rC   c                  ó@   — t          t          j        ¦  «        dz  dz  S )NÚsandboxÚpools)r   r
   ÚHF_HOMEr5   r   r   Ú
_pools_dirrS   –   s   € Ý•	Ô!Ñ"Ô" YÑ.°Ñ8Ð8r   rD   c                 ój   ‡ — t          ˆ fd„dD ¦   «         ¦  «        s‰ dv rt          d‰ ›�¦  «        ‚‰ S )zAReturn `pool_id` if it is safe to use as a file name, else raise.c              3   ó    •K  — | ]}|‰v V — Œ	d S ©Nr5   )Ú.0ÚcrD   s     €r   ú	<genexpr>z!_check_pool_id.<locals>.<genexpr>œ   s'   øè è € Ð
5Ð
5˜Aˆ1�ˆ<Ð
5Ð
5Ð
5Ð
5Ð
5Ð
5r   )ú/ú\r   )ú.z..zInvalid pool id: )ÚanyÚ
ValueError)rD   s   `r   Ú_check_pool_idr_   š   sO   ø€ å
Ð
5Ð
5Ð
5Ð
5Ð!4Ð
5Ñ
5Ô
5Ñ5Ô5ð :¸ÀKÐ9OÐ9OÝÐ8¨WÐ8Ð8Ñ9Ô9Ð9Ø€Nr   r(   c                 óT   — t          ¦   «         |j        z  t          | ¦  «        › d�z  S )z;Path of the cache file for `pool_id` in `context` (no I/O).ú.json)rS   r,   r_   ©rD   r(   s     r   Úpool_cache_pathrc   ¡   s)   € å‰<Œ<˜'œ+Ñ%­>¸'Ñ+BÔ+BÐ(IÐ(IÐ(IÑIÐIr   c                 óF  — 	 t          | |¦  «        }|                     dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |                     d¦  «        t
          k    rdS d„ |                     dg ¦  «        D ¦   «         }t          di |¤d|i¤Ž}nD# t          $ r Y dS t          $ r+}t                               d| ›d	|› �¦  «         Y d}~dS d}~ww xY wt          || |¬
¦  «        }|�#t                               d| ›d	|› d�¦  «         dS |S )aP  Return the cached view of `pool_id` for `context`, or `None`.

    Missing, corrupt, incompatible, mistyped and foreign-context files are all the same thing
    here: a cache miss, logged at debug level. The caller's cold path is always correct, so
    this never raises -- a bad cache costs latency, never an error mid-`create()`.
    Úrúutf-8©ÚencodingNrL   c                 ó&   — g | ]}t          d i |¤Ž‘ŒS )r5   )r7   ©rW   Úhs     r   ú
<listcomp>z#read_pool_cache.<locals>.<listcomp>³   s"   € Ð@Ð@Ð@ Q•��˜a��Ð@Ð@Ð@r   rK   z+Ignoring unreadable sandbox pool cache for ú: rb   z Ignoring sandbox pool cache for r\   r5   )rc   ÚopenÚjsonÚloadÚgetrN   ÚpoprC   ÚFileNotFoundErrorÚ	ExceptionÚloggerÚdebugÚ_cache_rejection)	rD   r(   ÚpathÚfÚdatarK   ÚcacheÚeÚreasons	            r   Úread_pool_cacher~   ¦   s�  € ðÝ˜w¨Ñ0Ô0ˆØ�YŠY�s WˆYÑ-Ô-ð 	 °Ý”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 à�8Š8�IÑÔ¥.Ò0Ð0Ø�4Ø@Ð@¨$¯(ª(°7¸BÑ*?Ô*?Ð@Ñ@Ô@ˆÝÐ.Ð.˜DÐ.Ð.¨Ð.Ð.Ð.ˆˆøÝð ð ð ØˆtˆtÝð ð ð Ý�ŠÐSÀ7ÐSÐSÐPQÐSÐSÑTÔTÐTØˆtˆtˆtˆtˆtøøøøðøøøõ ˜e¨W¸gÐFÑFÔF€FØÐÝ�ŠÐN¸ÐNÐNÀVÐNÐNÐNÑOÔOÐOØˆtØ€LsE   ‚'B& ©A
¾B& Á
AÁB& ÁAÁ!B& Á50B& Â&
C'Â3	C'Â< C"Ã"C')Údead_host_idsrE   rF   rG   rH   rI   rK   r   c                óÎ  — |pt          ¦   «         }		 t          | |¦  «        }
t          |
j        ¦  «         t	          t          |
¦  «        dz   t          ¬¦  «        5  t          | |¦  «        }d„ |r|j        ng D ¦   «         }|D ]}|||j	        <   Œ|	D ]}| 
                    |d¦  «         Œt          | ||||||j        |j        |j        t          |                     ¦   «         ¦  «        t#          j        ¦   «         ¬¦  «        }t%          |
|¦  «         ddd¦  «         dS # 1 swxY w Y   dS # t&          $ r+}t(                               d| ›d|› �¦  «         Y d}~dS d}~ww xY w)a¢  Merge `hosts` into the cache for `pool_id` in `context` (best-effort, never raises).

    Concurrency-safe: under a file lock, the on-disk hosts are read, then `hosts` are
    upserted by `job_id` and `dead_host_ids` removed, so a process only adds/updates what
    it learned and never drops hosts another process discovered. The result is written
    atomically. The pool config is refreshed from the arguments.
    z.lock)Útimeoutc                 ó   — i | ]
}|j         |“ŒS r5   )r8   rj   s     r   ú
<dictcomp>z#save_pool_cache.<locals>.<dictcomp>Ú   s   € ÐPÐPÐP a�a”h ÐPÐPÐPr   N)rD   rE   rF   rG   rH   rI   r!   r   r(   rK   r?   z'Could not write sandbox pool cache for rm   )Úsetrc   Ú_ensure_private_dirÚparentr   r1   Ú_LOCK_TIMEOUTr~   rK   r8   rr   rC   r!   r   r,   rM   ÚvaluesÚtimeÚ_atomic_writert   ru   rv   )rD   r(   rE   rF   rG   rH   rI   rK   r   Údeadrx   ÚexistingÚmergedÚhostr8   r{   r|   s                    r   Úsave_pool_cacher�   Á   sé  € ð& Ð!�C™EœE€DðQÝ˜w¨Ñ0Ô0ˆÝ˜DœKÑ(Ô(Ð(Ý�#˜d™)œ) gÑ-µ}ÐEÑEÔEð 	'ð 	'Ý& w°Ñ8Ô8ˆHØPÐP¸hÐ,N¨H¬N¨NÈBÐPÑPÔPˆFØð +ð +�Ø&*��t”{Ñ#Ð#Øð )ð )�Ø—
’
˜6 4Ñ(Ô(Ð(Ð(ÝØØØØ#5Ø#Ø)Ø!Ô+Ø Ô)ØœÝ˜6Ÿ=š=™?œ?Ñ+Ô+Ýœ9™;œ;ðñ ô ˆEõ ˜$ Ñ&Ô&Ð&ð)	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øõ* ð Qð Qð QÝ�ŠÐO¸wÐOÐOÈAÐOÐOÑPÔPÐPÐPÐPÐPÐPÐPÐPøøøøðQøøøs=   ’A
D/ ÁB9D"ÄD/ Ä"D&Ä&D/ Ä)D&Ä*D/ Ä/
E$Ä9 EÅE$c                 óŒ  — 	 |�&t          | |¦  «                             d¬¦  «         dS t          | ¦  «        › d�}t          ¦   «                              ¦   «         D ]/}|                     ¦   «         r||z                       d¬¦  «         Œ0dS # t          $ r+}t                               d| › d|› �¦  «         Y d}~dS d}~ww xY w)aH  Remove the cache file(s) for `pool_id` (best-effort, never raises).

    Without a `context`, the pool's entry is removed from *every* context: deleting a pool is
    the one operation for which over-deleting is the safe direction (the cache is disposable),
    and the caller may not know which credential wrote the entry.
    NT©Ú
missing_okra   z(Could not delete sandbox pool cache for rm   )	rc   Úunlinkr_   rS   ÚiterdirÚis_dirrt   ru   rv   )rD   r(   ÚfilenameÚ	directoryr|   s        r   Údelete_pool_cacher˜   ñ   sþ   € ð	PØÐÝ˜G WÑ-Ô-×4Ò4ÀÐ4ÑEÔEÐEØˆFÝ$ WÑ-Ô-Ð4Ð4Ð4ˆÝ#™œ×-Ò-Ñ/Ô/ð 	?ð 	?ˆIØ×ÒÑ!Ô!ð ?Ø˜XÑ%×-Ò-¸Ð-Ñ>Ô>Ð>øð	?ð 	?øõ ð Pð Pð PÝ�ŠÐNÀÐNÐNÈ1ÐNÐNÑOÔOÐOÐOÐOÐOÐOÐOÐOøøøøðPøøøs   ‚&B ªA"B Â
CÂ B>Â>Crx   c                 óì   — |                       ddt          ¬¦  «         t          t          j        ¦  «        dz  }| g| j        ¢R D ].}||k    r||j        vr dS t          j        |t          ¦  «         Œ/dS )zõCreate the cache directory tree, readable by this user only.

    `mkdir`'s mode is masked by the umask and the tree may predate this code, so the modes
    are also set explicitly, from the leaf up to (and including) the sandbox directory.
    T)ÚparentsÚexist_okÚmoderP   N)ÚmkdirÚ	_DIR_MODEr   r
   rR   rš   ÚosÚchmod)rx   Úrootr—   s      r   r…   r…     s‹   € ð 	‡J‚J�t dµ€JÑ;Ô;Ð;Ý•	Ô!Ñ"Ô" YÑ.€DØÐ*˜Tœ\Ð*Ð*ð 'ð 'ˆ	Ø˜ÒÐ ¨YÔ->Ð!>Ð!>ØˆEˆEÝ
Œ��IÑ&Ô&Ð&Ð&ð'ð 'r   r{   c                 óŠ  — t          j        | j        | j        dz   d¬¦  «        \  }}	 t	          j        |dd¬¦  «        5 }t          j        t          |¦  «        |d¬¦  «         d	d	d	¦  «         n# 1 swxY w Y   t	          j	        || ¦  «         d	S # t          $ r% t          |¦  «                             d
¬¦  «         ‚ w xY w)aj  Write the cache via a temp file + `os.replace` so readers never see a partial file.

    `mkstemp` gives the temp file an unpredictable name and mode `0600` regardless of the
    umask (which `os.replace` then carries over to the final file), so no other user can read
    -- or pre-create and win a race on -- the host URLs and nonces on their way to disk.
    r\   z.tmp)ÚdirÚprefixÚsuffixÚwrf   rg   r   )ÚindentNTr‘   )ÚtempfileÚmkstempr†   ÚnamerŸ   Úfdopenro   Údumpr   ÚreplaceÚBaseExceptionr   r“   )rx   r{   ÚfdÚtmpry   s        r   rŠ   rŠ     s  € õ Ô 4¤;°t´yÀ3±ÈvÐVÑVÔV�G€BˆðÝŒY�r˜3¨Ð1Ñ1Ô1ð 	2°QÝŒI•f˜U‘m”m Q¨qÐ1Ñ1Ô1Ð1ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2å
Œ
�3˜ÑÔÐÐÐøÝð ð ð ÝˆS‰	Œ	×Ò DÐÑ)Ô)Ð)Øðøøøs/   ©B Á %A1Á%B Á1A5Á5B Á8A5Á9B Â/C)ÚminimumÚmaximumÚvaluer±   r²   c                óx   — t          | t          ¦  «        o%t          | t          ¦  «         o|| cxk    o|k    nc S )zJWhether `value` is a plausible count. `bool` is an `int`, but not a count.)Ú
isinstancer@   Úbool)r³   r±   r²   s      r   Ú	_is_countr·   #  sG   € å�e�SÑ!Ô!Ða­*°U½DÑ*AÔ*AÐ&AÐaÀgÐQVÐFaÐFaÒFaÐFaÐZaÒFaÐFaÐFaÐFaÐar   c                 ó�   — t          | t          t          f¦  «        o*t          | t          ¦  «         od| cxk    o
t          k    nc S ©Nr   )rµ   r@   rA   r¶   Ú_MAX_TIMESTAMP)r³   s    r   Ú_is_timestampr»   (  sK   € Ý�e�c¥5˜\Ñ*Ô*Ðkµ:¸eÅTÑ3JÔ3JÐ/JÐkÈqÐTYÐOkÐOkÒOkÐOkÕ]kÒOkÐOkÐOkÐOkÐkr   F)Úallow_emptyr¼   c                ó†   — t          | t          ¦  «        o,|st          | ¦  «        dk    ot          | ¦  «        t          k    S r¹   )rµ   r1   ÚlenÚ_MAX_STR)r³   r¼   s     r   Ú_is_textrÀ   ,  s7   € Ý�e�SÑ!Ô!Ð` {Ð'Dµc¸%±j´jÀ1²nÐ`Í#ÈeÉ*Ì*ÕX`ÒJ`Ð`r   c                óP  — | j         |j        k    rdS | j        |j        k    rd| j        ›d|j        ›�S | j        |j        k    rd| j        ›d|j        ›�S | j        |k    rd| j        ›d|›�S t          | j        ¦  «        rt          | j        ¦  «        sdS t          | j	        d¬¦  «        s
d	| j	        ›�S | j
        � t          | j
        d¬¦  «        s
d| j
        ›�S | j        �%t          | j        t          ¬¦  «        s
d| j        ›�S t          | j        ¦  «        s
d| j        ›�S t          | j        t"          ¦  «        sdS | j        D �]W}t$                               t          |j        t*          ¦  «        r|j        nd¦  «        sd|j        ›d�c S t$                               t          |j        t*          ¦  «        r|j        nd¦  «        sd|j        › d|j        ›�c S t          |j        ¦  «        sd|j        › d�c S t          |j        t*          ¦  «        rt2                               |j        ¦  «        sd|j        › d�c S t          |j        ¦  «        rt          |j        ¦  «        sd|j        › d�c S t          |j        ¦  «        sd|j        › d�c S �ŒYd
S )ao  Why this cache file must not be used, or `None` if it may be.

    Two jobs. First, the entry has to belong to the caller's security context -- same
    endpoint, same credential, same namespace -- which is what makes a cross-namespace or
    cross-principal hit a miss instead of a confidentiality bug.

    Second, a schema check. `dataclass` does not enforce types, so a well-shaped file with
    `"capacity": "50"` parses happily and only blows up much later, on `host.capacity -
    host.live`, as an uncaught `TypeError` in the middle of `create()`. Validating here turns
    that into the documented cache miss.
    z@it was written for a different endpoint, credential or namespacezit names endpoint z, not zit names namespace zit names pool z its image/flavor are not stringsr	   )r±   z0its sandboxes_per_host is not a positive count: Nz'its max_hosts is not a positive count: )r²   z/its idle_timeout is not a duration in seconds: z#its updated_at is not a timestamp: zits hosts are not a listr)   zhost z is not a plausible job idz names a non-namespace owner: z has no URLz has no usable noncez& has a non-numeric capacity/live countz has no usable timestamp)r(   r,   r   r!   rD   rÀ   rE   rF   r·   rG   rH   rI   Ú_MAX_SECONDSr»   r?   rµ   rK   rM   Ú
_JOB_ID_REÚ	fullmatchr8   r1   r9   r:   r;   Ú	_NONCE_REr<   r=   )r{   rD   r(   rŽ   s       r   rw   rw   0  s  € ð „}˜œÒ#Ð#ØQÐQØ„~˜Ô)Ò)Ð)ØP E¤NÐPÐP¸GÔ<LÐPÐPÐPØ„˜'Ô+Ò+Ð+ØS U¤_ÐSÐS¸gÔ>OÐSÐSÐSØ„}˜ÒÐØB ¤ÐBÐB°wÐBÐBÐBå�E”KÑ Ô ð 2­°´Ñ(>Ô(>ð 2Ø1Ð1Ý�UÔ-°qÐ9Ñ9Ô9ð _Ø^À%ÔBZÐ^Ð^Ð^Ø„Ð"­9°U´_ÈaÐ+PÑ+PÔ+PÐ"ØL¸¼ÐLÐLÐLØÔÐ%­i¸Ô8JÕT`Ð.aÑ.aÔ.aÐ%ØWÀÔASÐWÐWÐWÝ˜Ô)Ñ*Ô*ð JØI°UÔ5EÐIÐIÐIå�e”k¥4Ñ(Ô(ð *Ø)Ð)Ø”ð Añ AˆÝ×#Ò#µ:¸d¼kÍ3Ñ3OÔ3OÐ$W D¤K KÐUWÑXÔXð 	EØD˜4œ;ÐDÐDÐDÐDÐDÐDÝ×#Ò#µ*¸T¼ZÍÑ2MÔ2MÐ$U D¤J JÐSUÑVÔVð 	UØT˜4œ;ÐTÐTÀdÄjÐTÐTÐTÐTÐTÝ˜œÑ&Ô&ð 	4Ø3˜4œ;Ð3Ð3Ð3Ð3Ð3Ð3Ý˜$œ*¥cÑ*Ô*ð 	=µ)×2EÒ2EÀdÄjÑ2QÔ2Qð 	=Ø<˜4œ;Ð<Ð<Ð<Ð<Ð<Ð<Ý˜œÑ'Ô'ð 	O­y¸¼Ñ/CÔ/Cð 	OØN˜4œ;ÐNÐNÐNÐNÐNÐNÝ˜Tœ_Ñ-Ô-ð 	AØ@˜4œ;Ð@Ð@Ð@Ð@Ð@Ð@ñ	Aàˆ4r   rV   )8r0   r   ro   rŸ   Úrer¨   r‰   Údataclassesr   r   r   Úpathlibr   Útypingr   r   r)   r
   Úutilsr   r   Ú
get_loggerr-   ru   rN   r‡   ÚHOST_TRUST_TTLrž   r   Ú
_MAX_COUNTrÂ   rº   r¿   ÚcompilerÃ   rÅ   r1   r   r   r7   rC   rS   r_   rc   r~   r@   r„   r�   r˜   r…   rŠ   r¶   r·   r»   rÀ   rw   r5   r   r   ú<module>rÏ      sÊ  ðð FÐ Eà €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ð 
ˆÔ	˜HÑ	%Ô	%€ð €ð €ð €ð €	ð <¨>Ð;Ð;€ð €
Ø#€Ø€Ø€ð ˆRŒZÐ0Ñ1Ô1€
ð ˆBŒJÐ-Ñ.Ô.€	ð9�Cð 9˜Cð 9ð 9ð 9ð 9ð €�$ÐÑÔð"\ð "\ð "\ð "\ð "\ñ "\ô "\ñ Ôð"\ðJ ðð ð ð ð ñ ô ñ „ðð" ðð ð ð ð ñ ô ñ „ðð&9�Dð 9ð 9ð 9ð 9ð˜Cð  Cð ð ð ð ðJ˜Sð J¨<ð J¸Dð Jð Jð Jð Jð
˜Sð ¨<ð ¸IÈÑ<Lð ð ð ð ðJ &*ð-Qð -Qð -QØð-Qð ð-Qð ð	-Qð
 ð-Qð ð-Qð �T‰zð-Qð ˜‘*ð-Qð �
Ôð-Qð �s”8˜d‘?ð-Qð 
ð-Qð -Qð -Qð -Qð`Pð P˜sð P¨\¸DÑ-@ð PÈDð Pð Pð Pð Pð&'˜dð ' tð 'ð 'ð 'ð 'ð˜ð  Yð °4ð ð ð ð ð" -.¸jð bð bð b�Sð b cð b¸ð bÈTð bð bð bð bð
l˜ð l ð lð lð lð lð 16ð að að a�Cð a¨ð a¸$ð að að að að/˜Ið /°3ð /Àð /ÐRUÐX\ÑR\ð /ð /ð /ð /ð /ð /r   