+
    iHàj´È  ã                  óâ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHtHtHt ^ RIHt ^ RIHtHtHtHtHtHtHtHtHt ]P:                  ! ]4      tRs R	]!R
&   ]"! 0 R”m4      t#]PH                  ! R4      t%]&! 4       t']"! RR04      t(R R lt)]
 ! R R4      4       t*Rt+Rt,R•t-R]!R&   Rt.Rt/Rt0Rt1Rt2Rt3Rt4Rt5Rt6R t7R!t8R"t9R# R$ lt:R–R% R& llt;R' R( lt<R) R* lt=Rt>R+t?Rt@R, R- ltAR. R/ ltBR0 R1 ltCR2R/R3 R4 lltDR2R/R5 R6 lltER7tFR8R9R:]FR;R</tGR= R> ltHR? R@ ltIR2R/RA RB lltJ]
 ! RC RD4      4       tKRE RF ltLRG RH ltMR—RI RJ lltNRKRR2R/RL RM lltOR˜tPRQ]!RR&   ]"! 0 R™m4      tQ]QRNRO0,          tRRStSRT RU ltTRV RW ltU]'3RX RY lltVR—RZ R[ lltWR\ R] ltXRšR^RPR_R/R` Ra llltYRb]Y! RcRdReRf4      Rg]Y! RhRhRe4      Ri]Y! RjRjRe4      Rk]Y! RlRlRe4      Rm]Y! RfRnReRf4      Ro]Y! RnRnRRnRRpRq7      Rr]Y! RnRsReRnRRpRq7      /tZRt]!Ru&   Rv Rw lt[Rx Ry lt\Rz R{ lt]/ t^R|]!R}&   R~t_R R€ lt`]0]2]13ta/ tbR|]!R�&   R‚ Rƒ ltcR„ R… ltdR† R‡ lteRˆ R‰ ltfRŠ R‹ ltgRŒ R� lthRŽ R� ltiR� R‘ ltjR’ R“ ltkR# )›aq  Nous credits: parse ``x-nous-credits-*`` / ``x-nous-tool-pool-*`` response
headers into a validated CreditsState (depletion = paid_access, subscription-cap
used_fraction, warn-once schema-version gating) and drive the notice policy.
Header contract: see ``_HEADER_FIELDS``. Money is micros ints only; ``*_usd``
strings are preserved verbatim (never re-parsed to float).)ÚannotationsN)Ú	dataclass)ÚDecimal)ÚAnyÚMappingÚOptional)Úis_truthy_value)	ÚBP_FULLÚSCOPE_TOP_TIERÚWindowGaugeÚ	all_scopeÚbinding_gaugeÚgauge_limit_nameÚparse_gaugesÚpaused_for_paymentÚtop_tier_gaugeFÚboolÚ_version_warning_emittedz^-?\d+\.\d{2}$ÚincludedÚpaygc               ó    € V ^8„  d   QhRRRR/# )é   Úvaluer   Úreturn© )Úformats   "Ú:/home/ubuntu/.hermes/hermes-agent/agent/credits_tracker.pyÚ__annotate__r   ,   s   € ÷ ñ �Sð ˜Sñ ó    c                óz   €  V f   \         # \        \        V 4      4      #   \        \        3 d
    \         u # i ; i)z™Exact int (money-safe) or ``_SENTINEL``. ``int()`` directly, NOT ``int(float())``
(precision loss above 2**53 corrupts money); float-shaped strings fail.)Ú	_SENTINELÚintÚstrÚ	TypeErrorÚ
ValueError)r   s   &r   Ú	_safe_intr%   ,   s8   € ðØ!šMŒyÐ>¬s´3°u³:«Ð>øÜ”zÐ"ô ÜÒðús   ‚	  Œ   :¹:c                  óŠ  € ] tR t^5t$ Rt^ tR]R&   ^ tR]R&   RtR]R&   ^ t	R]R&   Rt
R]R	&   R
tR]R&   R
tR]R&   ^ tR]R&   ^ tR]R&   RtR]R&   ^ tR]R&   RtR]R&   RtR]R&   RtR]R&   R
tR]R&   ^ tR]R&   RtR]R&   RtR]R&   RBtR ]R!&   R
tR]R"&   RtR]R#&   R
tR]R$&   RtR]R%&   R
tR&]R'&   ]R( R) l4       t]R* R+ l4       t ]R, R- l4       t!]R. R/ l4       t"]R0 R1 l4       t#]R2 R3 l4       t$]R4 R5 l4       t%]R6 R7 l4       t&]R8 R9 l4       t']R: R; l4       t(]R< R= l4       t)]R> R? l4       t*]R@ RA l4       t+RBt,R
# )CÚCreditsStatez<Credits state parsed from x-nous-credits-* response headers.r!   ÚversionÚremaining_microsÚ r"   Úremaining_usdÚsubscription_microsÚsubscription_usdNúOptional[int]Úsubscription_limit_microsúOptional[str]Úsubscription_limit_usdÚrollover_microsÚpurchased_microsÚpurchased_usdÚtool_pool_microsFr   Útool_pool_gated_offÚnoneÚdenominator_kindTÚpaid_accessÚdisabled_reasonÚas_of_msç        ÚfloatÚcaptured_atÚfrom_headerztuple[WindowGauge, ...]ÚgaugesÚspend_sourceÚ	unmeteredÚpaused_reasonÚauto_top_up_enabledúOptional[bool]Úkeep_going_on_creditsc               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   ÚCreditsState.__annotate__X   s   € ÷ Uñ U˜Tñ Ur   c                óL   € V P                   ^ 8„  ;'       d    V P                  RJ# )zNTop-up credits will cover Hermes usage once the included allowance is used up.F)r3   rF   ©Úselfs   &r   Úcredits_payÚCreditsState.credits_payW   s(   € ð ×$Ñ$ qÑ(×TÐT¨T×-GÑ-GÈuÐ-TÐTr   c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   rI   ]   s   € ÷ $ñ $˜$ñ $r   c                	ó    € V P                   ^ 8„  # )é    )r>   rK   s   &r   Úhas_dataÚCreditsState.has_data\   s   € à×Ñ !Ñ#Ð#r   c               ó   € V ^8„  d   QhRR/# )r   r   r=   r   )r   s   "r   r   rI   a   s   € ÷ Qñ Q˜Uñ Qr   c                	óˆ   € V P                   '       d'   \        P                  ! 4       V P                  ,
          # \        R 4      # )Úinf)rR   Útimer>   r=   rK   s   &r   Úage_secondsÚCreditsState.age_seconds`   s*   € à15··°Œt�yŠy‹{˜T×-Ñ-Õ-ÐPÄEÈ%ÃLÐPr   c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   rI   e   s   € ÷ $ñ $˜$ñ $r   c                ó$   € V P                   '       * # )uŽ   ``paid_access == False`` ONLY â€” ``remaining_micros == 0`` is a false positive
when the balance is zero but access is live (renewal pending).)r9   rK   s   &r   ÚdepletedÚCreditsState.depletedd   s   € ð ×#Ñ#Ô#Ð#r   c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   rI   k   s   € ÷ Xñ X ñ Xr   c                ól   € V P                   R8H  ;'       d    \        \        V P                  4      4      # )zLA usage-window plan with at least one allowance that stops every paid model.Úusage_window)r8   r   r   r@   rK   s   &r   Úis_usage_windowÚCreditsState.is_usage_windowj   s+   € ð ×$Ñ$¨Ñ6×WÐW¼4Ä	È$Ï+É+Ó@VÓ;WÐWr   c               ó   € V ^8„  d   QhRR/# ©r   r   úOptional[WindowGauge]r   )r   s   "r   r   rI   p   s   € ÷ Lñ LÐ4ñ Lr   c                óT   € V P                   '       d   \        V P                  4      # R# )z_The all-scope allowance that binds (see :func:`usage_gauges.binding_gauge`). Usage window only.N)ra   r   r@   rK   s   &r   r   ÚCreditsState.binding_gaugeo   s#   € ð .2×-A×-AÐ-AŒ}˜TŸ[™[Ó)ÐKÀtÐKr   c               ó   € V ^8„  d   QhRR/# rd   r   )r   s   "r   r   rI   u   s   € ÷ Mñ MÐ 5ñ Mr   c                	óT   € V P                   '       d   \        V P                  4      # R # ©N)ra   r   r@   rK   s   &r   r   ÚCreditsState.top_tier_gauget   s!   € à.2×.B×.BÐ.BŒ~˜dŸk™kÓ*ÐLÈÐLr   c               ó   € V ^8„  d   QhRR/# )r   r   zOptional[float]r   )r   s   "r   r   rI   y   s   € ÷ 	Jñ 	J˜ñ 	Jr   c                ó  € V P                   '       d   V P                  P                  # V P                  p\	        V\
        4      '       d   V^ 8:  d   R# \        R\        RWP                  ,
          V,          4      4      # )a   Fraction of the cap consumed in [0.0, 1.0]; None without a computable denominator.
