+
    jHàjª@  ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIHtHt ]P                  ! ]	4      t
RtRtR R lt]! RR04      t ! R	 R
]4      tR R ltR R ltRRRRRRRR/R R lltR R ltRR/R R lltRRRR/R R lltR# )a™  Wake an existing agent session from a background completion event. Push-capable adapters
(``supports_async_delivery``) get a synthetic ``MessageEvent(internal=True)`` via handle_message;
stateless adapters (API server) would run that under a ``build_session_key()`` key that never
matches the raw ``X-Hermes-Session-Id`` real turns use (invisible parallel session), so we self-POST
``/v1/chat/completions`` with the raw id header to resume the REAL session. Exception:
async-delegation completions: the CLIENT owns the next turn, so they are never self-POSTed as a
new ``role=user`` prompt (could cross a pending human-confirmation gate); instead
``persist_delegation_delivery`` writes a durable DELIVERY row (``display_kind=
"async_delegation_complete"``, read by TUI/desktop pollers). Failures RAISE (after bounded retries
on transient errors) so callers can rewind cursors / retry instead of silently losing the event.)ÚannotationsN)ÚAnyÚOptionalg     À‚@c               ó    € V ^8„  d   QhRRRR/# )é   Úadapterr   ÚreturnÚbool© )Úformats   "Ú1/home/ubuntu/.hermes/hermes-agent/gateway/wake.pyÚ__annotate__r      s   € ÷ Cñ C 3ð C¨4ñ Có    c                ó.   € \        \        V RR4      4      # )a  Whether this adapter can push a message to the user after a turn ends. Reads
``supports_async_delivery`` off the adapter class rather than the request-scoped contextvar
(background watchers run outside any bound session context). Adapters that don't declare
the flag are push-capable.Úsupports_async_deliveryT)r	   Úgetattr)r   s   &r   Úadapter_supports_pushr      s   € ô
 ”˜Ð!:¸DÓAÓBÐBr   Ú	not_foundÚinvalid_paramsc                  ó>   a € ] tR t^0tRtRRR/R V 3R lllltRtV ;t# )ÚWakeNotAccepteda  No adapter admission: retry without treating a healthy chat as dead. ``reason`` is the
store's refusal code when the session authority refused it (None: the adapter did not accept);
``permanent`` is set once the refusal is proven final (``refusal_proven_permanent``).ÚreasonNc               ó    € V ^8„  d   QhRRRR/# )r   ÚmessageÚstrr   úOptional[str]r
   )r   s   "r   r   ÚWakeNotAccepted.__annotate__5   s   € ÷ ñ  ð ÐZgñ r   c               	ó@   <€ \         SV `  V4       W n        R V n        R# )FN)ÚsuperÚ__init__r   Ú	permanent)Úselfr   r   Ú	__class__s   &&$€r   r   ÚWakeNotAccepted.__init__5   s   ø€ Ü‰Ñ˜Ô!ØŒØˆŽr   )r    r   )z%internal wake not accepted by adapter)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classcell__)r"   s   @r   r   r   0   s    ø† ñ]ñÐjn÷ ÷ ñ r   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úconfigr   Úprofiler   Ú
session_idr   r	   r
   )r   s   "r   r   r   ;   s/   € ÷ "Iñ "I Sð "I°=ð "IÈcð "IÐVZñ "Ir   c           	     ó   € ^ RI p^ RIHp V'       d	   V'       g   R# \        V4      p ^ RIHp \        V! V 4      4      P                  V4      pVf   R# ^ RIH	p V! V! V4      R,          RR7      p TP                  \        T4      4      p
 TP                  \        4      ;_uu_ 4        TP                  4        RRR4       \!        T
4      ;'       d    T
P                  R4      ;'       g    TT8H  #   \         d#   p	\        P                  R	YT	4        Rp	?	R# Rp	?	ii ; i  \         dm   p	\        P                  R
YT	4        Rp	?	TP                  \        4      ;_uu_ 4        TP                  4        RRR4       R#   + '       g   i     R# ; iRp	?	ii ; i  + '       g   i     Lë; i  TP                  \        4      ;_uu_ 4        TP                  4        RRR4       i   + '       g   i     i ; i; i)u©  True when a stateless (``api_server``) destination's raw session id is canonically owned by
served *profile*'s own session store.

