+
    jHàjž   ã                  óâ  € R t ^ RIHt ^ RI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 ^ RIHtHtHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ R	IHt ^ R
IHt ^ RI H!t! ^ RI"H#t# ^ RI$H%t%H&t&H't'H(t( ^ RI)H*t* ^ RI+H,t, ^ RI-H.t. ^ RI/H0t0H1t1 ^ RI2H3t3 ^ RI4H5t5 ^ RIH6t6H7t7H8t8H9t9H:t:H;t; ^ RI<H=t= ]'       d   ^ RI>H?t? ^ RI@HAtA ]P„                  ! R4      tCR R ltD ! R R4      tER# )z?Gateway turn persistence phases; inherited by GatewayTurnMixin.)ÚannotationsN)ÚTYPE_CHECKING)Út)ÚFAILED_TURN_DISPLAY_KINDÚFAILED_TURN_NOTICEÚOPEN_TURN_TAIL_ROLESÚPARTIAL_FAILED_TURN_NOTICE)Úformat_iteration_progress)ÚnullcontextÚsuppress)Úcopy_context)ÚPlatform)Ú(repair_explicit_computer_use_media_paths)ÚBasePlatformAdapter)ÚMessageEvent)ÚSessionSourceÚ_session_key_namespaceÚbuild_channel_continuity_noteÚbuild_session_context)ÚTranscriptReadError)ÚTurnContext)Údiagnostic_wake_muted)ÚDEFAULT_LEASE_WAITÚTurnLeaseTimeoutError)Úget_hermes_home_override)ÚPath)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)Úbase_url_hostname)ÚGatewayRunner)Ú
TurnRunnerzgateway.runc               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚbool© )Úformats   "ÚA/home/ubuntu/.hermes/hermes-agent/gateway/run_turn_persistence.pyÚ__annotate__r,   .   s   € ÷ ñ  4ñ ó    c                ód   € ^ RI Hp ^ RIHp  \	        V! W4      RR4      R8H  #   T d     R# i ; i)z\An editor session: ACP shows no reasoning event yet, so its reply keeps the projected block.)Úlocal_policy)ÚRuntimeStoreErrorÚsourceNÚacpF)Ú gateway.session_setting_commandsr/   Úhermes_state_runtimer0   Úgetattr)Úrunnerr1   r/   r0   s   &&  r+   Ú_acp_launchr7   .   s8   € å=Ý6ðÜ‘| FÓ3°X¸tÓDÈÑMÐMøØô Úðús   Ž$ ¤/®/c                  óÂ   € ] tR t^8tRR R lltRR RR!/tR tR tR tR	 t	R
 t
R tR tR tR tR t]R 4       tR t]R R l4       tR tR tRRRRRR/tR tR tRtR# )"ÚGatewayTurnPersistenceMixinNc               ó    € V ^8„  d   QhRRRR/# )r&   Úpersist_user_display_kindzOptional[str]Úreply_expectedzOptional[bool]r)   )r*   s   "r+   r,   Ú(GatewayTurnPersistenceMixin.__annotate__9   s$   € ÷ Z>ñ Z>ð $1ðZ>ð 'ñ	Z>r-   c              ƒ  óª  "  € ^ RI HpHpHpHp VP                  R4      ;'       g    RpV! V4      '       d   RpT P                  VV4      p^ RIHpH	p ^ RI
Hp VP                  RV4      pVP                  RV4      pV'       dD   V! VV4      '       g5   \        P                  RY’P                  ;'       g    R	4       R
pV! 4       pM@V'       d9   V! V4      '       g+   \        P                  RY’P                  ;'       g    R	4       VR8X  dq   V'       gi   ^ RIHp \%        VP                  R4      ;'       g    R4      P'                  4       ;'       g    \)        R4      p\)        RVP+                  VR7      R7      pVP                  R. 4      p\        P-                  RY’P                  ;'       g    R	T;'       g    R	\.        P.                  ! 4       V
,
          VP                  R^ 4      \1        V4      4       V'       dL   V! V4      '       d>   V P3                  V4      G Rj  x€L
   V P4                  P7                  V4      G Rj  x€L
  V'       g(   V! VV\1        V4      R7      pV! VP:                  V4      pVP                  R4      '       dû   VR,          VP<                  8w  dã   VP<                  V8X  d§   VR,          Vn        V P?                  WgVP<                  4       V P4                  PA                  4       G Rj  x€L
  V P4                  PC                  VP<                  WR4      G Rj  x€L
  \D        PF                  ! V PH                  W$RR7      G Rj  x€L
  M+\        P-                  RT;'       g    RW„P<                  4       VVV3#  ELn ELM  \8         d%   p\        P                  RTTRR7        Rp?ELuRp?ii ; i LÆ Lš Lq5i) a  Turn the raw agent result into the outbound text: sentinel/silence handling, response