Credit-grant: guarded on the LIMIT FIELD (the real denominator), not ``denominator_kind``.
Usage window: the binding all-scope allowance (whichever stops every model first).Nr<   ç      ð?)	ra   r   Úused_fractionr/   Ú
isinstancer!   ÚmaxÚminr,   )rL   Úlims   & r   ro   ÚCreditsState.used_fractionx   se   € ð
 ××ÐØ×%Ñ%×3Ñ3Ð3Ø×,Ñ,ˆÜ˜#œs×#Ò# s¨a¤xÙÜ�3œ˜C #×(@Ñ(@Õ"@ÀCÕ!GÓHÓIÐIr   c               ó   € V ^8„  d   QhRR/# ©r   r   r.   r   )r   s   "r   r   rI   …   s   € ÷ 9ñ 9 ]ñ 9r   c                ó>   € V P                   pVe   VP                  # R# )z'Reset instant of the binding allowance.N)r   Úresets_at_ms©rL   Úgs   & r   Úwindow_resets_at_msÚ CreditsState.window_resets_at_ms„   s"   € ð ×ÑˆØ!"¢ˆq�~‰~Ð8°DÐ8r   c               ó   € V ^8„  d   QhRR/# rv   r   )r   s   "r   r   rI   ‹   s   € ÷ 9ñ 9 }ñ 9r   c                	ó>   € V P                   pVe   VP                  # R # rj   )r   rx   ry   s   & r   Útop_tier_resets_at_msÚ"CreditsState.top_tier_resets_at_msŠ   s    € à×ÑˆØ!"¢ˆq�~‰~Ð8°DÐ8r   c               ó   € V ^8„  d   QhRR/# rv   r   )r   s   "r   r   rI   �   s   € ÷ 4ñ 4 -ñ 4r   c                	ó>   € V P                   pVe   VP                  # R # rj   )r   Úused_bpry   s   & r   Útop_tier_used_bpÚCreditsState.top_tier_used_bp�   s    € à×ÑˆØšMˆq�y‰yÐ3¨tÐ3r   c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   rI   •   s   € ÷ Tñ T $ñ Tr   c                óÞ   € V P                   ;'       d[    \        ;QJ d/    R \        V P                  4       4       F  '       g   K   R# 	  R# ! R \        V P                  4       4       4      # )zgAn allowance that stops every paid model is full. Paused (payment) is NOT exhausted: nothing was spent.c              3  ó8   "  € T F  qP                   x € K  	  R # 5irj   )Úfull)Ú.0rz   s   & r   Ú	<genexpr>Ú0CreditsState.window_exhausted.<locals>.<genexpr>—   s   é € Ð+SÑ<R°q¯F®FÓ<Rùs   ‚TF)ra   Úanyr   r@   rK   s   &r   Úwindow_exhaustedÚCreditsState.window_exhausted”   sM   € ð ×#Ñ#×SÐS¯«Ñ+S¼IÀdÇkÁkÔ<RÓ+S¯¬ÐSªÐS¨Ñ+S¼IÀdÇkÁkÔ<RÓ+SÓ(SÐSr   c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   rI   š   s   € ÷ (ñ ( Dñ (r   c                óJ   € V P                   pVRJ;'       d    VP                  # )uS   The top-tier allowance is full (a percent, like the others â€” not a blocked flag).N)r   r‰   ry   s   & r   Útop_tier_exhaustedÚCreditsState.top_tier_exhausted™   s%   € ð ×ÑˆØ˜ˆ}×'Ð' §¡Ð'r   r   )-Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r(   Ú__annotations__r)   r+   r,   r-   r/   r1   r2   r3   r4   r5   r6   r8   r9   r:   r;   r>   r?   r@   rA   rB   rC   rD   rF   ÚpropertyrM   rR   rX   r\   ra   r   r   ro   r{   r   r„   rŽ   r’   Ú__static_attributes__r   r   r   r'   r'   5   s  ‡ áFà€GˆSÓØÐ�cÓØ€M�3ÓØ Ð˜Ó ØÐ�cÓØ/3Ð˜}Ó3Ø,0Ð˜MÓ0Ø€O�SÓØÐ�cÓØ€M�3ÓØÐ�cÓØ %Ð˜Ó%Ø"Ð�cÓ"Ø€K�ÓØ%)€O�]Ó)Ø€HˆcÓØ€K�ÓØ€K�Óà&(€FÐ#Ó(Ø"&€L�-Ó&ð €IˆtÓØ#'€M�=Ó'Ø %Ð˜Ó%ð -1Ð˜>Ó0àôUó ðUð ô$ó ð$ð ôQó ðQð ô$ó ð$ð
 ôXó ðXð ôLó ðLð ôMó ðMð ô	Jó ð	Jð ô9ó ð9ð
 ô9ó ð9ð ô4ó ð4ð ôTó ðTð ô(ó ô(r   r'   Ústickyi@  çÍÌÌÌÌÌì?z"tuple[tuple[float, str, int], ...]ÚCREDITS_USAGE_BANDSzcredits.usagei'  zcredits.window_paygúcredits.depletedzcredits.window_limitúcredits.restoredúcredits.grant_spentõ0   âœ• Credit access paused Â· run /topup to top upuy   âœ• Included usage paused Â· your subscription payment failed Â· update your card, or add credits in /topup to keep goingu^   âœ• Included usage paused Â· see Billing in the Portal, or add credits in /topup to keep goingz)You've hit your monthly large-model limitu    Â· auto top-up is onc               ó   € V ^8„  d   QhRR/# )r   r   Údictr   )r   s   "r   r   r   Á   s   € ÷ sñ s˜4ñ sr   c            
     ó*   € R\        4       RRRRRRR/ /# )zzFresh notice latch for :func:`evaluate_credits_notices`; every producer builds it here so a new gate key lands everywhere.ÚactiveÚseen_below_90FÚ
usage_bandNÚseen_grant_unspentÚtexts)Úsetr   r   r   Únew_credits_latchr¬   Á   s#   € à”c“e˜_¨e°\À4ÐI]Ð_dÐfmÐoqÐrÐrr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rx   r.   Únow_msr   r"   r   )r   s   "r   r   r   Æ   s'   € ÷ Tñ T mð T¸]ð TÐVYñ Tr   c                óÐ  € \        V \        4      '       d   V ^ 8:  d   R# Vf&   \        \        P                  ! 4       R,          4      MTpW8:  d   R#  \        P                  ! V R,          4      pY,
          pTR8¼  d'   \        P                  ! RT4       RTP                   2# \        P                  ! TR	8  d   RT4      # RT4      #   \        \
        \        3 d     R# i ; i)
zøLocal-time reset for notices: ``HH:MM`` within 24h, ``Tue HH:MM`` within a week, ``Nov 3`` beyond (the
monthly large-model allowance), ``shortly`` once passed (the server rolls the clock on the next request, so a stale
stamp is never contradicted).zthe next resetiè  Úshortlyz%bÚ z%H:%Mz%a %H:%Mi „$i \&)	rp   r!   rW   Ú	localtimer$   ÚOverflowErrorÚOSErrorÚstrftimeÚtm_mday)rx   r®   ÚnowÚstampÚlefts   &&   r   Úformat_window_resetrº   Æ   sÉ   € ô �l¤C×(Ò(¨L¸AÔ,=ÙØ%+¢^Œ#Œd�iŠi‹k˜DÕ Ô
!¸€CØÔÙð Ü—’˜|¨dÕ2Ó3ˆð Õ€DØÐ#Ô#Ü—-’-  eÓ,Ð-¨Q¨u¯}©}¨oÐ>Ð>Ü�=Š= DÐ+;Ô$;˜ÈUÓSÐSÀÈUÓSÐSøô œ¤wÐ/ô  Úð ús   ÁC ÃC%Ã$C%c               ó    € V ^8„  d   QhRRRR/# )r   rx   r.   r   r"   r   )r   s   "r   r   r   Ù   s   € ÷ {ñ {˜-ð {¨Cñ {r   c                ó\   € \        V \        4      '       d   V ^ 8”  d   R\        V 4       2# R# )u8   `` Â· resets 15:56``; empty when the instant is unknown.u    Â· resets r*   )rp   r!   rº   )rx   s   &r   Ú_resetsr½   Ù   s2   € ä@JÈ<ÔY\×@]Ò@]ÐbnÐqrÔbrˆ[Ô,¨\Ó:Ð;Ð<ÐzÐxzÐzr   c               ó    € V ^8„  d   QhRRRR/# )r   Ústater'   r   ztuple[str, Optional[int]]r   )r   s   "r   r   r   Þ   s   € ÷ Wñ W˜ð WÐ*Cñ Wr   c                óT   € V P                   pVe   \        V4      VP                  3# R# )z`The binding allowance's limit name (``daily``; an unknown id: the server's label) and its reset.)ÚdailyN)r   r   rx   )r¿   rz   s   & r   Ú_spent_windowrÂ   Þ   s+   € à×Ñ€AØ45²MÔ˜QÓ §¡Ð0ÐVÀÐVr   zcredits.window.c               ó    € V ^8„  d   QhRRRR/# )r   Úgauge_idr"   r   r   )r   s   "r   r   r   ë   s   € ÷ 5ñ 5 #ð 5¨#ñ 5r   c                ó   € \         V ,           # )zW``credits.window.<gauge id>``: one key per allowance, so a client replaces it in place.)ÚCREDITS_WINDOW_APPROACH_PREFIX)rÄ   s   &r   Úwindow_approach_keyrÇ   ë   s   € ä)¨HÕ4Ð4r   c               ó    € V ^8„  d   QhRRRR/# )r   rz   r   r   r"   r   )r   s   "r   r   r   ð   s   € ÷ [ñ [˜[ð [¨Sñ [r   c                óœ   € \        ^c\        V P                  ^d,          4      4      pRV R\        V 4       R\	        V P
                  4       2# )u:   ``âš  90% of your weekly limit used Â· resets Thu 09:00``.u   âš  z
% of your z limit used)rr   r!   ro   r   r½   rx   )rz   Úpcts   & r   Ú_window_approach_textrË   ð   sF   € ä
ˆb”#�a—o‘o¨Õ+Ó,Ó
-€CØ�#��jÔ!1°!Ó!4Ð 5°[ÄÈÏÉÓAXÐ@YÐZÐZr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¿   r'   Úmodel_is_top_tierrE   r   re   r   )r   s   "r   r   r   ö   s"   € ÷ ñ �|ð ¸>ð ÐNcñ r   c               ó  € V P                   '       g   R# ^ RIHp V P                  ;'       d    V P                  RJ pT! RV P
                  RT;'       d    VRJR7      pVf'   V'       d   V P                  '       d   V P                  # V# )aÐ  The full allowance behind the limit line, by :func:`agent.plan_limits.blocking_gauge` (the rule