A shared-listener mirror platform has no chat/thread/guild anchor a ``profile_routes`` entry
could match, so the session store itself is the ownership proof: the row must exist in that
profile's ``state.db`` under its own home and carry that profile's stamp (a NULL legacy stamp
belongs to the store's own profile â€” the same rule the dashboard's session routes apply). An
unserved profile, a missing row, a row stamped for another profile, or an unreadable store all
fail closed. Shared by the Kanban notifier and the background-process wake path.
N)ÚPathF)Ú_multiplex_profile_homes)Ú	SessionDBzstate.dbT)Ú	read_onlyz7wake: session ownership check unavailable for %s/%s: %sz3wake: session ownership lookup failed for %s/%s: %sÚprofile_name)Ú
contextlibÚpathlibr0   r   Úgateway.runr1   ÚdictÚgetÚhermes_stater2   Ú	ExceptionÚloggerÚdebugÚget_sessionÚsuppressÚcloser	   )r,   r-   r.   r5   r0   r1   Úhomer2   ÚdbÚexcÚrows   &&&        r   Úsession_owned_by_profilerE   ;   se  € ó ÝßŸWÙÜ�'‹l€Gð	Ý8ÜÑ,¨VÓ4Ó5×9Ñ9¸'ÓBˆØŠ<ÙÝ*Ù‘t˜D“z JÕ.¸$Ô?ˆðØ�n‰nœS ›_Ó-‰ð
 × Ñ ¤×+Õ+Ø�H‰HŒJ÷ ,ä�‹9×HÐH˜#Ÿ'™' .Ó1×<Ð<°WÀÑHÐHøô ô Ü�‰ÐNÐPWÐehÔiÝûðûô
 ô Ü�‰ÐJÈGÐadÔeÛà× Ñ ¤×+Õ+Ø�H‰HŒJ÷ ,×+×+Ò+þð	ú÷ ,×+ûˆZ× Ñ ¤×+Õ+Ø�H‰HŒJ÷ ,×+×+Ð+ýsw   ©*C5 ÁC5 Á3D% Â+FÃ5D"Ä DÄD"Ä%FÄ0FÅF2 Å(FÆF	ÆFÆF2 ÆF/	Æ2G=ÇG*	Ç!	G=Ç*G:Ç5G=c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   Úeventr   ÚNoner
   )r   s   "r   r   r   `   s!   € ÷ 	 ñ 	 ¨ð 	 °Cð 	 ¸Dñ 	 r   c              ƒ  ó†   "  € RVn         V P                  V4      G Rj  x€L
  VP                   RJd   \        4       hR#  L 5i)zñRequire a concrete adapter admission, not merely a handler returning None.

The public handler return stays unchanged. This receipt means scheduled/queued,
not model execution, authorization of a later turn, or successful outbound delivery.
FNT)Ú_gateway_acceptedÚhandle_messager   )r   rG   s   &&r   Úadmit_internal_eventrL   `   sD   é € ð $€EÔØ
×
 Ñ
  Ó
'×'Ð'Ø×Ñ dÓ*ÜÓÐñ +ñ (ùs   ‚Až?Ÿ!Ar.   Ú ÚsourceÚnotification_categoryÚresultr-   c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r   r   r   Útextr   r.   rN   rO   r-   r   r   rH   r
   )r   s   "r   r   r   l   sJ   € ÷ "Yñ "Y ð "Y¨cð "Y¸sð "YÐQTð "YØ.1ð"YØGTð"YØ`dñ"Yr   c             ƒ  ó:  "  € \        V 4      '       dŒ   Vf   \        R4      h^ RIHpHp \        V RR4      pVe7   ^ RIHp	 ^ RIH	p
 VR8w  d   RV/M/ p V	! W€W1R	V4      G Rj  x€L
 '       d   R#  V! WP                  VRRV/R7      p\        W4      G Rj  x€L
  R# V'       g   \        R4      h/ pV'       d   W^R&   VR8X  d   WNR&   \        V 3RVRV/VB G Rj  x€L
  R#  L€  T
 d'   p\        \        T4      TP                  R