logging, resume-pending clear, empty-response normalization, and identity-guarded
post-compression session_id propagation. Returns
``(response, _intentional_silence, agent_messages)``.)Ú,_is_gateway_hidden_reasoning_incomplete_turnÚ_normalize_empty_agent_responseÚ _sanitize_gateway_final_responseÚ'_should_clear_resume_pending_after_turnÚfinal_responseÚ )Úis_machinery_display_kindÚsilence_allowed)Ú_unexpected_silence_replyÚqueued_terminal_display_kindÚqueued_terminal_reply_expectedz;silence marker rejected on a user turn: platform=%s chat=%sÚunknownFzEsilence marker suppressed on an unaddressed turn: platform=%s chat=%sz(empty))ÚEMPTY_RESPONSE_EXPLANATIONÚmodelz)gateway.errors.empty_response_model_labelzgateway.shared.warn_passthrough)rL   )ÚerrorÚmessageszXresponse ready: platform=%s chat=%s session=%s time=%.1fs api_calls=%d response=%d charsÚ	api_callsNz&clear_resume_pending failed for %s: %sT©Úexc_info)Úhistory_lenÚ
session_idzagent-result-compression©Úreasonz{Skipping agent-result session split sync for %s because the session binding moved from %s to %s before compression finishedÚ?)%Úgateway.runr?   r@   rA   rB   ÚgetÚ_is_intentional_silenceÚgateway.response_filtersrE   rF   Úgateway.run_turnrG   ÚloggerÚwarningÚchat_idÚdebugÚagent.turn_explainersrK   ÚstrÚstripr   r*   ÚinfoÚtimeÚlenÚ_clear_restart_failure_countÚasync_session_storeÚclear_resume_pendingÚ	ExceptionÚplatformrS   Ú_rebind_turn_leaseÚ_saveÚ_record_gateway_session_peerÚasyncioÚ	to_threadÚ_sync_telegram_topic_binding)ÚselfÚagent_resultr1   ÚhistoryÚsession_entryÚsession_keyÚ
_quick_keyÚrun_generationÚ_run_start_session_idÚ_platform_nameÚ_msg_start_timer;   r<   r?   r@   rA   rB   ÚresponseÚ_intentional_silencerE   rF   rG   Ú_silence_kindÚ_silence_reply_expectedrK   Ú_modelÚagent_messagesÚ_es   &&&&&&&&&&&&&               r+   Ú_hmwa_shape_agent_responseÚ6GatewayTurnPersistenceMixin._hmwa_shape_agent_response9   sU  é € ÷	
ó 	
ð  ×#Ñ#Ð$4Ó5×;Ð;¸ˆñ 8¸×EÒEØˆHØ#×;Ñ;¸LÈ(ÓSÐ÷ 	XÝ>Ø$×(Ñ(Ð)GÐIbÓcˆØ".×"2Ñ"2Ð3SÐUcÓ"dÐß©¸ÐG^×(_Ò(_Ü�N‰NØMØ§¡× ;Ð ;°)ôð $)Ð Ù0Ó2‰Hß!Ñ*CÀM×*RÒ*RÜ�L‰LØWØ§¡× ;Ð ;°)ôð �yÔ ×)=ÝHä˜×)Ñ)¨'Ó2×8Ð8°bÓ9×?Ñ?ÓA×sÐsÄQÐGrÓEsˆFÜÐ:ÐB\×BcÑBcÐjpÐBcÓBqÔrˆHØ%×)Ñ)¨*°bÓ9ˆÜ�‰ØfØŸN™N×7Ð7¨i¸×9QÐ9QÈ	Ü�IŠI‹K˜/Õ)¨<×+;Ñ+;¸KÈÓ+KÌSÐQYË]ô	
÷ ÑBÀ<×PÒPØ×3Ñ3°KÓ@×@Ð@ðgØ×.Ñ.×CÑCÀKÓP×PÐP÷ $Ù6°|ÀXÔ[^Ð_fÓ[gÔhˆHÙ7¸¿¹ÈÓRˆHð ×Ñ˜L×)Ò)¨l¸<Õ.HÈM×LdÑLdÔ.dØ×'Ñ'Ð+@Ô@Ø+7¸Õ+E�Ô(à×'Ñ'¨
ÀM×D\ÑD\Ô]Ø×.Ñ.×4Ñ4Ó6×6Ð6Ø×.Ñ.×KÑKØ!×,Ñ,¨kó÷ ð ô ×'Ò'Ø×5Ñ5°vÐUoô÷ ñ ô —‘ðFà×&Ð& 3Ð(=×?WÑ?Wôð
 Ð-¨~Ð=Ð=òA AâPøÜô gÜ—‘ÐEÀ{ÐTVÐae�×fÒfûðgúñ  7ññùsà   ‚5O¸AOÂOÂ"OÂ8OÃOÃ"OÄOÄ"OÄ;OÅAOÆ5
OÇ AOÈOÈ'NÈ(OÈ-N ÉNÉN ÉOÉ=OÊA0OÌOÌ-OÌ4OÌ5*OÍOÍ OÍ>OÎN ÎO
Î&OÎ?OÏO
Ï
OÏOÏOÚsubtextÚ
blockquotec                ón  aa€ VP                   \        P                  8X  d   \        W4      '       g   V# ^ RIHpHpHp  V! V! 4       V! VP                   4      R\        \        V RR4      4      VP                   \        P                  0R7      pVP                  R4      p	V'       d   V'       d   V'       g	   V	'       g   V# ^ RIHp
 V	P                  4       P!                  4       p\#        V4      ^8”  d<   RP%                  VR	,          4      \'        R
\#        V4      ^,
          R7      ,           pMV	P                  4       p ^ RIHp V! V! 4       V! VP                   4      RR4      pV P,                  P                  V4      pV'       dD   Vw  pooRP%                  VV3R lVP!                  4        4       4      p\'        V4       RV RV 2# V
! V4      p\'        RWÂR7      #   \         d3    TP                   \        P                  8X  d   RM\        T RR4      p EL�i ; i  \         d    Rp LÊi ; i)z«Prepend the last reasoning block when show_reasoning is on for this platform. Mattermost
requires an explicit per-platform opt-in (scratch text, not final-answer content).)Ú_load_gateway_configÚ_platform_config_keyÚ_resolve_gateway_display_boolÚshow_reasoningÚ_show_reasoningF)Údefaultrj   Úrequire_platform_override_forÚlast_reasoning)Úescape_code_fences_for_displayÚ
:Né   Nzgateway.reasoning.more_lines)Úcount)Úresolve_display_settingÚreasoning_styleÚcodec              3  óB   <"  € T F  q'       d   S V 2MSx € K  	  R # 5i©Nr)   )Ú.0ÚlnÚemptyÚprefixs   & €€r+   Ú	<genexpr>ÚFGatewayTurnPersistenceMixin._hmwa_prepend_reasoning.<locals>.<genexpr>Â   s"   øé € ÐjÑKiÀR¶2 6 (¨2¨$¡¸5Ô @ÓKiùs   ƒú

zgateway.reasoning.block)Ú	reasoningr{   )rj   r   ÚLOCALr7   rW   r‡   rˆ   r‰   r(   r5   Ú
MATTERMOSTri   rX   Úgateway.stream_consumer_fencesr�   rb   Ú
splitlinesre   Újoinr   Úgateway.display_configr“   Ú_REASONING_QUOTE_STYLES)rq   rr   r{   r1   r|   r‡   rˆ   r‰   Ú_show_reasoning_effectiverŽ   r�   ÚlinesÚdisplay_reasoningr“   Ú_reasoning_styleÚ_quoteÚ
header_keyÚ_quotedrš   r›   s   &&&&&             @@r+   Ú_hmwa_prepend_reasoningÚ3GatewayTurnPersistenceMixin._hmwa_prepend_reasoning›   sð  ù€ ð �?‰?œhŸn™nÔ,´[À×5NÒ5Nð ˆOßiÑið		Ù(EÙ$Ó&Ñ(<¸V¿_¹_Ó(MÐO_ÜœW TÐ+<¸eÓDÓEÐPV×P_ÑP_Ü/7×/BÑ/BÐ.Cô)Ð%ð &×)Ñ)Ð*:Ó;ˆß)¯h×?S×XfØˆOÝQà×$Ñ$Ó&×1Ñ1Ó3ˆÜˆu‹:˜Œ?Ø $§	¡	¨%°­*Ó 5¼Ð:XÔ`cÐdiÓ`jÐmoÕ`oÔ8pÕ pÑà .× 4Ñ 4Ó 6Ðð	&ÝFÙ6Ù$Ó&Ñ(<¸V¿_¹_Ó(MÐO`Ðbhó Ðð
 ×-Ñ-×1Ñ1Ð2BÓCˆßØ(.Ñ%ˆJ˜ Ø—i‘iÕjÐK\×KgÑKgÔKiÓjÓjˆGÜ˜
“m�_ B w i¨t°H°:Ð>Ð>á:Ð;LÓMÐÜÐ*Ð6GÔ[Ð[øô; ô 	àŸ™¬H×,?Ñ,?Ô?‘ÄWÈTÐSdÐfkÓEló &ð	ûô( ô 	&Ø%Òð	&ús%   Á AG$ Å&H$ Ç$9H!È H!È$H4È3H4c                óÀ  € ^ RI HpHpHp ^ RIHp V! 4       RJ d   R#  ^ RIHp T! V! 4       V! VP                  4      VP                  R4      VP                  R^ 4      ;'       g    ^ VP                  R4      ;'       g    R	V! R4      VVP                  R
4      VP                  R4      R7	      #   \         d"   p	\        P                  RT	4        R	p	?	R# R	p	?	ii ; i)zÃRuntime-metadata footer for the FINAL message of the turn; off by default
(display.runtime_footer.enabled=false). Never on a finite (`-z`, `chat -q`) turn: its reply is
the printed answer itself.)r‡   rˆ   Ú_terminal_scope_cwd)Úfinite_turn_requiredTrD   )Úbuild_footer_linerL   Úlast_prompt_tokensÚcontext_lengthNÚrequested_modelÚserved_model)	Úuser_configÚplatform_keyrL   Úcontext_tokensrµ   ÚcwdÚturn_secondsr¶   r·   zruntime_footer build failed: %s)rW   r‡   rˆ   r±   Úgateway.session_finiter²   Úgateway.runtime_footerr³   rj   rX   ri   r\   r_   )
rq   rr   r1   Ú_turn_secondsr‡   rˆ   r±   r²   Ú_bflÚ_footer_errs
   &&&&      r+   Ú_hmwa_runtime_footer_lineÚ5GatewayTurnPersistenceMixin._hmwa_runtime_footer_lineÈ   sÌ   € ÷ 	`Ñ_Ý?ÙÓ! TÓ)Ùð	ÝHÙÙ0Ó2Ù1°&·/±/ÓBÈ,×JZÑJZÐ[bÓJcØ+×/Ñ/Ð0DÀaÓH×MÐMÈAØ+×/Ñ/Ð0@ÓA×IÐIÀTÙ'¨Ó+¸-Ø ,× 0Ñ 0Ð1BÓ CØ)×-Ñ-¨nÓ=ôð øô ô 	Ü�L‰LÐ:¸KÔHÝûð	ús$   ŸAB1 Á'B1 Â/B1 Â1CÂ<CÃCc              ƒ  óè  "  € V P                   P                  R/ VCRT;'       g    RR,          RVP                  RR4      RVP                  RR4      /C4      G Rj  x€L
   ^ RIHp VP
                  p. Vn        \        V4       FX  w  rg\        P                  ! V P                  V4      4       V^d,          ^c8X  g   K:  \        P                  ! ^ 4      G Rj  x€L
  KZ  	   ^ RIHp	 V P                  V	P                  4      G Rj  x€L
  R#  L± L6  \         d!   p\        P                  R	T4        Rp?LVRp?ii ; i L8  \         d"   p\        P!                  R
T4        Rp?R# Rp?ii ; i5i)zIagent:end hook, process-watcher scheduling, and watch-notification drain.z	agent:endr{   rD   :Niô  NrL   ÚproviderN)Úprocess_registryzProcess watcher setup error: %szWatch queue drain error: %s)ÚhooksÚemitrX   Útools.process_registryrÆ   Úpending_watchersÚ	enumeratern   Úcreate_taskÚ_run_process_watcherÚsleepri   r\   rM   Ú_drain_watch_notificationsÚcompletion_queuer_   )
rq   Úhook_ctxrr   r{   rÆ   ÚwatchersÚiÚwatcherÚeÚ_prs
   &&&&      r+   Ú_hmwa_post_turn_hooksÚ1GatewayTurnPersistenceMixin._hmwa_post_turn_hooksß   s@  é € à�j‰j�o‰o˜kð ,
Øð,
Ø" X§^ ^°°TÕ$:¸GÀ\×EUÑEUÐV]Ð_aÓEbØ˜×(Ñ(¨°RÓ8ñ,
ó ÷ 	ð 	ð
	?Ý?à'×8Ñ8ˆHØ02ÐÔ-Ü'¨Ö1‘
�Ü×#Ò# D×$=Ñ$=¸gÓ$FÔGØ�s•7˜b–=Ü!Ÿ-š-¨Ó*×*Ò*ñ 2ð	;ÝFØ×1Ñ1°#×2FÑ2FÓG×GÒGñ-	ñ +øÜô 	?Ü�L‰LÐ:¸A×>Ñ>ûð	?úñ HøÜô 	;Ü�L‰LÐ6¸×:Ò:ûð	;üs‹   ‚AE2ÁDÁE2Á#AD ÃD ÃDÃD Ã$$E ÄEÄ	E ÄE2ÄD ÄD>ÄD9Ä4E2Ä9D>Ä>E2ÅE ÅE/ÅE*Å$E2Å*E/Å/E2c                ój   € \        T;'       g    R4      P                  4       pV'       d   V RV 2# T# )zTMake failed-turn delivery explicit without replacing the provider-specific guidance.rD   rž   )ra   rb   )rq   r{   Únotices   &&&r+   Ú_hmwa_add_failed_turn_noticeÚ8GatewayTurnPersistenceMixin._hmwa_add_failed_turn_noticeþ   s3   € ä�x—~�~ 2Ó&×,Ñ,Ó.ˆß,4�(�˜4 ˜xÐ(Ð@¸&Ð@r-   c                ó   € ^ RI Hp T! VP                  R. 4      ;'       g    . VP                  R^ 4      4      p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   \        # \
        # )zUChoose retry guidance without assuming completed tool effects can be repeated safely.)Ú_current_turn_messagesrN   Úhistory_offsetc              3  ó´   "  € T FN  pVP                  R 4      R8H  ;'       g.    VP                  R 4      R8H  ;'       d    VP                  R4      x € KP  	  R# 5i)ÚroleÚtoolÚ	assistantÚ
tool_callsN)rX   )r˜   Úmessages   & r+   rœ   ÚGGatewayTurnPersistenceMixin._hmwa_failed_turn_notice.<locals>.<genexpr>  s[   é € ð 
ñ )�ð �K‰K˜Ó 6Ñ)÷ Rð RØ—‘˜FÓ# {Ñ2×PÐP°w·{±{À<Ó7PôRã(ùs   ‚A¢A¾ATF)Úgateway.media_repairrÞ   rX   Úanyr   r   )rq   rr   rÞ   Úturn_messagess   &&  r+   Ú_hmwa_failed_turn_noticeÚ4GatewayTurnPersistenceMixin._hmwa_failed_turn_notice  s}   € å?ñ /Ø×Ñ˜Z¨Ó,×2Ð2°°L×4DÑ4DÐEUÐWXÓ4Yó
ˆ÷ ‹3ñ 
ñ )ó
�3�3Š3ñ 
ñ )ó
÷ 
ò 
ô
 .Ð-Ü!Ð!r-   c              ƒ  óø   "  € V P                   P                  V4      G Rj  x€L
 \        9  d   R# V P                   P                  VRRRVR\        P                  ! 4       R\
        /4      G Rj  x€L
  R#  LT L5i)a©  Append the gateway-owned assistant boundary iff the durable tail is open (a user row, or the
tool row of a call that ran before the failure).

The tail, not "did the gateway write the user row", is the key: on the primary path the
agent's turn-start flush already persisted the row (so the platform-id dedupe skips the
gateway write), and a platform redelivery of an already-closed turn must not stack a
second assistant row.Nrá   rã   ÚcontentÚ	timestampÚdisplay_kind)rg   Útranscript_tail_roler   Úappend_to_transcriptrd   r   )rq   rS   rÚ   s   &&&r+   Ú_hmwa_close_failed_turnÚ3GatewayTurnPersistenceMixin._hmwa_close_failed_turn  sp   é € ð ×)Ñ)×>Ñ>¸zÓJ×JÔRfÔfÙØ×&Ñ&×;Ñ;¸JØ�K ¨F°KÄÇÂÃÈnÔ^vðI
ó ÷ 	ò 	ñ Kñ	ùs"   ‚A:¡A6¢AA:Á/A8Á0A:Á8A:c                ó   € ^ RI Hp \        VP                  R4      4      pV! V4      p^ RIHp V! V\        V4      4      pV'       d"   \        P                  RVP                  4       MbV'       d"   \        P                  RVP                  4       M9V'       d2   \        P                  RVP                  VP                  RR4      4       WVV3# )	a.  Classify a finished turn for transcript persistence. Returns
``(agent_failed_early, hidden_reasoning_incomplete, is_context_overflow_failure)``.

Context-overflow failures must NOT persist the user message (session would grow and
reproduce the failure forever); transient failures (429/timeout/5xx) DO.)r?   Úfailed)Ú"is_context_overflow_failure_resultzjSkipping transcript persistence for context-overflow failure in session %s to prevent session growth loop.up   Transient agent failure in session %s â€” persisting user message so conversation context is preserved on retry.zLSuppressing hidden-reasoning-only incomplete gateway turn for session %s: %srM   zprocessing incomplete)rW   r?   r(   rX   r[   rö   re   r\   rc   rS   r]   )	rq   rr   rs   rt   r?   Úagent_failed_earlyÚhidden_reasoning_incompleterö   Úis_context_overflow_failures	   &&&&     r+   Ú_hmwa_classify_turn_failureÚ7GatewayTurnPersistenceMixin._hmwa_classify_turn_failure!  s¼   € õ 	Mô " ,×"2Ñ"2°8Ó"<Ó=ÐÙ&RÐS_Ó&`Ð#ÝGÙ&HÈÔWZÐ[bÓWcÓ&dÐ#ß&Ü�K‰KðHØIV×IaÑIaõ÷  Ü�K‰KðIØJW×JbÑJbõ÷ )Ü�N‰NØ^Ø×(Ñ(¨,×*:Ñ*:¸7ÐD[Ó*\ôð "Ð@[Ð[Ð[r-   c              ƒ  óN  "  € VP                  R4      '       d.   \        P                  RV'       d   VP                  MR4       W#3# VP                  R4      '       dN   \	        VRR4      \
        P                  8X  d.   \        P                  RV'       d   VP                  MR4       W#3# VP                  R4      '       d_   V'       dW   V'       dO   V P                  W4V4      '       g   V P                  W4V4      G Rj  x€L
 pT;'       g    R\        R	4      ,           pW#3#  L#5i)