``limit_hit`` reads, so the line, the retry time and the card agree). A full top-tier allowance counts only on
a refusal: the API stamps ``spend-source`` on every admitted request and never on a 402, so header-sourced
+ no source = this model was refused; an ``included`` source means the model is not top-tier and a seed
cannot know the model. A refusal no all-scope allowance explains is the top-tier one (a cold catalog).
``model_is_top_tier=None`` (tier unknown) counts the top-tier allowance as one that may stop the model, so
of several full ones the later reset wins and no retry is promised before the model can run.N)Úblocking_gauger*   F)ÚfreeÚtop_tier)ra   Úagent.plan_limitsrÏ   r?   rA   r@   r’   r   )r¿   rÍ   rÏ   Úrefusedrz   s   &$   r   Ú_stop_gaugerÔ   ö   sz   € ð × × Ð ÙÝ0Ø×Ñ×>Ð> E×$6Ñ$6¸$Ð$>€GÙ�r˜5Ÿ<™<¨e¸g×>hÐ>hÐJ[ÐchÐJhÔi€AØ‚y—W ×!9×!9Ð!9Ø×#Ñ#Ð#Ø€Hr   rÍ   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r¿   r'   Úmodel_is_freer   rÍ   rE   r   r0   r   )r   s   "r   r   r     s0   € ÷ cñ c˜\ð c¸Tð cÐVdð cÐq~ñ cr   c               ó²  € V P                   pV P                  '       d/   V^ 8:  d(   \        V P                  4      '       d   \        # \        # V P
                  '       g   V'       d   R# \        # V'       g   V P                  '       d   R# V P                  '       d   R# ^ RI	H
p \        V! V P                  V4      ,          p\        WR7      pVf   R# VP                  \        8X  dI   V P                   '       d   V\"        8X  d   \$        MRpR\&         \)        VP*                  4       RV V 2# R\-        V4       R\)        VP*                  4       RV 2# )	aö  Blocking copy for a usage-window account, or None. ``paid_access`` is the portal's word (dunning);
then: payment paused with no credits (credits keep a paused plan going whatever the setting says; a
card update restores included usage), the large-model allowance used with no pay path, the window used with no
pay path. A free model keeps inferencing, so only the payment-paused line survives it.
The credits step comes from :func:`agent.plan_limits.credits_action`, the rule every limit surface reads.N)Úcredits_action©rÍ   r*   u   âœ• u    Â· u   âœ• You've hit your ú limit)r3   rC   r   Ú_PAUSED_TEXTÚ_PAUSED_OTHER_TEXTr9   Ú_DEPLETED_TEXTrM   rB   rÒ   rØ   Ú_CREDITS_STEPrF   rÔ   Úscoper
   rD   Ú_ADD_CREDITS_ACTIONÚ_AUTO_TOP_UP_SUFFIXÚ_TOP_TIER_LIMITr½   rx   r   )r¿   rÖ   rÍ   Ú	purchasedrØ   Úactionrz   Úautos   &$$     r   Ú_window_hard_stopræ     s  € ð ×&Ñ&€IØ××Ð˜y¨Aœ~Ü1°%×2EÑ2E×FÒFŒ|Ð^ÔL^Ð^Ø××Ðß$ˆtÐ8¬.Ð8ß˜×)×)Ð)ÙØ‡‡€ÙÝ0Ü™>¨%×*EÑ*EÀyÓQÕR€FÜ�EÔ?€AØ‚yÙØ‡w�w”.Ô Ø&+×&?×&?Ð&?ÀFÔNaÔDaÕ"ÐgiˆØ”oÐ&¤w¨q¯~©~Ó'>Ð&?¸tÀFÀ8ÈDÈ6ÐRÐRØ!Ô"2°1Ó"5Ð!6°f¼WÀQÇ^Á^Ó=TÐ<UÐUYÐZ`ÐYaÐbÐbr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¿   r'   rÍ   rE   r   r.   r   )r   s   "r   r   r   "  s"   € ÷ 5ñ 5 Lð 5Èð 5Ðcpñ 5r   c               óf   € V P                   '       d   R# \        WR7      pVe   VP                  # R# )z[When the allowance behind :func:`_window_hard_stop`'s limit line frees up (the same gauge).NrÙ   )rB   rÔ   rx   )r¿   rÍ   rz   s   &$ r   Úwindow_stop_resets_at_msré   "  s+   € à‡‡€ÙÜ�EÔ?€AØš]ˆ1�>‰>Ð4°Ð4r   z/topup to add creditsÚuse_creditszturn on Keep going in /topupÚadd_creditsÚadd_credits_and_keep_goingz,add credits and turn on Keep going in /topupc               ó    € V ^8„  d   QhRRRR/# )r   r¿   r'   r   r0   r   )r   s   "r   r   r   3  s   € ÷ Mñ M˜\ð M¨mñ Mr   c                ób  € V P                   R8X  d   V P                  ^ 8”  g   R# V P                  '       d!   \        V 4      w  rRV R\	        V4       R2pM4V P
                  '       d!   R\         \	        V P                  4       R2pMRpY0P                  '       d   \        ,           # R	,           # )
zfThe one-shot PAYG line: the last request drew on top-up credits instead of the window. None otherwise.r   Nu   â€¢ You've hit your rÚ   u    Â· now using creditsu   â€¢ u     Â· large models now use creditsu   â€¢ Now using creditsr*   )
rA   r3   rŽ   rÂ   r½   r’   râ   r   rD   rá   )r¿   ÚnameÚresetsÚtexts   &   r   Ú_window_payg_textrò   3  s    € à×Ñ &Ô(¨U×-CÑ-CÀaÔ-GÙØ××ÐÜ$ UÓ+‰ˆØ% d V¨6´'¸&³/Ð1BÐBWÐX‰Ø	×	!×	!Ð	!Ø”oÐ&¤w¨u×/JÑ/JÓ'KÐ&LÐLlÐm‰à&ˆØ×*C×*CÐ*CÔ&ÕLÐLÈÕLÐLr   c               ó4   € V ^8„  d   QhRRRRRRRRRR	R
R	RR/# )r   Úkeyr"   rñ   r0   ÚlevelÚlatchr¤   Úto_showÚlistÚto_clearr   ÚNoner   )r   s   "r   r   r   A  s@   € ÷ ñ ˜3ð  mð ¸Cð Èð ÐW[ð Ðgkð Ðptñ r   c                ó�  € VR,          VP                  R/ 4      rvVef   W9  g   VP                  V 4      V8w  dJ   W9   d   VP                  V 4       VP                  \        WV 4      4       VP	                  V 4       WV &   R# Vf?   W9   d7   VP                  V 4       VP                  V 4       VP                  V R4       R# R# R# )zaShow / replace / clear one sticky line by key: a text change re-emits (clear first), None clears.r¦   rª   N)Ú
setdefaultÚgetÚappendÚ_sticky_noticeÚaddÚdiscardÚpop)rô   rñ   rõ   rö   r÷   rù   r¦   rª   s   &&&&&&  r   Ú_reconcile_stickyr  A  s    € à˜(•O U×%5Ñ%5°g¸rÓ%BˆEØÒ˜SÔ.°%·)±)¸C³.ÀDÔ2HØŒ=Ø�O‰O˜CÔ Ø�‰”~ d°3Ó7Ô8Ø�
‰
�3ŒØˆc‹
Ø	Š˜#œ-Ø�‰˜ÔØ�‰�sÔØ�	‰	�#�tÖñ (‰r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r¿   r'   rö   r¤   rÖ   r   rÍ   r   ztuple[list, list]r   )r   s   "r   r   r   P  s2   € ÷ &ñ & Lð &¸ð &ÐQUð &Ø04ð&ØARñ&r   c               óÚ  € . p. pVR,          pVP                  R/ 4      p\        V9   d   \        \        RRWV4       RVR&   V P                   Fé  pV'       * ;'       d    VP                  \
        8g  ;'       g    Tp	V	'       g   K9  VP                  '       d   KM  VP                  \        8¼  g   Kd  VP                  VP                  4      VP                  8w  g   K�  VP                  WxP                  &   \        VP                  4      p
VP                  \        \        V4      RR\         WªR7      4       Kë  	  \"        V9   d+   VP                  \"        4       VP%                  \"        4       \'        WVR	7      pVRJ;'       d    V\(        \*        \,        39  p\.        V9   ;'       g
    \0        V9   p\        \0        V'       d   TMRR
WV4       \        \.        V'       d   RMTR
WV4       V'       dK   VfG   V P2                  '       d5   V'       g-   VP                  \        RRR\4        \6        \6        R7      4       \        \8        V'       d   RM
\;        V 4      RWV4       WE3# )a÷  Notice policy for a usage-window account (see :func:`evaluate_credits_notices` for the contract).