7      ThRp?ii ; i L~ L:5i)u  Deliver a wake turn to the session behind ``adapter``. ``session_id`` is the RAW session id
(``X-Hermes-Session-Id`` / state.db key) â€” required for non-push adapters. ``source`` is the
``SessionSource`` for the synthetic event â€” required for push-capable adapters. ``profile``
names the served profile that canonically owns a non-push destination; a non-default value is
delivered in-process under the caller's profile scope (see ``_self_post_chat_completion``).
Raises on failure so the caller can rewind/retry.Nz;deliver_wake: push-capable adapter requires a SessionSource)ÚMessageEventÚMessageTypeÚgateway_runner)Úadmit_route_wake)ÚRuntimeStoreErrorrP   rO   zkanban-wake)r   T)rR   Úmessage_typerN   ÚinternalÚmetadatazudeliver_wake: non-push adapter (supports_async_delivery=False) requires the raw session id to self-post the wake turnr-   Ú
diagnosticrR   r.   )r   Ú
ValueErrorÚgateway.platforms.eventrT   rU   r   Úgateway.session_automationrW   Úhermes_state_runtimerX   r   r   r   ÚTEXTrL   Ú_self_post_chat_completion)r   rR   r.   rN   rO   r-   rT   rU   ÚrunnerrW   rX   ÚcategoryrC   Úsynth_eventÚextras   &$$$$$         r   Údeliver_wakerg   l   sB  é € ô ˜W×%Ò%ØŠ>ÜÐZÓ[Ð[ßEÜ˜Ð"2°DÓ9ˆØÒÝCÝ>ØK`ÐdlÔKlÐ/Ð1FÑGÐrtˆHðLÙ)¨&¸6ÈÐX`Óa×aÖaÙð bñ #¨×;KÑ;KÐTZÐeiØ-DÐF[Ð,\ô^ˆä" 7Ó8×8Ð8ÙßÜð Ró Sð 	Sà€EßØ"ˆiÑØ Ô,Ø)>Ð%Ñ&Ü
$ WÑ
X°4Ð
XÀJÐ
XÐRWÑ
X×XÒXñ! bøà$ô LÜ%¤c¨#£h°s·z±zÔBÈÐKûðLúñ 	9ñ Yùsf   ‚ADÁC' Á$C%Á%	C' Á/)DÂDÂDÂ'DÂ<"DÃDÃDÃ%C' Ã'DÃ.!DÄDÄDÄDc               ó    € V ^8„  d   QhRRRR/# )r   Úevtr8   r   r
   )r   s   "r   r   r   ‘   s   € ÷ ñ  dð ¨tñ r   c                óð  € V P                  R4      p\        V\        4      '       d+   V Uu. uF  p\        V\        4      '       g   K  VNK  	  upM. p\	        V4      ;'       g    ^p\        R V 4       4      p\        R V 4       4      pR\        V P                  R4      ;'       g    R4      RTRT;'       g	    WF,
          RV/pV P                  R	4      '       dH   R
V'       d   V^ ,          P                  RR4      MR 2VR&   RVR&   ^ RIHp V! R4      '       g   RVR&   V P                  R4      ;'       g    V P                  R4      p	\        V	\        \        34      '       d   W—R&   V# u upi )zËDisplay-only metadata for a persisted delegation delivery row. Mirrors
``tui_gateway.server._async_delegation_display_metadata`` (same ``display_kind`` consumer
contract) without importing the TUI stack.Úresultsc              3  óT   "  € T F  qP                  R 4      R9   g   K  ^x € K   	  R# 5i)ÚstatusN>   ÚsuccessÚ	completed©r9   ©Ú.0Úrs   & r   Ú	<genexpr>Ú/_delegation_display_metadata.<locals>.<genexpr>˜   s    é € Ð\¡W ·±°h³ÐC[Ñ0[Ÿ!š!£Wùó   ‚(ž
(c              3  óT   "  € T F  qP                  R 4      R9   g   K  ^x € K   	  R# 5i)rm   N>   ÚerrorÚfailedrp   rq   s   & r   rt   ru   ™   s    é € ÐT¡'˜Q¯U©U°8«_Ð@SÑ-S—q’q£'ùrv   Údelegation_idrM   Ú
task_countÚcompleted_countÚfailed_countÚtask_failure_noticeztask_failure:Ú
task_indexÚdelivery_noticer\   rO   )Úwarning_notifications_enabledÚ
api_serverTÚpresentation_suppressedÚtotal_duration_secondsÚduration_seconds)r9   Ú
isinstanceÚlistr8   ÚlenÚsumr   Úgateway.warning_notificationsr�   ÚintÚfloat)
ri   Úraw_resultsrs   rk   r{   r|   r}   r[   r�   Údurations
   &         r   Ú_delegation_display_metadatar�   ‘   sR  € ð —'‘'˜)Ó$€KÜAKÈKÔY]×A^ÒA^™+Ó=™+�Q¬°A´t×)<�qˆq™+Ò=Ðdf€GÜ�W“×"Ð" €JÜÑ\¡WÓ\Ó\€OÜÑT¡'ÓTÓT€LØ¤ S§W¡W¨_Ó%=×%CÐ%CÀÓ!DÀlÐT^Ø! ?×#OÐ#O°jÕ6OØ ð.€Hð ‡w�wÐ$×%Ò%Ø(5×Za°g¸aµj·n±nÀ\ÐSUÔ6VÐgiÐ5jÐ&kˆÐ"Ñ#Ø,8ˆÐ(Ñ)ÝOÙ,¨\×:Ò:Ø26ˆHÐ.Ñ/Ø�w‰wÐ/Ó0×OÐO°C·G±GÐ<NÓ4O€HÜ�(œS¤%˜L×)Ò)Ø'/Ð#Ñ$Ø€Oùò! >s   ¬E3Á	E3ri   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r   r   rR   r   r.   ri   zOptional[dict]r   rH   r
   )r   s   "r   r   r   ©   s1   € ÷ (ñ (¨sð (¸Sð (Ècð (ÐXfð (Ðrvñ (r   c          	   ƒ  óx  "  € V'       g   \        R4      h\        V RR4      p\        V4      '       d   \        P                  ! V4      G Rj  x€L
 MRpVf   \        RV 24      h\        VRR4      p\        V4      '       d3    \        P                  ! Wb4      G Rj  x€L
 pV'       d   \        V4      p\        P                  ! VP                  Y!\        T;'       g    / 4      4      G Rj  x€L
  \        P                  R	V4       R#  L½ Ln  \         d    \        P                  RTRR7        L~i ; i LI5i)