u  Auto-reset a permanently oversized session so the next message starts fresh instead of
replaying the oversized context forever. Never on a lock-contended defer â€” that is the
OPPOSITE case (a concurrent path holds the lock and is shrinking it). Returns
``(response, session_entry)``.Úcompression_deferreduŸ   Compression deferred for session %s â€” the compression lock is held by a concurrent compressor. Keeping the session intact; the next message retries normally.rV   Úcompression_exhaustedrj   Nz4Keeping API session %s after compression exhaustion.rD   z,gateway.session.auto_reset_context_exhausted)
rX   r\   rc   rS   r5   r   Ú
API_SERVERÚ_hmwa_defer_exhaustion_resetÚ_hmwa_rotate_exhausted_sessionr   )rq   rr   r{   rt   ru   r1   s   &&&&&&r+   Ú"_hmwa_compression_exhaustion_resetÚ>GatewayTurnPersistenceMixin._hmwa_compression_exhaustion_resetF  s  é € ð ×ÑÐ2×3Ò3Ü�K‰KðE÷ -:�×(Ò(¸sô	ð  Ð&Ð&ð ×ÑÐ5×6Ò6¼7À6È:ÐW[Ó;\Ô`h×`sÑ`sÔ;sô �K‰KÐNß4A˜×0Ò0ÀsôLð Ð&Ð&ð	 ×ÑÐ5×6Ò6¿=Ï[Ø×4Ñ4°]ÐQW×XÒXØ&*×&IÑ&IÈ-ÐflÓ&m× m�Ø Ÿ˜ B¬!Ð,ZÓ*[Õ[ˆHØÐ&Ð&ñ !nùs:   ‚/D%²+D%Á7D%Â+D%ÃD%Ã
D%Ã-D%Ã?D#Ä D%ÄD%c                óÞ   a aaa€ ^ RI Hp \        SRR4      \        P                  8w  g   VP                  4       '       g   R# ^ RIHp V! S 4      pVf   R# V VVV3R lVP                  S&   R# )aj  True when the reset was handed to the authority drain. A LOCAL session (the Bot Chat a
``hermes peer dm`` lands in) resets its target in the store, which refuses while an admission
on it is started (``session_busy``): this turn's own. The drain runs the reset right after it
settles this admission, before it claims any successor (the Bot Chat's retry included).)Úexecuting_admissionrj   NF)Úactive_authorityc                 ó*   <€ S P                  SSS4      # r—   )r  )rq   rt   ru   r1   s   €€€€r+   Ú<lambda>ÚJGatewayTurnPersistenceMixin._hmwa_defer_exhaustion_reset.<locals>.<lambda>o  s   ø€ ¸×9\Ñ9\Ø˜;¨ô:0r-   T)	Úgateway.session_ingressr  r5   r   r    rX   Úgateway.session_authoritiesr  Údeferred_resets)rq   rt   ru   r1   r  r  Ú	authoritys   ffff   r+   r   Ú8GatewayTurnPersistenceMixin._hmwa_defer_exhaustion_resetc  s[   û€ õ
 	@Ü�6˜: tÓ,´·±Ô>ÐFY×F]ÑF]×F_ÒF_ÙÝ@Ù$ TÓ*ˆ	ØÒÙ÷20ˆ	×!Ñ! +Ñ.ár-   c              ƒ  ól  "  € \         P                  RVP                  4       ^ RIHpHp V! WVP                  4      G Rj  x€L
 w  rg V! WVP                  4      G Rj  x€L
  V P                  V4       \        V P                  V4      ;'       g    R4      pV P                  VRR7       V'       d5   V P                  V4      P                  P                  P                  V4       Ve.   Tp\        P                  ! V P                   W1RR7      G Rj  x€L
  V! 4        V#  Là LÄ L  T! 4        i ; i5i)zPThe compression-exhaustion auto-reset itself; returns the route's (fresh) entry.z7Auto-resetting session %s after compression exhaustion.)Úmove_route_wakesÚreset_and_rehome_messagesNÚcompression_exhausted_resetrT   zcompression-exhausted-resetr)   )r\   rc   rS   Úgateway.session_automationr  r  Ú_evict_cached_agentÚlistÚ_overflow_queueÚ_clear_conversation_scopeÚ_session_stateÚconversationÚqueued_eventsÚextendrn   ro   rp   )	rq   rt   ru   r1   r  r  Ú	new_entryÚrelease_freshÚqueueds	   &&&&     r+   r  Ú:GatewayTurnPersistenceMixin._hmwa_rotate_exhausted_sessions  s  é € ä�‰ÐMÈ}×OgÑOgÔhßZá)BÀ4ÐVc×VnÑVnÓ)o×#oÑ ˆ	ð	Ù" 4°m×6NÑ6NÓO×OÐOØ×$Ñ$ [Ô1ô ˜$×.Ñ.¨{Ó;×AÐA¸rÓBˆFà×*Ñ*¨;Ð?\Ð*Ô]ßØ×#Ñ# KÓ0×=Ñ=×KÑK×RÑRÐSYÔZØÒ$ð !*�Ü×'Ò'Ø×5Ñ5°vÐUrô÷ ð ñ ŒOØÐñ= $páOñ*øñ �OüsZ   ‚?D4ÁD"ÁD4Á	D( ÁD$Á 1D( Â!D( Â4A D( ÄD&ÄD( Ä