Approach: each allowance warns once at 90% per reset (``credits.window.<id>``, a TTL heads-up; the
limit line takes over when it runs out). The top-tier allowance warns only while the session is on a
top-tier model (no other model moves it); a free model warns about nothing. grant_spent never fires (no
grant); a payment pause / depleted account reuses ``credits.depleted`` and its ``credits.restored``.r¦   Úwindow_warnedNÚinfor¨   ÚwarnÚttl©rñ   rõ   ÚkindÚttl_msrô   Úid©rÖ   rÍ   Úerrorõ   âœ“ Credit access restoredÚsuccess)rü   ÚCREDITS_USAGE_KEYr  r@   rß   r
   r‰   ro   ÚWINDOW_APPROACH_FRACTIONrý   r  rx   rÇ   rþ   ÚAgentNoticerË   ÚWINDOW_APPROACH_TTL_MSÚCREDITS_GRANT_SPENT_KEYr  ræ   rÛ   rÜ   rÝ   ÚCREDITS_DEPLETED_KEYÚCREDITS_WINDOW_LIMIT_KEYr9   ÚCREDITS_RESTORED_TTL_MSÚCREDITS_RESTORED_KEYÚCREDITS_WINDOW_PAYG_KEYrò   )r¿   rö   rÖ   rÍ   r÷   rù   r¦   Úwarnedrz   Úrelevantrô   ÚstopÚlimitÚwas_stoppeds   &&$$          r   Ú_evaluate_window_noticesr!  P  së  € ð €GØ€HØ�8�_€FØ×#Ñ# O°RÓ8€FÜ˜FÔ"ÜÔ+¨T°6¸5È8ÔTØ"ˆˆlÑØ�\Œ\ˆØ$Ô$×YÐY¨!¯'©'´^Ñ*C×*XÐ*XÐGXˆß‰8˜AŸFŸFšF q§¡Ô:RÖ'RØ—J‘J˜qŸt™tÓ$¨¯©Ö6àŸ>™>ˆF—4‘4‰LÜ% a§d¡dÓ+ˆCØ�N‰Nœ;Ô,AÀ!Ó,DÈFÐY^Ü.DÈ#ôWö Xñ ô  &Ô(Ø�‰Ô/Ô0Ø�‰Ô.Ô/ä˜UÐSdÔe€DØ˜Ð×_Ð_ ¬lÔ<NÔP^Ð-_Ñ!_€EÜ&¨&Ñ0×VÐVÔ4LÐPVÑ4V€KÜÔ.¿±À4ÈÐRWÐbjÔkÜÔ*·E©D¸tÀWÈeÐ^fÔgß�t’|¨×(9×(9Ð(9Ç-à�‰”{Ð(DÈIÐ\aÜ*AÔG[Ô`tôvô 	wäÔ-·t©tÔARÐSXÓAYÐ[aÐchÐs{Ô|ØÐÐr   c                  ól   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   R	tR
]R&   R	t	R]R&   R	t
R]R&   RtR	# )r  iy  zÜDriver-agnostic out-of-band notice (``AIAgent.notice_callback`` / ``notice_clear_callback``); each driver
renders its own way. ``kind``/``ttl_ms`` stay expressive so a future config can switch v1's sticky notices to TTL.r"   rñ   r  rõ   rœ   r  Nr.   r  r0   rô   r  r   )r”   r•   r–   r—   r˜   r™   rõ   r  r  rô   r  r›   r   r   r   r  r  y  sA   ‡ ñzð ƒIØ€Eˆ3ÓØ€Dˆ#ÓØ €FˆMÓ Ø€CˆÓØ€Bˆ×r   r  c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rñ   r"   rõ   rô   r   r  r   )r   s   "r   r   r   †  s.   € ÷ Zñ Z˜ð Z Sð Z¨sð Z°{ñ Zr   c                ó&   € \        W\        W"R 7      # ))rñ   rõ   r  rô   r  )r  ÚCREDITS_NOTICE_KIND)rñ   rõ   rô   s   &&&r   rÿ   rÿ   †  s   € Ü˜DÔ4GÈSÔYÐYr   c               ó    € V ^8„  d   QhRRRR/# )r   Úbase_urlr"   r   r   r   )r   s   "r   r   r   Š  s   € ÷ +ñ + Sð +¨Tñ +r   c                óD   €  ^ RI Hp T! T 4      #   \         d     R# i ; i)a)  True when *base_url* is the Nous welcome host, which serves only the free tier. Local data only;
False wherever the free tier is not built in. The host is the evidence, not the model name: the paid
inference host can serve ``nous/welcome`` to a named account, and that account's depletion is real.)Úroute_is_welcome_hostF)Úhermes_cli.anon_authr)  ÚImportError)r'  r)  s   & r   Ú_is_nous_welcome_router,  Š  s+   € ðÝ>ñ ! Ó*Ð*øô ô Úðús   ‚ �žc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úmodelr"   r'  r   r   r   )r   s   "r   r   r   •  s!   € ÷ ñ ˜cð ¨Sð ¸$ñ r   c                ó4  € V '       g   R# V P                  R4      '       g   V P                  R4      '       d   R# V'       g   R# \        V4      '       d   R#  ^ RIHp ^ RIHp V! V4      p\        V4      ;'       d	    V! W4      #   \         d     R# i ; i)u   True when *model* is a Nous free-tier model, using ONLY local data: (1) ``:free`` suffix â€” canonical
Nous free SKU marker; (2) ``stealth/`` prefix â€” stealth-preview SKUs are free without the suffix
(naming-convention trust: a PAID ``stealth/`` model would wrongly suppress the banner); (3) a PEEK into
``hermes_cli.models``' pricing cache (filled by the model picker; a miss never fetches). Fail-open to
False (depleted notice still shows): a wrong warning is recoverable noise; hiding it masks a real block.Fz:freezstealth/T)Ú_is_model_free)Úpeek_cached_pricing)	ÚendswithÚ
startswithr,  Úhermes_cli.modelsr0  Úhermes_cli.models_pricingr1  r   Ú	Exception)r.  r'  r0  r1  Úpricings   &&   r   Úis_free_tier_modelr8  •  s€   € ÷ ÙØ‡~�~�g×Ò %×"2Ñ"2°:×">Ò">ÙßÙô ˜h×'Ò'ÙðÝ4ÝAá% hÓ/ˆÜ�G‹}×?Ð?¡°Ó!?Ð?øÜô Úðús   Á%B Á?B ÂBÂBrÖ   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r¿   r'   rö   r¤   rÖ   r   rÍ   r   z#tuple[list[AgentNotice], list[str]]r   )r   s   "r   r   r   °  s9   € ÷ Uñ U Lð U¸ð UÐQUð UØ04ðUØAdñUr   c               óº  a€ V P                   '       d   \        WVVR7      # . p. pV P                  VR,          uop\        \        3 FO  pWv9   g   K  VP                  V4       VP                  V4       VP                  R/ 4      P                  VR4       KQ  	  Se   S\        ^ ,          ^ ,          8  d   RVR&   Se"   SR8  d   V P                  \        8¼  d   RVR&   RpSe5   V P                  ^ 8:  d$   \        V3R	 l\        \        4       4       R4      pV'       d   VR,          '       d
   V^,          MRp	W‘P                  R
4      8w  dò   \        V9   d+   VP                  \        4       VP                  \        4       V	eµ   V^,          p
V P                   ;'       g    ^ pV'       d0   \#        ^ \%        W»V P                  ,
          4      4      R,          R MRpV
R8X  d   RMR RT RV P&                  ;'       g    R R2pVP                  \)        WÚ\        4      4       VP+                  \        4       W‘R
&   V P,                  R8H  ;'       d)    SRJ;'       d    SR8¬  ;'       d    V P                  ^ 8„  pV'       da   RV9  dZ   VP                  RR4      '       dB   VP                  \)        RV P.                   R2RR4      4       VP+                  R4       RVR&   M1RV9   d+   V'       g#   VP                  R4       VP                  R4       V P0                  '       * pT;'       d    V'       * pV'       d8   RV9  d1   VP                  \)        RRR4      4       VP+                  R4       WE3# RV9   dW   V'       gO   VP                  R4       VP                  R4       V'       g%   VP                  \3        RRR\4        R R R!7      4       WE3# )"u  Reconcile credits notices against the latch (see :func:`new_credits_latch`); mutates ``latch`` IN
PLACE. Pure â€” no I/O, no agent/run_agent imports. ``model_is_free`` suppresses ``credits.depleted`` (a
depleted account on a free model keeps inferencing) WITHOUT emitting "restored" â€” that fires only on a
genuine ``paid_access`` flip back to True. Returns ``(to_show, to_clear)``; caller emits to_clear FIRST.
A usage-window state (day/week percents, no grant) takes the window policy; everything else is unchanged.r  r¦   rª   NTr§   rn   r©   c              3  óH   <"  € T F  pSV^ ,          8¼  g   K  Vx € K  	  R# 5i)rQ   Nr   )rŠ   ÚbÚufs   & €r   r‹   Ú+evaluate_credits_notices.<locals>.<genexpr>Ô  s    øé € ÐTÑ(E 1ÈÈqÐQRÍtÉŸQšQÓ(Eùs   ƒ"˜
"r¨   é@B ú.2fÚ?r  u   âš u   â€¢z You've used $z
 of your $z capÚsubscription_capr¡   Fu   â€¢ Grant spent Â· $z top-up leftr  rŸ   r¢   r  r  r  r	  r    r
  )ra   r!  ro   r  r  rþ   r  rý   r  rž   r,   ÚGRANT_UNSPENT_MIN_MICROSr3   ÚnextÚreversedr  r/   rq   rr   r1   rÿ   r   r8   r4   r9   r  r  )r¿   rö   rÖ   rÍ   r÷   rù   r¦   Ú