u_  Persist an async-delegation completion as a durable DELIVERY row (see module docstring)
WITHOUT running any agent turn. Raises on failure so the caller can release the durable claim
and retry.

85957: on stateless api_server sessions the client owns the turn after ``event.complete`` â€” a completion
must never become a new ``role=user`` prompt via the self-post (that starts an unauthorized agent turn
and can cross a pending human-confirmation gate). Instead, append the completion to the session
transcript as a timeline bookkeeping row (``display_kind="async_delegation_complete"`` + display
metadata â€” the exact shape the TUI/desktop delivery path persists), WITHOUT running any agent turn.
Clients polling ``GET /api/sessions/{id}/messages`` see it immediately; the pre-request repair belt
folds it into the next real client turn as context. See #85957.
zspersist_delegation_delivery: raw session id required to persist the completion on the api_server session transcriptÚ_ensure_session_dbNuh   persist_delegation_delivery: api_server SessionDB unavailable â€” cannot persist completion for session Úresolve_resume_session_idz6delegation delivery continuation resolve failed for %sT)Úexc_infoz^async delegation completion persisted as delivery row for api_server session %s (no wake turn))r]   r   ÚcallableÚasyncioÚ	to_threadÚRuntimeErrorr   r;   r<   r=   Úappend_delegation_deliveryr�   Úinfo)r   rR   r.   ri   ÚensurerB   ÚresolverÚresolveds   &$$$    r   Úpersist_delegation_deliveryrž   ©   s9  é € ÷ Üð Oó Pð 	Pä�WÐ2°DÓ9€FÜ19¸&×1AÒ1A”G×%Ò% fÓ-×-Ð-Àt€BØ	‚zÜð DØDNÀ<ðQó Rð 	Rô �rÐ6¸Ó=€HÜ�×Òð	nÜ$×.Ò.¨xÓD×DˆHßÜ  ›]�
ô ×
Ò
Ø
×%Ñ% zÔ9UÐVY×V_ÐV_Ð]_Ó9`ó÷ ð ô ‡K�KØhÐjtöñ+ .ñ Eøô ô 	nÜ�L‰LÐQÐS]ÐhlˆLÖmð	núñùs`   ‚AD:ÁDÁ6D:ÂD ÂDÂD Â+D Â6)D:Ã D:Ã.D8Ã/D:ÄD Ä#D5Ä2D:Ä4D5Ä5D:c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   r   r   rR   r   r.   rO   r-   r   r   rH   r
   )r   s   "r   r   r   Ô   sA   € ÷ Gñ G¨cð G¸Cð GÈSð GØ=@ðGà/<ðGàHLñGr   c             ƒ  óÆ  "  € V'       d]   \        V4      R8w  dM   \        V RR4      p\        V4      '       g   \        RV: R24      hV! W!\        V4      VR7      G Rj  x€L
  R# ^ RIp\        \        V RR4      ;'       g    R	4      pVR19   d   R	p\        \        V R
