+
    …WÝjã  ã                  óÎ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t^ RIt^ RIHtHt ^ RIHt ^ RIHtHt ]! R4      t^tRt]! 0 Rm4      t]! R04      t]! ]P6                  ]P8                  ]P:                  ]P<                  ]P>                  ]P@                  ]PB                  ]PD                  ]PF                  0	4      t$R	 R
 lt%R R lt&R R lt'RR/R R llt(R# )z<Bounded retries for PM-owned, idempotent network operations.)ÚannotationsN)ÚtimezoneÚUTC)Úparsedate_to_datetime)ÚCallableÚTypeVarÚ_Tg      >@zhermes-assets.nousresearch.comc               ó    € V ^8„  d   QhRRRR/# )é   ÚexcÚ	ExceptionÚreturnÚbool© )Úformats   "Ú>C:\Users\johnn\AppData\Local\hermes\hermes-agent\pm\network.pyÚ__annotate__r      s   € ÷ Eñ E�ið E Dñ Eó    c                ó$  € \        V \        P                  P                  4      '       d   V P                  \
        9   # \        V \        P                  P                  4      '       d8   \        V P                  \        4      ;'       d    \        V P                  4      # \        V \        P                  \        P                  34      '       d   R # \        V \        P                  4      '       d   R# \        V \        P                  4      '       d   V P                   \        P"                  8H  # \        V \$        \&        \(        P*                  P,                  34      '       d   R # \        V \.        4      ;'       d    V P                   \0        9   # )TF)Ú
isinstanceÚurllibÚerrorÚ	HTTPErrorÚcodeÚ_HTTP_RETRYÚURLErrorÚreasonr   Úis_transientÚsslÚSSLEOFErrorÚSSLZeroReturnErrorÚSSLErrorÚsocketÚgaierrorÚerrnoÚ	EAI_AGAINÚTimeoutErrorÚConnectionErrorÚhttpÚclientÚIncompleteReadÚOSErrorÚ_NETWORK_ERRNOS)r   s   &r   r   r      sù   € Ü�#”v—|‘|×-Ñ-×.Ò.Ø�x‰xœ;Ñ&Ð&Ü�#”v—|‘|×,Ñ,×-Ò-Ü˜#Ÿ*™*¤iÓ0×MÐM´\À#Ç*Á*Ó5MÐMÜ�#œŸ™¬×)?Ñ)?Ð@×AÒAÙÜ�#”s—|‘|×$Ò$ÙÜ�#”v—‘×'Ò'Ø�y‰yœF×,Ñ,Ñ,Ð,Ü�#œ¤o´t·{±{×7QÑ7QÐR×SÒSÙÜ�cœ7Ó#×DÐD¨¯	©	´_Ñ(DÐDr   c               ó    € V ^8„  d   QhRRRR/# )r
   r   ÚBaseExceptionr   z
str | Noner   )r   s   "r   r   r   -   s   € ÷ *ñ *�Mð * jñ *r   c                óf  € \        V \        P                  P                  4      '       d   V P                  R9  d   R# V P
                  ;'       g    / p\        P                  P                  V P                  ;'       g    R4      P                  ;'       g    RpVP                  R4      '       d   RpMlVP                  R4      '       gQ   V\        9   dI   VP                  R4      ;'       g    RP                  4       R8X  d   VP                  R4      '       g   R	pMR# T;'       g    R
 RV R2# )a  Explain a 403/429 that a CDN firewall sent instead of the server, else None.

A bare "HTTP 403" from a regional block reads as a broken install or a missing
file (#128295). Cloudflare marks challenges with ``cf-mitigated`` and Vercel's
firewall sets ``x-vercel-mitigated``. Cloudflare's own block page carries
neither, but on our R2 custom domain a response without ``cf-cache-status``
never reached the bucket (Cloudflare R2 troubleshooting docs); other hosts
behind Cloudflare make no such promise, so that fallback is R2-only.
NÚ zx-vercel-mitigatedÚVercelzcf-mitigatedÚserverÚ
cloudflarezcf-cache-statusÚ
Cloudflarez
the serverz's CDN firewall (zH) refused this network. Your install is fine; retry from another network)i“  é­  )r   r   r   r   r   ÚheadersÚparseÚurlsplitÚfilenameÚhostnameÚgetÚ	_R2_HOSTSÚlower)r   r6   ÚhostÚcdns   &   r   Ú
edge_blockr@   -   sñ   € ô �cœ6Ÿ<™<×1Ñ1×2Ò2°c·h±hÀjÔ6PÙØ�k‰k×Ð˜R€GÜ�<‰<× Ñ  §¡×!3Ð!3°Ó4×=Ñ=×CÐCÀ€DØ‡{�{Ð'×(Ò(Ø‰Ø	�‰�^×	$Ò	$Ø”IÔ 7§;¡;¨xÓ#8×#>Ð#>¸B×"EÑ"EÓ"GÈ<Ô"WØ—K‘KÐ 1×2Ò2Ø‰áØ×#Ð#�|Ð$Ð$5°c°Uð ;)ð )ð *r   c               ó$   € V ^8„  d   QhRRRRRR/# )r
   r   r   ÚattemptÚintr   Úfloatr   )r   s   "r   r   r   G   s!   € ÷ "ñ "�	ð " Cð "¨Eñ "r   c                óL  € \        ^V,          4      p\        V \        P                  P                  4      '       dP   V P
                  '       d   V P
                  P                  RR4      MRpV'       d    \        V4      p\#        Y$4      p\%        V\&        4      #   \         d}     \        T4      pTP                  f   TP                  \        R7      pTP                  4       \        P                  ! 4       ,
          p L‚  \        \        \         3 d    Rp  L�i ; ii ; i)r
   zRetry-Afterr0   )Útzinfog        )rD   r   r   r   r   r6   r;   rC   Ú