window_keyÚcurrent_bandÚtarget_bandrõ   rs   Úused_usdrñ   Ú
grant_condÚdepleted_condÚshow_depletedr=  s   &&$$             @r   Úevaluate_credits_noticesrM  °  s”  ø€ ð ××ÐÜ'¨ÀMØ:KôMð 	Mà!#€GØ€HØ×$Ñ$ e¨H¥o€J€BˆÜ.Ô0HÓIˆ
ØÖØ�O‰O˜JÔ'Ø�N‰N˜:Ô&Ø�I‰I�g˜rÓ"×&Ñ& z°4Ö8ñ	 Jð 
‚~˜"Ô2°1Õ5°aÕ8Ô8Ø!%ˆˆoÑð 
‚~˜"˜sœ( u×'@Ñ'@ÔD\Ô'\Ø&*ˆÐ"Ñ#ð 6:€LØ	‚~˜%×0Ñ0°AÔ5ÜÔT¬Ô1DÔ(EÓTÐVZÓ[ˆ÷ '3°u¸_×7MÔ7M�,˜q–/ÐTX€KØ—i‘i Ó-Ô-Ü Ô&Ø�O‰OÔ-Ô.Ø�N‰NÔ,Ô-ØÒ"ð ! •OˆEØ×1Ñ1×6Ð6°QˆCßadœ#˜a¤ S°×0IÑ0IÕ*IÓ!JÓKÈiÕWÐX[Ñ\ÐjmˆHØ$¨œ‘e°EÐ:¸.ÈÈ
ÐR\Ð]b×]yÑ]y÷  ^Að  ^Að  ~Að  ]Bð  BFð  GˆDØ�N‰Nœ>¨$Ô7HÓIÔJØ�J‰JÔ(Ô)Ø)ˆlÑð 	×ÑÐ"4Ñ4×tÐt¸À4¸×tÐtÈBÐRUÉI×tÐtÐZ_×ZpÑZpÐstÑZtð ÷ Ð+°6Ô9¸e¿i¹iÐH\Ð^c×>dÒ>dØ�‰”~Ð(<¸U×=PÑ=PÐ<QÐQ]Ð&^Ð`fÐh}Ó~ÔØ�
‰
Ð(Ô)Ø&+ˆÐ"Ò#Ø	 &Ô	(·Ø�‰Ð-Ô.Ø�‰Ð,Ô-ð ×)Ñ)Ô)€MØ!×7Ð7¨-Ô&7€MßÐ+°6Ô9Ø�‰”~Ð&XÐZaÐcuÓvÔwØ�
‰
Ð%Ô&ð ÐÐð 
˜vÔ	%¯mØ�‰Ð*Ô+Ø�‰Ð)Ô*ßØ�N‰Nœ;Ø1¸ÈÜ.Ð4FÐK]ôô ð ÐÐr   r3   r4   Tztuple[tuple, ...]Ú_HEADER_FIELDSzx-nous-credits-window-gaugesc               ó    € V ^8„  d   QhRRRR/# )r   Úfieldr"   r   r   )r   s   "r   r   r   #  s   € ÷ hñ h˜ð h ñ hr   c                ót   € R V P                  R4      '       d   RMR,           V P                  RR4      ,           # )zx-nous-Ú
tool_pool_r*   zcredits-Ú_Ú-)r3  Úreplace)rP  s   &r   Ú_header_namerV  #  s4   € Ø˜e×.Ñ.¨|×<Ò<™À*ÕMÐPU×P]ÑP]Ð^aÐcfÓPgÕgÐgr   c               ó    € V ^8„  d   QhRRRR/# )r   ÚloweredúMapping[str, str]r   úOptional[dict[str, Any]]r   )r   s   "r   r   r   '  s   € ÷ ñ Ð"3ð Ð8Pñ r   c                ó   € \        V P                  \        4      4      pVe   \        V4      '       g   R# RV/pV P                  R4      pV\        9   d   TMRVR&   V P                  R4      p\        V\        4      '       d'   VP                  4       '       d   VP                  4       MRVR&   V P                  R4      ;'       g    RP                  4       P                  4       pR	R
RR/P                  V4      VR&   V# )z£Usage-window fields from lowercased headers; None when the gauge list is absent or unreadable.
``spend_source`` outside its vocabulary reads as absent (fail-open).Nr@   zx-nous-credits-spend-sourcerA   z#x-nous-credits-window-paused-reasonrC   z$x-nous-credits-keep-going-on-creditsr*   ÚonTÚoffFrF   )	r   rý   Ú_GAUGES_HEADERr   Ú_VALID_SPEND_SOURCESrp   r"   ÚstripÚlower)rX  r@   ÚoutÚsourceÚpausedÚ
keep_goings   &     r   Ú_parse_window_fieldsrf  '  sÛ   € ô ˜'Ÿ+™+¤nÓ5Ó6€FØ‚~œY v×.Ò.ÙØ# VÐ,€CØ�[‰[Ð6Ó7€FØ$*Ô.BÔ$B™&È€CˆÑØ�[‰[Ð>Ó?€FÜ-7¸Ä×-DÒ-DÈÏÉÏÊ˜6Ÿ<™<œ>Ð]a€CˆÑØ—+‘+ÐDÓE×KÐKÈ×RÑRÓT×ZÑZÓ\€JØ$(¨$°°uÐ#=×#AÑ#AÀ*Ó#M€CÐÑ Ø€Jr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r  r"   Úrawr0   Údefaultr   r   r   )r   s   "r   r   r   7  s.   € ÷ Jñ J�sð J ð J¸ð JÈSñ Jr   c                óV  € Vf   V# V R9   dD   \        V4      pV\        J g   V R8w  d   V^ 8  d   \        # V R8X  d   V\        8”  d   \        # T# V R8X  d$   \        P	                  V4      '       d   V# \        # VP                  4       P                  4       pVR9  d   \        # VR8H  # )ua   One header value â†’ field value; ``default`` when absent, ``_SENTINEL`` on a contract violation.ÚsignedÚbpÚusdÚtrue)Úmicrosrk  rl  )rn  Úfalse)r%   r    r	   Ú_USD_REÚmatchr`  ra  )r  rh  ri  ÚvalÚflags   &&&  r   Ú_parse_fieldru  7  s›   € à
‚{ØˆØÐ)Ô)Ü˜‹nˆØ”)Ó ¨Ô 0°S¸1´WÜÐà  DœL¨S´7¬]ŒyÐCÀÐCØˆu„}Ü—m‘m C×(Ò(ˆsÐ7¬iÐ7Ø�9‰9‹;×ÑÓ€DØÐ$5Ô5Œ9ÐI¸4À6¹>ÐIr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚheadersrY  Úproviderr"   r   úOptional[CreditsState]r   )r   s   "r   r   r   G  s#   € ÷ .ñ .Ð#4ð .Àð .ÐMcñ .r   c                óh  €  \         ;QJ d    R V  4       F  '       g   K   RM	  RM! R V  4       4      '       g   R# V P                  4        UUu/ uF  w  r#VP                  4       VbK  	  ppp\        VP	                  R4      4      pV\
        J d   R# V^8w  d.   V^8”  d%   \        '       g   Rs\        P                  RV4       R# VP	                  RR4      pVR	8H  p/ p\         FG  vršpVP	                  \        V	4      4      pVf   V'       d   V	\        9   d   K8  \        W¬.VO5!  W‰&   KI  	  VP	                  R
4      pVP	                  R4      pVe#   Ve   \        RV4      VR&   \        RV4      VR&   \
        VP                  4       9   g   V\        9  d   R# V'       d#   \        V4      pVf   R# VP!                  V4       VP	                  R4      p\#        RRVRVRVR\$        P$                  ! 4       RR/VB # u uppi   \&         d    \        P)                  RRR7        R# i ; i)av  Parse x-nous-credits-* (and x-nous-tool-pool-*) headers into a CreditsState.
None (miss) on ANY of: no version header; version != 1 (> 1 also warns once);
a required field violating ``_HEADER_FIELDS``; unknown ``denominator_kind``;
any unexpected exception. Fail-open on the subscription_limit pair: a
half-pair (only -micros or only -usd) parses as both-absent (both None).c              3  óF   "  € T F  qP                  4       R 8H  x € K  	  R# 5i)úx-nous-credits-versionN)ra  )rŠ   Úks   & r   r‹   Ú(parse_credits_headers.<locals>.<genexpr>Q  s   é € ÐJÁ'¸Q—7‘7“9Ð 8Ö8Ã'ùs   ‚!TFNr|  uA   credits header version %d unsupported, ignoring â€” update Hermeszx-nous-credits-denominator-kindr7   r`   z(x-nous-credits-subscription-limit-microsz%x-nous-credits-subscription-limit-usdro  r/   rm  r1   zx-nous-credits-disabled-reasonr(   r8   r:   r>   r?   u9   credits â–¸ parse_credits_headers raised (fail-open miss)©Úexc_infor   )r�   Úitemsra  r%   rý   r    r   ÚloggerÚwarningrN  rV  Ú_WINDOW_OPTIONAL_FIELDSru  ÚvaluesÚ_VALID_DENOMINATOR_KINDSrf  Úupdater'   rW   r6  Údebug)rw  rx  r}  ÚvrX  Úversion_valr8   Úwindow_noteÚfieldsrï   r  ri  rh  Úlim_micros_rawÚlim_usd_rawÚwindowr:   s   &&               r   Úparse_credits_headersr�  G  s  € ð'÷ ‹sÑJÁ'ÓJ�s�sŠsÑJÁ'ÓJ×JÒJÙØ,3¯M©M¬OÔ<©O¡D A�1—7‘7“9˜a’<©OˆÑ<Ü §¡Ð,DÓ EÓFˆØœ)Ó#ÙØ˜!ÔØ˜QŒ×'?Ó'?Ø+/Ð(Ü—‘ÐbÐdoÔpÙØ"Ÿ;™;Ð'HÈ&ÓQÐØ&¨.Ñ8ˆØ!#ˆß$2Ð ˆD˜Ø—+‘+œl¨4Ó0Ó1ˆCØŠ{Ÿ{¨tÔ7NÔ/NÙÜ'¨Ð<°GÓ<ˆF‹Lñ	 %3ð
 !Ÿ™Ð%OÓPˆØ—k‘kÐ"IÓJˆØÒ%¨+Ò*AÜ2>¸xÈÓ2XˆFÐ.Ñ/Ü/;¸EÀ;Ó/OˆFÐ+Ñ,Ü˜Ÿ™›Ô'Ð+;ÔC[Ô+[ÙßÜ)¨'Ó2ˆFØŠ~ÙØ�M‰M˜&Ô!Ø!Ÿ+™+Ð&FÓGˆÜñ Q Kð QÐBRð QÐdsð QÜ(,¯	ª	«ðQØAEðQØIOñQð 	Qùó= =øô@ ô Ü�‰ÐPÐ[_ˆÔ`Úðús_   ‚
H �H ¡H ¾H ÁHÁ-'H ÂH Â0H Ã
A	H ÄBH Æ"H Æ*H Æ;A	H ÈH È"H1È0H1c               ó    € V ^8„  d   QhRRRR/# )r   Úhttp_responser   r   r   r   )r   s   "r   r   r   x  s   € ÷ ñ ¨Cð °Dñ r   c                óÖ   €  V e   \        V RR4      MRpV'       g   R# \        V4      pVRJ;'       d    VP                  #   \         d    \        P                  RRR7        R# i ; i)zàTrue iff *http_response* carries complete usage-window ``x-nous-credits-*`` headers (the same
test as ``CreditsState.is_usage_window``). Lets the window-only header captures leave every other
account untouched. Never raises.Nrw  Fz Usage-window header parse failedTr  )Úgetattrr�  ra   r6  r‚  rˆ  )r’  rw  r¿   s   &  r   Úresponse_is_usage_windowr•  x  si   € ðØ=JÒ=V”'˜-¨°DÔ9Ð\`ˆßÙÜ% gÓ.ˆØ˜DÐ ×:Ð: U×%:Ñ%:Ð:øÜô Ü�‰Ð7À$ˆÔGÚðús   ‚A ŸA µA Á"A(Á'A(ÚpaidÚreasonc               ó4   € V ^8„  d   QhRRRRRRRRRRR	RR
R/# )r   Ú	remainingr"   Úsubscriptionr  r0   rã   r–  r   r—  r   r¤   r   )r   s   "r   r   r   Š  sJ   € ÷ 
Eñ 
E˜ð 
E¨3ð 
E°}ð 
EÐXeð 
EØð
EØ+8ð
EØDHñ
Er   c               óÆ   € / pRV 3RV3RV3RV33 F3  w  rxVf   K  \        \        V4      R,          4      VuWg R2&   Wg R2&   K5  	  Ve   RVR	&   WFR
&   Vf   V# / VCRV/C# )zBFixture spec from *_usd strings; micros derived exactly (Decimal).r™  rš  Úsubscription_limitrã   r?  Ú_microsÚ_usdrB  r8   r9   r:   )r!   r   )	r™  rš  r  rã   r–  r—  ÚdrP  rm  s	   &&&&$$   r   Ú_fixturer   Š  s­   € ð €AØ# YÐ/°.À,Ð1OÐRfÐhmÐQnÐq|ð  Hð  qIó  J‰
ˆØŒ?Ü69¼'À#»,ÈÕ:RÓ6SÐUXÐ3ˆA��wÐÑ  ! g¨T NÓ"3ñ Jð ÒØ 2ˆÐ
ÑØ€mÑØ’ˆ1ÐDÐ$D qÐ$DÐ*;¸VÑ$DÐDr   Úhealthyz30.34z18.00z20.00z12.34Ú	sub_50pctz10.00Ú	sub_75pctz5.00Ú	sub_90pctz2.00Úgrant_exhaustedú0.00r\   Úout_of_credits)r–  r—  Údebtz-5.00zdict[str, dict]Ú_DEV_FIXTURESc               ó   € V ^8„  d   QhRR/# ©r   r   ry  r   )r   s   "r   r   r   ¥  s   € ÷ vñ vÐ#9ñ vr   c            	     óŽ  € \         P                  P                  RR4      P                  4       p V '       d/   \	        \         P                  P                  R4      4      '       g   R# \         P
                  P                  V 9   g   RV 9   d?    \        V RRR7      ;_uu_ 4       pVP                  4       P                  4       p RRR4       \        P                  V P                  4       4      ;p'       g   R# \        R/ R	^R