^ 4      ;'       g    R4      p\        \        V RR4      ;'       g    R4      p	V	'       g   \        R4      hRV9   d   VP                  R4      '       g   RV R2pRV RV R2p
RRV	 2RV/pR\        \        V RR4      ;'       g    R4      RRRRV/.RR/pVR8X  d   RVR &   Rp^\        \        4      ,           p\        V4       EFž  pV'       d1   \        P                  ! \        V^,
          ,          4      G Rj  x€L
   VP                  \        R!7      pVP                  VR"7      ;_uu_4       GRj  x€L
 pVP                  W¬VR#7      ;_uu_4       GRj  x€L
 pVP                   R$8X  dP   \        R%V 24      p\"        P%                  R&Wß^,           V4        RRR4      GRj  x€L
  RRR4      GRj  x€L
  Kú  VP                   R'8¼  d>   VP'                  4       G Rj  x€L
 R(,          p\        R)V R*VP                    R+V 24      hVP)                  4       G Rj  x€L
  \"        P+                  R,W/^,           4        RRR4      GRj  x€L
  RRR4      GRj  x€L
   R# 	  \        R.V R/V R0V 24      Vh ELÏ EL„ ELM EL, Là LÒ L© Ln LB L4  + GRj  x€L 
 '       g   i     M; iRRR4      GRj  x€L 
  EK     + GRj  x€L 
 '       g   i     EK  ; i  \,        TP.                  \0        3 d.   pTp\"        P%                  R-Y/^,           TT4        Rp?EKb  Rp?ii ; i5i)2uI  POST the wake text to the in-pod API server as a normal session turn, using the adapter's
own bind host/port/key. Session continuation via ``X-Hermes-Session-Id`` is 403-gated on
``API_SERVER_KEY``, so a missing key is a hard error rather than a wake in a fresh session
nobody watches.