D4Ä$D( Ä&D( Ä(	D1Ä1D4c                ó¦  € RRRVP                   e   VP                   MVP                  RVP                  e   VP                  MT/pVP                  '       d   VP                  VR&   ^ RIHp / VP                  '       d   RVP                  /M/ CV! V 4      CpV'       d   WSR	&   \        V R
R4      '       d   \        V P                  4      VR
&   V# )zQTranscript row for the inbound user turn (clean text + event time when captured).rá   Úuserrí   Nrî   rï   )Údisplay_metadata_for_eventÚgateway_input_ownerÚdisplay_metadataÚ
message_id)
Úpersist_user_messageÚmessage_textÚpersist_user_timestampr;   rZ   r"  Úpersistence_ownerr5   ra   r%  )ÚeventÚpreparedÚtsÚ_user_entryr"  r$  s   &&&   r+   Ú_hmwa_user_transcript_entryÚ7GatewayTurnPersistenceMixin._hmwa_user_transcript_entry˜  sÚ   € ð �FØØ19×1NÑ1NÒ1Z�×-Ò-Ø×*Ñ*à¸H×<[Ñ<[Ò<g˜×8Ò8Ðmoð
ˆð ×-×-Ð-Ø*2×*LÑ*LˆK˜Ñ'ÝGðAÐV^×Vp×VpÐVpÐ 5°x×7QÑ7QÑRÐvxð AÙ8¸Ó?ðAÐçØ.>Ð*Ñ+Ü�5˜,¨×-Ò-Ü(+¨E×,<Ñ,<Ó(=ˆK˜Ñ%ØÐr-   c             ƒ  óÐ  "  € ^ RI Hp \        P                  ! 4       pV P                  pVP                  pVP
                  pVP                  RV P                  RJ4      pV P                  WV4      pV'       d   EMhV'       g‹   VP                  \        P                  8w  dl   TP                  TRRRVP                  R. 4      ;'       g    . RV! 4       RVP                  '       d   VP                  P                  MR	R
V/4      G Rj  x€L
  V	'       g	   V
'       d®   VP                  '       dV   VP                  V\!        VP                  4      4      G Rj  x€L
 '       d#   \"        P%                  RVP                  V4       MVP                  VVVR7      G Rj  x€L
  V P'                  WðP)                  V4      4      G Rj  x€L
  EMVP                  R\+        V4      4      p\+        V4      V8”  d   VVR M. pV'       gH   VP                  VVVR7      G Rj  x€L
  V'       d#   VP                  VRRRVR
V/VR7      G Rj  x€L
  M˜RpV F�  pVP                  R4      R8X  d   K  / VCR
V/CpV'       gJ   VP                  R4      R8X  d4   VP                  '       d"   RV9  d   \!        VP                  4      VR&   RpVP                  VVVR7      G Rj  x€L
  K’  	  VP-                  VP.                  VP                  R^ 4      \1        \3        VRR4      4      '       * R7      G Rj  x€L
  V P5                  WO4      G Rj  x€L
  R#  ELE ELù EL¸ EL“ EL> EL L„ L3 L5i)zËPersist this turn to the transcript (session_meta on first turn, user-only on transient
failure, nothing on context overflow), update last_prompt_tokens, and re-baseline the
cached agent's message count.)Ú_resolve_gateway_modelÚagent_persistedNrá   Úsession_metaÚtoolsrL   rj   rD   rî   z:Skipping duplicate user turn (message_id=%s) in session %s)Úskip_dbrß   rã   rí   FÚsystemr!  r%  Tr´   Úinternal)r´   Útouch_activity)rW   r1  rd   rg   rS   rs   rX   Ú_session_dbr.  rj   r   r    rñ   Úvaluer%  Úhas_platform_message_idra   r\   rc   rò   rê   re   Úupdate_sessionru   r(   r5   Ú"_refresh_agent_cache_message_count)rq   r*  r1   rt   ru   rr   r€   r+  r{   r÷   rø   rù   r1  r,  ÚstoreÚsidrs   r2  Ú	_user_rowrR   Únew_messagesÚ_user_msg_id_attachedÚmsgÚentrys   &$$$$$$$$$$$            r+   Ú_hmwa_persist_turn_transcriptÚ9GatewayTurnPersistenceMixin._hmwa_persist_turn_transcript³  s-  é € õ 	7Ü�YŠY‹[ˆØ×(Ñ(ˆØ×&Ñ&ˆØ×"Ñ"ˆð '×*Ñ*Ð+<¸d×>NÑ>NÐVZÐ>ZÓ[ˆØ×4Ñ4°UÀbÓIˆ	ç&Ùç˜vŸ™´(·.±.Ô@ð
 ×0Ñ0°Ø˜NØ˜\×-Ñ-¨g°rÓ:×@Ð@¸bØÑ3Ó5Ø¸¿¿¸ §¡× 5Ò 5ÈbØ ð7ó ÷ ð ÷ "×%@ð ×#×#Ð#¨e×.KÑ.KÈCÔQTÐUZ×UeÑUeÓQfÓ.g×(gÖ(gÜ—K‘KØTØ×(Ñ(¨#õð
  ×4Ñ4°S¸)È_Ð4Ó]×]Ð]ð ×2Ñ2°3×8UÑ8UÐVbÓ8cÓd×dÒdð +×.Ñ.Ð/?ÄÀWÃÓN�Ü?BÀ>Ó?RÐU`Ô?`˜~¨k¨lÑ;Ðfh�ß#à×4Ñ4°S¸)È_Ð4Ó]×]Ð]ßØ#×8Ñ8Ø &¨+°yÀ(ÈKÐY[Ð!\Ø$3ð 9ó ÷ ð øð -2Ð)Û+˜ØŸ7™7 6›?¨hÔ6Ù$Ø 8 3Ð 8¨°RÑ 8˜ç 5Ø #§¡¨£°6Ô 9Ø %× 0× 0Ð 0Ø ,°EÔ 9ä25°e×6FÑ6FÓ2G˜E ,Ñ/Ø48Ð1Ø#×8Ñ8¸¸eÈ_Ð8Ó]×]Ò]ñ  ,ð ×"Ñ"Ø×%Ñ%¸,×:JÑ:JÐK_ÐabÓ:cÜ#¤G¨E°:¸uÓ$EÓFÔFð #ó 
÷ 	
ð 	
ð ×5Ñ5°kÓG×GÒGò{ò )hò ^ò eò ^òñ( ^ñ	
ñ 	Hùsæ   ‚BM&ÂAM&ÃM&Ã'"M&Ä	MÄ
M&ÄM&ÄM&Ä0(M&ÅMÅ	M&Å#9M&ÆMÆ'M&ÇMÇ?M&ÈM&ÈMÈM&È)M&ÉMÉ3M&É;'M&Ê#8M&ËM ËAM&Ì.M"Ì/M&ÍM$ÍM&ÍM&ÍM&ÍM&ÍM&ÍM&Í M&Í"M&Í$M&c               ó$   € V ^8„  d   QhRRRRRR/# )r&   rr   Údictr{   ra   r'   r)   )r*   s   "r+   r,   r=     s&   € ÷ Uñ U°ð UÀð UÈñ Ur-   c                ó~   € V P                  R4      '       d	   V'       g   V# ^ RIHp V! WP                  R4      4      # )zêA usage-window refusal sent to a chat: credits steps point at the Portal (a chat's /topup has no
Keep going control) and the reset reads as a duration (the gateway's clock is not the reader's).
Every other reply is returned unchanged.Úusage_window_message)Úchat_refusal_wordingÚfailure_resets_at)rX   Úagent.plan_limitsrK  )rr   r{   rK  s   && r+   Ú_usage_window_chat_wordingÚ6GatewayTurnPersistenceMixin._usage_window_chat_wording  s7   € ð
 × Ñ Ð!7×8Ò8¿XØˆOÝ:Ù# H×.>Ñ.>Ð?RÓ.SÓTÐTr-   c              ƒ  óÎ   "  € V P                  WW4VWgW‰V
4
      G Rj  x€L
 p\        VP                  R4      \        4      '       d   V P	                  WR,          VVR7       V#  LF5i)z�``_hmwa_deliver_turn_response``, then, for a usage-window refusal, the limit offer: the limit
sentence is the reply, and the button follows it once it lands.NÚusage_limit)ru   Ú
generation)Ú_hmwa_deliver_turn_responseÚ
isinstancerX   rH  Ú_schedule_usage_limit_offer)rq   r*  r1   rt   ru   rw   rr   r€   r{   Úfooter_lineÚintentional_silenceÚ	delivereds   &&&&&&&&&&& r+   Ú'_deliver_turn_response_then_limit_offerÚCGatewayTurnPersistenceMixin._deliver_turn_response_then_limit_offer  sq   é € ð ×:Ñ:Ø˜=°~Ø¨(ÐATó
÷ 
ˆ	ô �l×&Ñ& }Ó5´t×<Ò<Ø×,Ñ,¨UÀÕ4OÐ]hØ8Fð -ô HàÐñ
ùs   ‚A%œA#�AA%c           
   ƒ  ó  "  € \        V4      '       d   R# V