R/VCBRRR\        P                  ! 4       /B #   + '       g   i     Lg; i  \         d     R# i ; i)zÕFixture CreditsState for HERMES_DEV_CREDITS_FIXTURE, or None (unknown name / unset). Prod-leak guard:
applies ONLY when HERMES_DEV_CREDITS is also on, so a stray fixture env var never surfaces fabricated balances.ÚHERMES_DEV_CREDITS_FIXTUREr*   ÚHERMES_DEV_CREDITSNÚ/Úrz	utf-8-sig)Úencodingr(   r4   r¦  r?   Tr>   r   )ÚosÚenvironrý   r`  r   ÚpathÚsepÚopenÚreadr´   r©  ra  r'   rW   )rï   ÚfhÚspecs      r   Údev_fixture_credits_staterº  ¥  sñ   € ô �:‰:�>‰>Ð6¸Ó;×AÑAÓC€Dß”¤r§z¡z§~¡~Ð6JÓ'K×LÒLÙÜ	‡w�w‡{�{�dÔ˜c Tœkð	Ü�d˜C¨+×6Õ6¸"Ø—w‘w“y—‘Ó(�÷ 7ô "×%Ñ% d§j¡j£lÓ3Ð3ˆDÖ3Ùô Ñu˜9 a¨¸&ÐIÀDÐIÑuÐW[ÐuÔim×irÒirÓitÒuÐu÷ 7×6ûäô 	Úð	ús0   ÂD5 Â$D"ÃD5 Ä"D2	Ä-D5 Ä2D5 Ä5EÅEc               ó   € V ^8„  d   QhRR/# r«  r   )r   s   "r   r   r   ¸  s   € ÷ ñ Ð)?ñ r   c                óà  €  \        V RR4      p\        V RR4      pR R lp/ pR F$  w  rVV! \        WR4      4      w  WE R2&   WE R2&   K&  	  \        VRR4      p\        V\        \        34      '       d   V^ 8”  d	   V! V4      MRp\        V R	R4      p	\	        \        V R
R4      4      p
V
e   ^ RuVR&   VR&   Rp\        R/ VBRV^ ,          RV^,          RRR\        P                  ! 4       RV! \        VRR4      4      ^ ,          R\        V	\        4      '       d   T	MRRV
e   R
MV^ ,          e   RMR/BT
;'       g    / B #   \         d    \        P                  RRR7        R# i ; i)uÜ   Map a NousPortalAccountInfo into a header-shaped CreditsState for the seed. Float account dollars â†’
micros plus a DISPLAY *_usd (formatting account floats is allowed; parsing a server *_usd is not). Fail-open â†’ None.Úpaid_service_access_infoNrš  c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[int, str]r   )r   s   "r   r   Ú1_credits_state_from_account.<locals>.__annotate__¿  s   € ÷ 	tñ 	t˜ñ 	tr   c                ój   € \        V \        \        34      '       d   \        V R ,          4      V R 3# R# )r?  r@  )rQ   r*   )rp   r!   r=   Úround)Údollarss   &r   Ú_moneyÚ+_credits_state_from_account.<locals>._money¿  s5   € ÜEOÐPWÔZ]Ô_dÐYe×EfÒEf”E˜' IÕ-Ó.°7¸3°-ÐAÐsÐlsÐsr   r�  rž  Úmonthly_creditsÚpaid_service_accessr`   r¦  r,   r-   r/   r1   r?   Fr>   r2   Úrollover_creditsr9   Tr8   rB  r7   u/   credits â–¸ seed accountâ†’state mapping failedr  ))r™  Útotal_usable_credits)rš  Úsubscription_credits_remaining)rã   Úpurchased_credits_remaining©NNr   )r”  rp   r!   r=   Ú_window_seed_fieldsr'   rW   r   r6  r‚  rˆ  )r  ÚaccÚsubrÃ  rŒ  ÚprefixÚattrÚmonthlyÚcapr–  r�  s   &          r   Ú_credits_state_from_accountrÓ  ¸  s¿  € ðÜ�dÐ6¸Ó=ˆÜ�d˜N¨DÓ1ˆõ	tà!#ˆóK‰LˆFáBHÌÐQTÐ\`ÓIaÓBbÑ?ˆF�X˜WÐ%Ñ&¨°¸¨Ó(?ñKô ˜#Ð0°$Ó7ˆÜ!+¨G´c¼5°\×!BÒ!BÀwÐQRÄ{‰f�WŒoÐXdˆÜ�tÐ2°DÓ9ˆÜ$¤W¨T°>À4Ó%HÓIˆØÒàHIÈ6ÐEˆFÐ(Ñ)¨6Ð2DÑ+EØˆCÜñ 
Øñ
Ø03°Aµð
ØORÐSTÍvð
Øchð
Üvz×vÒvó  wBð
á"¤7¨3Ð0BÀDÓ#IÓJÈ1ÕMð
äcmÐnrÔtx×cyÒcyÑ[_ð  @Dð
ð 06Ò/A™^Ð^aÐbcÕ^dÒ^pÑHZÐv|ñ
ð �|ˆ|˜ñ	
ð 	
øô ô Ü�‰ÐFÐQUˆÔVÚðús   ‚D?E ÅE Å"E-Å,E-c               ó   € V ^8„  d   QhRR/# )r   r   rZ  r   )r   s   "r   r   r   Ø  s   € ÷ ñ Ð7ñ r   c                ó~  a € S f   R# \        S \        4      '       d   S P                  MRV 3R llp\        V! R4      4      pVe   \	        V4      '       g   R# RV/pV! R4      RJ VR&   V! R4      p\        V\
        4      '       d   TMRVR&   V! R4      p\        V\        4      '       d   V'       d   TMRVR&   V# )	uÇ   Portal ``usage_window`` (NousUsageWindowInfo or dict) â†’ CreditsState window fields; None unless it
carries a readable gauge list with an all-scope allowance (same requirement as the header parser).Nc                ó   <€ \        SW4      # rj   )r”  )r}  rŸ  Úuws   &&€r   Ú<lambda>Ú%_window_seed_fields.<locals>.<lambda>Ý  s   ø€ ÄÈÈQÔARr   r@   rD   TrF   rC   rj   )rp   r¤   rý   r   r   r   r"   )r×  rý   r@   rb  re  rd  s   f     r   rÌ  rÌ  Ø  s³   ø€ ð 
‚zÙÜ˜r¤4×(Ò(ˆ"�&Š&Ö/R€CÜ™#˜h›-Ó(€FØ‚~œY v×.Ò.ÙØ# VÐ,€CÙ!$Ð%:Ó!;¸tÐ!C€CÐÑÙÐ,Ó-€JÜ1;¸JÌ×1MÒ1M¡:ÐSW€CÐÑ Ù�Ó!€FÜ%/°¼×%<Ò%<Ç™6ÈT€CˆÑØ€Jr   r¤   Ú_seen_usage_bandsiô  c               ó   € V ^8„  d   QhRR/# ©r   r   rú   r   )r   s   "r   r   r   ð  s   € ÷ =ñ =¨dñ =r   c                óâ   € V '       g   R# \         P                  V R4       V\         V &   \        \         4      \        8”  d.   \         P                  \	        \        \         4      4      4       R# R# )u™  Remember the usage band last evaluated for ``session_id`` (process-lifetime).

Desktop reap/resume rebuilds the AIAgent per turn, so the in-memory ``_credits_latch``
(and its ``usage_band``) never survives across messages â€” every rebuild re-announces the
current band as a fresh crossing (#101578). ``agent.session_id`` IS stable across those
rebuilds, so this map lets ``_hydrate_seed_state`` restore the band the user already saw.
Deliberately NOT durable: a real process restart is a real ``session open`` and the
cold-start seed should still warn immediately. Bounded (MRU eviction) so a long-lived
gateway juggling many sessions cannot grow it without limit.N)rÚ  r  ÚlenÚ_SEEN_USAGE_BANDS_MAXrD  Úiter)Ú
session_idÚbands   &&r   Ú_remember_shown_bandrã  ð  sR   € ÷ ÙÜ×Ñ˜* dÔ+Ø$(Ô�jÑ!Ü
ÔÓÔ 5Ô5Ü×Ñœd¤4Ô(9Ó#:Ó;Ö<ñ 6r   Ú_seen_window_noticesc               ó    € V ^8„  d   QhRRRR/# ©r   rö   r¤   r   rú   r   )r   s   "r   r   r     s   € ÷ Dñ D¨dð D°tñ Dr   c                óî  €  V '       d   VP                  R4      '       d   R# RVR&   \        P                  V 4      pV'       g   R# VP                  R/ 4      pVR,          P                  4        F0  w  rEWAR,          9  g   K  VR,          P	                  V4       WSV&   K2  	  VP                  R/ 4      P                  VR,          4       R#   \         d    \        P                  RRR	7        R# i ; i)
zXLoad what this session already showed into a fresh latch (once per latch). Never raises.Úwindow_restoredNTrª   r¦   r  r  zwindow notice restore failedr  )	rý   rä  rü   r�  r   r‡  r6  r‚  rˆ  )rá  rö   Úsavedrª   rô   rñ   s   &&    r   Úrestore_window_noticesrê    sÏ   € ðDß˜UŸY™YÐ'8×9Ò9ÙØ#'ˆÐÑ Ü$×(Ñ(¨Ó4ˆßÙØ× Ñ  ¨"Ó-ˆØ˜w�×-Ñ-Ö/‰IˆCØ �/Ö)Ø�h•×#Ñ# CÔ(Ø!�c“
ñ 0ð 	×Ñ˜¨"Ó-×4Ñ4°U¸8µ_ÖEøÜô DÜ�‰Ð3¸dˆ×CðDús(   ‚C ŠC £!C Á8C ÂAC Ã"C4Ã3C4c               ó    € V ^8„  d   QhRRRR/# )r   Úenabledr   r   rú   r   )r   s   "r   r   r     s   € ÷ Kñ K¨Dð K°Tñ Kr   c                ó4  a€  ^ RI Hp \        V RR4      pVe   VP                  '       g   R# T! W1R7      V n        \        V 4       ^ RIHp ^ RIH	o V! V3R lRR	7      P                  4        R#   \         d    \        P                  R
RR7        R# i ; i)a   The user just changed "Keep going on credits": the agent's state takes the new value now (the next
reply's headers confirm it) and the notice policy re-runs, so a "turn on Keep going" line clears at once.
The account snapshot the pickers read is refreshed in the background. Never raises.)rU  Ú_credits_stateN)rF   ©Úspawn_context_thread©Úget_nous_portal_account_infoc                 ó   <€ S ! R R7      # )T©Úforce_freshr   rñ  s   €r   rØ  Ú)apply_keep_going_change.<locals>.<lambda>(  s   ø€ Ñ%AÈdÕ%Sr   zkeep-going-refresh©rï   u#   keep going â–¸ local refresh failedTr  )ÚdataclassesrU  r”  ra   rî  Ú_rerun_notice_policyÚagent.memory_providerrð  Úhermes_cli.nous_accountrò  Ústartr6  r‚  rˆ  )Úagentrì  rU  r¿   rð  rò  s   &&   @r   Úapply_keep_going_changerþ    s€   ø€ ðKÝ'Ü˜Ð/°Ó6ˆØŠ= × 5× 5Ð 5ÙÙ& uÔLˆÔÜ˜UÔ#Ý>ÝHÙÔSÐZnÔo×uÑuÖwøÜô KÜ�‰Ð:ÀTˆ×JðKús   ƒ(A1 ®AA1 Á1"BÂBc               ó   € V ^8„  d   QhRR/# rÜ  r   )r   s   "r   r   r   -  s   € ÷ /ñ /¨ñ /r   c                ó2   € \         P                  V R4       R# )zNThe session is no longer on a window plan: drop its saved lines. Never raises.N)rä  r  )rá  s   &r   Úforget_window_noticesr  -  s   € ä×Ñ˜Z¨Ö.r   c               ó    € V ^8„  d   QhRRRR/# ræ  r   )r   s   "r   r   r   2  s   € ÷ Eñ E¨tð E¸ñ Er   c           	     ó  €  V '       g   R# VP                  R/ 4      pR\         Uu/ uF#  q3VR,          9   g   K  W29   g   K  W2V,          bK%  	  upR\        VP                  R/ 4      4      /p\        P	                  V R4       V\        V &   \        \        4      \        8”  d.   \        P	                  \        \        \        4      4      4       R# R# u upi   \         d    \        P                  RRR7        R# i ; i)	z_Record the window notices this session shows now (process lifetime, bounded MRU). Never raises.Nrª   r¦   r  r  zwindow notice remember failedTr  )rý   Ú_WINDOW_NOTICE_KEYSr¤   rä  r  rÞ  rß  rD  rà  r6  r‚  rˆ  )rá  rö   rª   r}  Úentrys   &&   r   Úremember_window_noticesr  2  sÞ   € ðEßÙØ—	‘	˜' 2Ó&ˆØÕ0CÓkÑ0C¨1ÈEÐRZÍOÑG[œ;Ð`aÑ`jœ;˜1 A�hš;Ñ0CÑkØœ4 §	¡	¨/¸2Ó >Ó?ðAˆä× Ñ  ¨TÔ2Ø+0Ô˜ZÑ(ÜÔ#Ó$Ô'<Ô<Ü ×$Ñ$¤T¬$Ô/CÓ*DÓ%EÖFñ =ùò	 løô ô EÜ�‰Ð4¸tˆ×DðEús3   ‚C ŒC §C»CÁCÁBC ÃC Ã"D Ã?D c               ó   € V ^8„  d   QhRR/# rÜ  r   )r   s   "r   r   r   B  s   € ÷  ñ  ¨ñ  r   c                ó\  € Wn         \        V RR4      f   VP                  V n        \        V RR4      p\	        V\
        4      '       dX   VP                  eJ   RVR&   \        P                  \        V RR4      4      pVe!   W2R&   VR,          P                  \        4       \        V 4       R# )	zÇInstall a seed CreditsState on the agent and fire the notice policy once. Primes the crossing gate:
the cold-start snapshot IS the first observation, so a session opening in a band warns immediately.Ú_credits_session_start_microsNÚ_credits_latchTr§   rá  r¨   r¦   )rî  r”  r)   r	  rp   r¤   ro   rÚ  rý   r   r  rù  )rý  r¿   rö   Ú
prior_bands   &&  r   Ú_hydrate_seed_stater  B  s�   € ð !ÔÜˆuÐ5°tÓ<ÒDØ.3×.DÑ.DˆÔ+Ü�EÐ+¨TÓ2€EÜ�%œ×Ò 5×#6Ñ#6Ò#BØ!%ˆˆoÑô '×*Ñ*¬7°5¸,ÈÓ+MÓNˆ
ØÒ!Ø",�,ÑØ�(�O×ÑÔ 1Ô2Ü˜Ör   c               ó   € V ^8„  d   QhRR/# rÜ  r   )r   s   "r   r   r   T  s   € ÷ ñ  4ñ r   c                óT   € \        \        V R R4      ;p4      '       d
   V! 4        R# R# )Ú_emit_credits_noticesN)Úcallabler”  )rý  Úemits   & r   rù  rù  T  s'   € Üœ Ð'>ÀÓEÐE�×FÒFÙŽñ Gr   c               ó   € V ^8„  d   QhRR/# rÜ  r   )r   s   "r   r   r   Y  s   € ÷ 