ValueErrorr   rF   Úreplacer   Ú	timestampÚtimeÚ	TypeErrorÚOverflowErrorÚmaxÚminÚ
_MAX_DELAY)r   rB   ÚdelayÚvalueÚretry_afterÚwhens   &&    r   Ú_delayrT   G   sÛ   € Ü�!�w•,Ó€EÜ�#”v—|‘|×-Ñ-×.Ò.Ø69·k·k°k�—‘—‘ ¨rÔ2Àrˆßð	&Ü! %›j�ô ˜Ó+ˆEÜˆu”jÓ!Ð!øô ô &ð&Ü0°Ó7�DØ—{‘{Ò*Ø#Ÿ|™|´3˜|Ó7˜Ø"&§.¡.Ó"2´T·Y²Y³[Õ"@’KøÜ!¤:¬}Ð=ô &Ø"%“Kð&úð&ús+   Á6B ÂD#Â(ADÄDÄD#ÄDÄD#Úwaitc               ó$   € V ^8„  d   QhRRRRRR/# )r
   Ú	operationzCallable[[], _T]rU   zCallable[[float], None] | Noner   r   r   )r   s   "r   r   r   Z   s$   € ÷ (ñ (Øð(Ø*Hð(àñ(r   c               óÎ  € ^p  V ! 4       #   \          dÎ   p\        T\        P                  P                  4      '       d   TP                  4        \        T4      '       d   T\        8¼  d   h \        Y2^,
          4      pT^,          p\        P                  ! \        4      P                  RY4T\        4       T;'       g    \        P                  ! T4        Rp?KÜ  Rp?ii ; i)zÝRetry the complete request and body read, never an install or publish.

The caller resets attempt-local buffers and keeps any resumable bytes.
A download supplies an interruptible wait so pause does not wait for backoff.
z<network request failed (%s); retrying in %gs (attempt %d/%d)N)r   r   r   r   r   Úcloser   Ú	_ATTEMPTSrT   ÚloggingÚ	getLoggerÚ__name__ÚwarningrJ   Úsleep)rW   rU   rB   r   rP   s   &$   r   Úretry_networkr`   Z   s´   € ð €GØ
ð	(Ù“;ÐøÜô 	(Ü˜#œvŸ|™|×5Ñ5×6Ò6Ø—	‘	”Ü ×$Ò$¨´9Ô(<ØÜ˜3¨!¥Ó,ˆEØ�q�LˆGÜ×ÒœhÓ'×/Ñ/ØNØ˜G¤Yôð ×Ð”T—Z‘ZÐ ×'Ò'ûð	(ús   … ŒC$—CCÃC$>   é˜  r5   éô  éö  é÷  éø  ))Ú__doc__Ú
__future__r   r$   Úhttp.clientr(   r[   r"   r   rJ   Úurllib.errorr   Úurllib.parseÚdatetimer   r   Úemail.utilsr   Útypingr   r   r   rZ   rO   Ú	frozensetr   r<   ÚECONNABORTEDÚECONNREFUSEDÚ
ECONNRESETÚENETDOWNÚ	ENETRESETÚENETUNREACHÚEHOSTUNREACHÚEPIPEÚ	ETIMEDOUTr,   r   r@   rT   r`   r   r   r   Ú<module>rx      sÌ   ðÙ Bå "ã Û Û Û Û 
Û Û Û ß "Ý -ß $áˆTƒ]€Ø€	Ø€
ÙÒ6Ó7€ÙÐ7Ð8Ó9€	ÙØ	×Ñ˜×*Ñ*¨E×,<Ñ,<Ø	‡N�N�E—O‘O U×%6Ñ%6Ø	×Ñ˜Ÿ™ U§_¡_ðó €õEõ *õ4"ð&(ØKO÷(ñ (r   