'       d#   \        P                  RVP                  4       RpV P	                  V4      pVRJ;'       d    \        \        VRR 4      ! WE4      4      pV'       gL   V P                  WV\        VP                  R4      4      R7      '       d   V P                  W4      G Rj  x€L
  VP                  R4      '       dÚ   VP                  R4      '       gÃ   V'       d:   V'       d2   VP                  R	4      '       g   V P                  W�V4      G Rj  x€L
  V	'       d>   V'       d6    VP                  VP                  W�P                  W4      R
7      G Rj  x€L
  \!        \        4      ;_uu_ 4        \#        T;'       g    R4      Vn        RRR4       R# V#  Lö L‰ LF  \         d!   p\        P                  RT4        Rp?LjRp?ii ; i  + '       g   i     R# ; i5i)z¥Final delivery decisions: intentional silence, voice reply, streamed-turn media/footer.
Returns the text for the adapter to send, or ``None`` when already delivered.Nz5Suppressing intentional silence marker for session %srD   Ú_streaming_tts_turn_completedc                 ó   € R # )Fr)   )Ú_aÚ_ks   *,r+   r  ÚIGatewayTurnPersistenceMixin._hmwa_deliver_turn_response.<locals>.<lambda>;  s   € ÑPUr-   Úalready_sent)ra  rõ   Úmedia_already_delivered)Úmetadataztrailing footer send failed: %s)r   r\   rc   rS   Ú_delivery_adapter_forr(   r5   Ú_should_send_voice_replyrX   Ú_send_voice_replyÚ_deliver_media_from_responseÚsendr^   Ú_event_thread_metadatari   r_   r   ra   Ú_streamed_final_response)rq   r*  r1   rt   ru   rw   rr   r€   r{   Ú_footer_liner|   ÚadapterÚ_streaming_tts_doner�   s   &&&&&&&&&&&   r+   rS  Ú7GatewayTurnPersistenceMixin._hmwa_deliver_turn_response+  s­  é € ô ! ×'Ò'ÙçÜ�K‰KÐOÐQ^×QiÑQiÔjØˆHà×,Ñ,¨VÓ4ˆà%¨TÐ1÷ 
ð 
´dÜ�GÐ<Ñ>UÔVÐWbÓsó7
Ð÷ # t×'DÑ'DØ˜^¼$¸|×?OÑ?OÐP^Ó?_Ó:`ð (E÷ (
ò (
ð ×(Ñ(¨Ó9×9Ð9ð ×Ñ˜N×+Ò+°L×4DÑ4DÀX×4NÒ4N÷ ŸG¨L×,<Ñ,<Ð=V×,WÒ,WØ×7Ñ7¸ÈÓQ×QÐQç§ðHØ!Ÿ,™, v§~¡~°|×NiÑNiÐjoÓNx˜,Óy×yÐyô
 œ)×$Õ$Ü14°X·^°^ÀÓ1D�Ô.÷ %áàˆñ+ :ñ Rñ zøÜ ô HÜ—L‘LÐ!BÀB×GÑGûðHú÷ %Ö$áüs­   ‚Hž=HÁ%HÂAHÃF?Ã	HÃ$HÃ;HÄHÄHÄ"HÄ7GÄ8HÅHÅ/G Å<GÅ=G ÆHÆG3Æ3HÇHÇG ÇG0ÇG+Ç&HÇ+G0Ç0HÇ3H	Ç>	Hé‘  zgateway.errors.hint_authi’  zgateway.errors.hint_quotai  zgateway.errors.hint_overloadedc           
   ƒ  ó&  "  € V P                  W#4      G Rj  x€L
  \        P                  RV4       \        VRR4      pVR%9   d4   \	        VP
                  4      ^28”  d   ^ RIHp ^ RIH	p	 V	! V! 4       4      #  VP                  e¾   Veº   V P                  P                  VP                  VP                  4      G Rj  x€L
 p
V
'       gR   V P                  P                  VP                   V P#                  W&\$        P$                  ! 4       4      4      G Rj  x€L
  V P'                  VP                   \(        4      G Rj  x€L
  T P.                  P1                  T4      pT'       d   TR
8w  d   \3        T4      MRpTR
8X  dL   ^ RIHp \        T P9                  T4      P:                  RR4      p\3        Y½! \        TRR4      4      R7      pEMMTR8X  dÛ   / p\=        \*        4      ;_uu_ 4        TP>                  PA                  4       P1                  R/ 4      pRRR4       \C        T\D        4      '       g   / pTP1                  R4      pTP1                  R4      R8w  d   \3        R4      pM¯T'       d0   T^ 8”  d)   ^ RI#p\3        RTPI                  TR,          4      R7      pMx\3        R4      pMlTR8X  d   \3        R4      pMY\        TRR4      R8X  dH   \        TRR4      '       d5   RTPJ                   RTPL                   R TPN                  ;'       g    R! R"2p^ RIH	p	 T	! T PQ                  \3        R#TR$7      \(        4      4      #  EL1 ELŒ EL6 EL  \*         d    \        P-                  RRR	7        EL4i ; i  + '       g   i     ELm; i5i)&z“``except Exception`` body of the agent turn: stop typing, log, persist the inbound user
turn once, and build the sanitized user-facing error reply.NzAgent error in session %sÚstatus_codeé�  )Ú_context_overflow_reply)Úrecord_unexecuted_failurez<Failed to persist inbound user message after agent exceptionTrP   ro  rD   )Úrelogin_command_hintÚagentrÅ   )Úrelogini­  rM   Úresets_in_secondsÚtypeÚusage_limit_reachedz gateway.errors.hint_rate_limitedz&gateway.errors.hint_usage_limit_resetsi  )Úhourszgateway.errors.hint_usage_limitzgateway.errors.hint_rejectedrU   Úlaunch_credentials_unavailableÚfieldÚ z (z: Úunavailablez).z'gateway.errors.generic_failed_with_hint)Úhint>   rr  éô  ))Ú_hmwa_stop_typing_for_turnr\   Ú	exceptionr5   re   rs   rW   rs  Úgateway.session_resultsrt  r'  rg   Úhas_input_ownerÚpersistence_session_idr)  rñ   rS   r.  rd   rò   r   ri   r_   Ú_STATUS_HINTSrX   r   Úagent.turn_failure_copyru  r  Úturnr   r{   ÚjsonrT  rH  ÚmathÚceilrU   r}  ÚdetailrÛ   )rq   rÕ   r*  r1   rt   ru   r+  rq  rs  rt  Ú_ownedÚ	_hint_keyÚstatus_hintru  Ú_turn_agentÚ	_err_jsonÚ
_resets_inr‹  s   &&&&&&&           r+   Ú_hmwa_agent_error_replyÚ3GatewayTurnPersistenceMixin._hmwa_agent_error_reply`  s  é € ð ×-Ñ-¨eÓ<×<Ð<Ü×ÑÐ4°kÔBÜ˜a °Ó5ˆØ˜*Ô$¬¨X×-=Ñ-=Ó)>ÀÔ)Cõ <ÝIÙ,Ñ-DÓ-FÓGÐGð	hØ×$Ñ$Ò0°]Ò5NØ#×7Ñ7×GÑGØ×3Ñ3°X×5OÑ5Oó ÷ �÷ Ø×2Ñ2×GÑGØ%×0Ñ0°$×2RÑ2RÐSXÔdh×dmÒdmÓdoÓ2pó÷ ð ð ×2Ñ2°=×3KÑ3KÔMgÓh×hÐhð ×&Ñ&×*Ñ*¨;Ó7ˆ	ß&/°KÀ3Ô4F”a˜	”lÈBˆØ˜#ÔÝDä! $×"5Ñ"5°kÓ"B×"GÑ"GÈÐRVÓWˆKÜ˜IÐ/CÄGÈKÐYcÐeiÓDjÓ/kÔlŠKØ˜CÔàˆIÜœ)×$Õ$ØŸJ™JŸO™OÓ-×1Ñ1°'¸2Ó>�	÷ %ä˜i¬×.Ò.Ø�	Ø"Ÿ™Ð':Ó;ˆJØ�}‰}˜VÓ$Ð(=Ô=ÜÐ BÓC‘ß 
¨Q¤ÛÜÐ HÐPT×PYÑPYÐZdÐgkÕZkÓPlÔm‘äÐ AÓB‘Ø˜CÔÜÐ:Ó;‰KÜ�Q˜ $Ó'Ð+KÔKÔPWÐXYÐ[bÐdh×PiÒPià˜aŸh™h˜Z r¨!¯'©'¨°"°Q·X±X×5NÐ5NÀÐ4OÈrÐRˆKÝEÙ(¨×)JÑ)JÜÐ7¸kÔJÔLfó*
ó ð 	òi 	=òòò iøÜô 	hÜ�L‰LÐWÐbfˆL×gð	hú÷ %×$Ð$üsŸ   ‚N—M˜A!NÁ:AM Â?MÃ M ÃAM ÄMÄ'M Å MÅM Å"NÅ(BNÇ.+M=ÈANÉ4B NÌ4NÍM ÍM ÍM Í"M:Í6NÍ9M:Í:NÍ=N	Î	Nc                óŠ   € \         P                  RT;'       g    RV4       V P                  V P                  V4      W#4       R# )zVA newer run generation superseded this turn: drop its deferred post-delivery callback.uK   Discarding stale agent result for %s â€” generation %d is no longer currentrV   N)r\   rc   Ú_pop_post_delivery_callbackrd  )rq   r1   rv   rw   s   &&&&r+   Ú_hmwa_discard_stale_resultÚ6GatewayTurnPersistenceMixin._hmwa_discard_stale_resultœ  s;   € ä�‰ØYØ×Ð˜#˜~ô	
ð 	×(Ñ(¨×)CÑ)CÀFÓ)KÈZÖhr-   r)   )NN)z%gateway.reasoning.quote_label_discordz-# z-#)z gateway.reasoning.quote_label_mdz> Ú>)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r‚   r¦   r®   rÂ   r×   rÛ   rê   rò   rú   r  r   r  Ústaticmethodr.  rE  rN  rY  rS  r‡  r”  r˜  Ú__static_attributes__r)   r-   r+   r9   r9   8   s»   † ÷Z>ð| 	ÐIØÐEðÐò
+\òZò.;ò>Aò
"ò ò#\òJ'ò:ò #ðJ ñó ðò4]Hð~ ôUó ðUòò*ð` 	Ð'ØÐ(ØÐ-ð€Mò:öxir-   r9   )FÚ__doc__Ú
__future__r   ÚloggingÚtypingr   rn   ÚdataclassesÚinspectrŠ  ÚosÚqueueÚ	threadingrd   Ú
agent.i18nr   rˆ  r   r   r   r   Úagent.session_activityr	   Ú
contextlibr
   r   Úcontextvarsr   Úgateway.configr   rç   r   Úgateway.platforms.baser   Úgateway.platforms.eventr   Úgateway.sessionr   r   r   r   Úgateway.session_transcriptr   Úgateway.turn_contextr   Úgateway.warning_notificationsr   Úgateway.turn_leaser   r   Úhermes_constantsr   Úpathlibr   r   r   r   r   r    r!   Úutilsr"   rW   r#   Úgateway.run_turn_runnerr$   Ú	getLoggerr\   r7   r9   r)   r-   r+   Ú<module>r»     s¢   ðÙ EÝ "ã Ý  Û Û Û Û Û 	Û Û Û Ý ÷ó õ =ß ,Ý $Ý #Ý IÝ 6Ý 0÷ó õ ;Ý ,Ý ?ß HÝ 5Ý ß =× =Ý #çÝ)Ý2ð 
×	Ò	˜=Ó	)€õ÷j	ió j	ir-   