Lñ 
L $ñ 
Lr   c                 óv   €  ^ RI Hp  V ! R4       R#   \         d    \        P	                  RRR7        R# i ; i)u_  Fill the in-process Nous pricing catalog so :func:`is_free_tier_model`'s peek can answer.
The peek never fetches and nothing else warms it during session start, so a cold process reads
an EMPTY catalog and a subscription-billed model â€” which spends no credits â€” still draws the
depleted banner. Fail-open: a miss leaves the peek exactly as it was.©Úget_pricing_for_providerÚnousu$   credits â–¸ nous pricing warm failedTr  N)r5  r  r6  r‚  rˆ  r  s    r   Ú_warm_nous_pricing_cacher  Y  s5   € ð
LÝFá  Ö(øÜô LÜ�‰Ð;Àdˆ×KðLús   ‚ ’"8·8c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   r   f  s   € ÷ ñ °Dñ r   c                ó|  a € \        S RR4      ;'       g    Rp\        S RR4      R8w  g	   V'       g   R# ^ RIHpHp V! V4      '       g   V! V4      '       d   R# \        S RR4      pVe   VP	                  4       '       d   R# R	 V 3R
 llp^ RIHp V! VRR7      S n        S P                  P                  4        R# )u�  Depleted account, model the peek cannot vouch for, Nous catalog cold: start a background warm
whose completion re-runs the policy and return True so the caller defers the depleted decision
to it â€” the session-start warm is one-shot but the catalog expires after
``_NOUS_CATALOG_TTL_SECONDS``, and a cold peek would bring the banner back for a
subscription-billed model. False = decide now: peek warm, not on Nous, a warm in flight (the
warm's own re-run included â€” fail-open, a failed fetch leaves the peek cold and the banner
shows), or a fetch already failed and the cache is still refusing to dial. May raise; the notice
path that calls it catches.r'  r*   rx  r  F)r1  Úpricing_fetch_suppressedÚ_credits_pricing_warmNc               ó   € V ^8„  d   QhRR/# rÜ  r   )r   s   "r   r   Ú;rewarm_pricing_before_depleted_notice.<locals>.__annotate__z  s   € ÷ $ñ $˜dñ $r   c                 ó2   <€ \        4        \        S 4       R # rj   )r  rù  )rý  s   €r   Ú_warm_then_rerunÚ?rewarm_pricing_before_depleted_notice.<locals>._warm_then_rerunz  s   ø€ Ü Ô"Ü˜UÖ#r   rï  zcredits-pricing-warmr÷  T)	r”  r5  r1  r  Úis_aliverú  rð  r  rü  )rý  r'  r1  r  Úinflightr  rð  s   f      r   Ú%rewarm_pricing_before_depleted_noticer#  f  s¨   ø€ ô �u˜j¨"Ó-×3Ð3°€HÜˆu�j "Ó%¨Ô/·xÙßWá˜8×$Ò$Ñ(@À×(JÒ(JÙÜ�uÐ5°tÓ<€HØÒ × 1Ñ 1× 3Ò 3Ù÷$ð $õ ;á"6Ð7GÐNdÔ"e€EÔØ	×Ñ×%Ñ%Ô'Ùr   c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   r   …  s   € ÷ 'ñ '¨Dñ 'r   c                óP  a €  \        S RR4      R8w  g   \        S RR4      e   R#  \        4       pVe   \        S V4       R# R V 3R	 llp^ R
IHp V! VRR7      P                  4        R#   \         d    Rp LJi ; i  \         d    \        P                  RRR7        R# i ; i)a-  Hydrate agent._credits_state from the portal account (or a dev fixture) and fire the notice policy so
warnings show at session OPEN (TUI/desktop "ready" and plain-CLI first-turn setup). Idempotent once a seed
or real header populated _credits_state. Returns True iff it seeded this call. Never raises.rx  r*   r  rî  NFTc               ó   € V ^8„  d   QhRR/# rÜ  r   )r   s   "r   r   Ú3seed_credits_at_session_start.<locals>.__annotate__”  s   € ÷ 	bñ 	b˜$ñ 	br   c                 ó   <€  ^ RI Hp  \        4        V ! RR7      p\        SRR4      e   \	        S4       R# \        V4      ;pe   \        SV4       R# R#   \         d    \        P                  RRR7        R# i ; i)rQ   rñ  Trô  rî  Nu2   credits â–¸ session-start seed (background) failedr  )
rû  rò  r  r”  rù  rÓ  r  r6  r‚  rˆ  )rò  r  r¿   rý  s      €r   Ú_bg_seedÚ/seed_credits_at_session_start.<locals>._bg_seed”  s~   ø€ ðbÝPô )Ô*Ù3ÀÔE�Ü˜5Ð"2°DÓ9ÒEô )¨Ô/ÙÜ8¸Ó>Ð>�EÒKÜ'¨¨uÖ5ñ Løäô bÜ—‘ÐQÐ\`�×aðbús   ƒ3A ¸A Á"A=Á<A=rï  zcredits-seedr÷  u1   credits â–¸ session-start seed failed (fail-open)r  )	r”  rº  r6  r  rú  rð  rü  r‚  rˆ  )rý  Úfixturer)  rð  s   f   r   Úseed_credits_at_session_startr,  …  s°   ø€ ð#Ü�5˜* bÓ)¨VÔ3´w¸uÐFVÐX\Ó7]Ò7iÙð	Ü/Ó1ˆGð ÒÜ  wÔ/Ù÷	bð 	bõ$ 	?á˜X¨NÔ;×AÑAÔCÙøô7 ô 	ØŠGð	ûô8 ô Ü�‰ÐHÐSWˆÔXÚðús9   ƒ!A? §
A, ±A? Á'A? Á,A<Á9A? Á;A<Á<A? Á?"B%Â$B%>   r7   r`   rB  ))g      à?r  é2   )g      è?r  éK   )r�   r  éZ   rj   )r*   ))r)   ro  )r,   rk  )r2   ro  )r3   ro  )r;   ro  )r5   ro  rQ   )r+   rm  )r-   rm  )r4   rm  )r9   r   T)r6   r   F>   r;   r+   r2   r)   r-   r,   rË  )lÚ__conditional_annotations__r˜   Ú
__future__r   Úloggingr²  ÚreÚ	threadingrW   rø  r   Údecimalr   Útypingr   r   r   Úutilsr   Úagent.usage_gaugesr	   r
   r   r   r   r   r   r   r   Ú	getLoggerr”   r‚  r   r™   Ú	frozensetr†  Úcompilerq  Úobjectr    r_  r%   r'   r%  r  rž   r  rC  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  r!  r  rÿ   r,  r8  rM  rN  Ú_GRANT_ONLY_FIELDSr„  r^  rV  rf  ru  r�  r•  r   r©  rº  rÓ  rÌ  rÚ  rß  rã  r  rä  rê  rþ  r  r  r  rù  r  r#  r,  )r0  s   @r   Ú<module>r>     sg  øðô>õ #ã Û 	Û 	Û Û Ý !Ý ß )Ñ )å !÷