``profile`` (a served secondary under ``gateway.multiplex_profiles``) takes the IN-PROCESS
route instead of the HTTP one: the shared listener's ``/p/<profile>/`` mirror authenticates
with that profile's own ``API_SERVER_KEY`` â€” which a route-only profile legitimately does not
have â€” and an unprefixed self-post would resume the session in the DEFAULT profile's store.
The caller already holds the owner profile's runtime scope, so the turn lands in that profile's
own session. A non-default profile whose adapter cannot run in-process fails closed.
ÚdefaultÚrun_internal_session_turnNz"wake self-post for served profile zS requires in-process session delivery; refusing to self-post as the default profile)r.   rR   r-   rO   Ú_hostrM   z	127.0.0.1Ú_portiÂ!  Ú_api_keyz´wake self-post requires API_SERVER_KEY: session continuation via X-Hermes-Session-Id is rejected (403) on an unauthenticated API server, so the wake cannot reach the target sessionÚ:Ú[Ú]zhttp://z/v1/chat/completionsÚAuthorizationzBearer zX-Hermes-Session-IdÚmodelÚ_model_namezhermes-agentÚmessagesÚroleÚuserÚcontentÚstreamFr\   Úhermes_notification_category)Útotal)Útimeout)ÚjsonÚheadersi­  z:wake self-post got HTTP 429 (concurrency cap) for session z%s; attempt %d/%di�  :Ni,  Nz"wake self-post failed for session z: HTTP z: z4wake self-post delivered for session %s (attempt %d)zCwake self-post transient failure for session %s (attempt %d/%d): %sz#wake self-post gave up for session z after z attempts: )z0.0.0.0z::Ú*)r   r   r•   r˜   Úaiohttpr‹   Ú
startswithrˆ   Ú_RETRY_DELAYS_SECONDSÚranger–   ÚsleepÚClientTimeoutÚWAKE_TURN_TIMEOUT_SECONDSÚClientSessionÚpostrm   r<   ÚwarningrR   Úreadrš   ÚTimeoutErrorÚClientErrorÚOSError)r   rR   r.   rO   r-   Ú
in_processr·   ÚhostÚportÚapi_keyÚurlrµ   ÚpayloadÚlast_errÚattemptsÚattemptr³   ÚhttpÚrespÚbodyrC   s   &$$$$                r   rb   rb   Ô   s·  é € ÷ ”3�w“< 9Ô,Ü! 'Ð+FÈÓMˆ
Ü˜
×#Ò#ÜØ4°W±Kð @Ið IóJð Jñ  JÄ3ÀwÃ<Ø/DôF÷ 	Fð 	FáÛÜŒw�w ¨Ó,×;Ð;°Ó<€DØÐ%Ô%ØˆÜŒw�w ¨Ó+×3Ð3¨tÓ4€DÜ”'˜' :¨rÓ2×8Ð8°bÓ9€GßÜð Qó Rð 	Rð ˆd„{˜4Ÿ?™?¨3×/Ò/Ø�4�&˜ˆ{ˆØ�D�6˜˜4˜&Ð 4Ð
5€CØ '¨'¨Ð 3Ð5JÈJÐW€GØœœG G¨]¸BÓ?×QÐQÀ>ÓRØ˜V V¨Y¸Ð=Ð>ÀÈ%ðQ€Gà Ô,Ø2>ˆÐ.Ñ/Ø(,€HØ”3Ô,Ó-Õ-€HÜ˜—?ˆßÜ—-’-Ô 5°gÀµkÕ BÓC×CÐCð	CØ×+Ñ+Ô2KÐ+ÓLˆGØ×,Ñ,°WÐ,×=×=Ô=ÀØŸ9™9 SÀ˜9×H×HÔHÈDØ—{‘{ cÔ)Ü#/ØXÐYcÐXdÐeó$˜ô Ÿ™Ð':¸HÐPQÅkÐS[Ô\Ø ÷ I×H÷ >×=Ñ=ð —{‘{ cÔ)Ø&*§i¡i£k× 1°4Õ8˜Ü*Ø@ÀÀÈGÐTX×T_ÑT_ÐS`Ð`bÐcgÐbhÐióð ð Ÿ)™)›+×%Ð%Ü—K‘KÐ VÐXbÐnoÕdoÔpØ÷ I×H÷ >×=Ò=ñ #ô2 Ø
-¨j¨\¸ÀÀ
È+ÐV^ÐU_Ð`óàðòa	Fò2 Dò >ÜHñ >ñ !2ñ &ñ Iñ >ßH×H×HÐHú÷ >×=×=×=×=Ö=ûô  ˜g×1Ñ1´7Ð;ô 	CØˆHÜ�N‰NÐ`Ø%°¥{°H¸c÷Có Cûð	Cüs“  ‚AO!Á L/Á!"O!Â(O!Â-O!ÃO!Ã(O!Ä1O!Ä7A7O!Æ.L2Æ/O!Æ44NÇ(L5
Ç)NÇ, M7ÈL8ÈM7È?MÉM7ÉL;
ÉM7ÉNÉ*L=É+NÉ/O!É1$MÊL?Ê<MËMË"MË5M7Ì M
ÌM7ÌNÌMÌNÌO!Ì2O!Ì5NÌ8M7Ì;M7Ì=NÌ?MÍMÍM7ÍNÍM ÍMÍ
M ÍM ÍM7Í#NÍ.M1Í/NÍ4O!Í7NÍ=N Í>
NÎ	NÎNÎO!ÎNÎOÎ1!OÏO!ÏOÏO!)g       @g      @g      $@)r(   Ú
__future__r   r–   ÚloggingÚtypingr   r   Ú	getLoggerr$   r<   r½   r¹   r   Ú	frozensetÚPERMANENT_REFUSAL_REASONSr˜   r   rE   rL   rg   r�   rž   rb   r
   r   r   Ú<module>r×      sÅ   ðñ	dõ #ã Û ß  à	×	Ò	˜8Ó	$€ð "Ð ð
 )Ð õCñ & {Ð4DÐ&EÓFÐ ô�lô õ"IõJ	 ð"YÀRð "YÐW[ð "YØ4<ð"YØW[÷"YõJð0(Ðim÷ (ðVGØCKðGà?C÷Gñ Gr   