÷ 
õ 
ð 
×	Ò	˜8Ó	$€à!&Ð ˜$Ó &Ù$Ò%QÓRÐ Ø
�*Š*Ð&Ó
'€Ù‹H€	ñ ! *¨fÐ!5Ó6Ð õð ÷g(ð g(ó ðg(ðX Ð ØÐ ð ;wÐ Ð7Ó vØ#Ð ð
 "Ð ð 0Ð Ø)Ð ð 2Ð Ø)Ð Ø/Ð ØC€ð K€ØuÐ Ø=€Ø-Ð õs÷
Tõ&{õ
Wð  Ð Ø!2Ð ØÐ õ5õ
[õð$cÐgl÷ cð45ÐY^÷ 5ð .Ð àÐ1ØÐ&Ø Ð"Pð€õMõð&Ø7<÷&ðR ÷	ð 	ó ð	õZõ+÷ð6UÐX]ð UØ7<÷Uðz%€Ð!ó ñ ò  ó Ð ð -Ð0BÀOÐ/TÕTÐ ð 0€õhõð  @I÷ J÷ .õbñ$
EØ!ð
EØ;?÷
Eð 
Eð ‰x˜ ¨'°7Ó;Ø‘˜' 7¨GÓ4Ø‘˜& &¨'Ó2Ø‘˜& &¨'Ó2ð ‘x ¨°¸'ÓBØ‘˜ ¨¨v¸EÐJZÔ[à
‰H�V˜W g¨v¸EÐJZÔ[ð"€ˆó õvõ&õ@ð( Ð �4Ó ØÐ õ=ð( /Ð0HÐJ^Ð_Ð ØÐ �dÓ õDõ&Kõ$/õ
Eõ  õ$õ

Lõ÷>'r   