+
    jHàj™5  ã            	      ó¤  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	t	^ RI
t
^ RIHt ^ RIHtHtHtHt ^ RIHtHt ^ RItR" U u/ uF!  p ]! ]V R4      f   K  ]! ]! ]V 4      4      V bK#  	  up tR]R&   R R	 ltR
 R ltR R ltR R ltR#R R lltR R ltRR/R R llt R R lt!R R lt"]3R R llt#R R lt$R  R! lt%R# u up i )$u‡  Shutdown forensics â€” capture context when the gateway receives SIGTERM/SIGINT.

``shutdown_signal_handler`` runs synchronously inside the asyncio loop, so
:func:`snapshot_shutdown_context` is a fast (<10ms) non-blocking probe and
:func:`spawn_async_diagnostic` is a fire-and-forget ``ps`` walk in a detached
subprocess. Anything that waits belongs in the async helper, never in the probe.
)ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptional)Ú"DEFAULT_GATEWAY_CRON_DRAIN_TIMEOUTÚ resolve_systemd_timeout_stop_seczdict[int, str]Ú_SIGNAL_NAME_BY_NUMc               ó    € V ^8„  d   QhRRRR/# )é   Úsigr   ÚreturnÚstr© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/gateway/shutdown_forensics.pyÚ__annotate__r      s   € ÷ Añ A�cð A˜cñ Aó    c                óœ   € V f   R#  \        V 4      p\        P                  TRT 24      #   \        \        3 d    \        T 4      u # i ; i)z6Human-readable signal name (``str(sig)`` as fallback).ÚUNKNOWNzsignal#)ÚintÚ	TypeErrorÚ
ValueErrorr   r
   Úget)r   Úsig_ints   & r   Ú_signal_namer      sS   € à
‚{ÙðÜ�c“(ˆô ×"Ñ" 7¨g°g°YÐ,?Ó@Ð@øô ”zÐ"ô Ü�3‹xŠðús   ˆ, ¬AÁ
Ac               ó$   € V ^8„  d   QhRRRRRR/# )r   Úpidr   Úkeyr   r   úOptional[str]r   )r   s   "r   r   r   *   s!   € ÷ ñ ˜#ð  Cð ¨Mñ r   c           	     ó¶  € \         P                  ! \        4      ;_uu_ 4        \        RV  R2RR7      ;_uu_ 4       pV F^  pVP	                  VR,           4      '       g   K#  VP                  R^4      ^,          P                  4       u uuRRR4       uuRRR4       # 	  RRR4       RRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i)zIRead a single field from /proc/<pid>/status.  Linux only; None elsewhere.z/proc/z/statusúutf-8©ÚencodingÚ:N)Ú
contextlibÚsuppressÚOSErrorÚopenÚ
startswithÚsplitÚstrip)r   r   ÚfhÚlines   &&  r   Ú_read_proc_fieldr/   *   s˜   € ä	×	Ò	œW×	%Õ	%¤t¨f°S°E¸Ð,AÈG×'TÕ'TÐXZÛˆDØ�‰˜s S�y×)Ô)Ø—z‘z # qÓ)¨!Õ,×2Ñ2Ó4Ñ4÷ (UÑ'T×	%Ò	%Ù÷ (U×	%ñ ÷	 (U×'Tú×	%Ö	%ñ ús4   £C½!B4	Á#(B4	Â
CÂ B4	Â"CÂ4CÂ?CÃC	c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   údict[str, Any]r   )r   s   "r   r   r   3   s   € ÷ ñ �sð ˜~ñ r   c                ó€  € RV /pV ^ 8:  d   V# R F  w  r#\        W4      ;pf   K  WAV&   K  	  \        V R4      ;pe:   \        P                  ! \        4      ;_uu_ 4        \	        V4      VR&   RRR4       \        V R4      ;pe%   V'       d   VP                  4       ^ ,          MTVR&   V#   + '       g   i     LF; i)u¢   Compact /proc/<pid> identity (pid, name, state, ppid, uid). Never reads cmdline/argv â€”
those bytes are not safe to persist (tokens, URIs, ``-e KEY=`` overlays).r   NÚPPidÚppidÚUidÚuid))ÚnameÚName)ÚstateÚState)r/   r&   r'   r   r   r+   )r   ÚsummaryÚout_keyÚproc_keyÚvaluer4   r6   s   &      r   Ú_proc_summaryr?   3   s­   € ð  % c˜l€GØ
ˆa„xØˆÛCÑˆÜ% cÓ4Ð4ˆEÔAØ$�GÓñ Dô !  fÓ-Ð-ˆÒ:Ü× Ò ¤×,Õ,Ü! $›iˆG�F‰O÷ -ä  UÓ+Ð+ˆÒ8ß+.˜Ÿ™› Qž°Cˆ�‰Ø€N÷	 -×,ús   Á B-Â-B=	c               ó    € V ^8„  d   QhRRRR/# )r   Úpathr   r   r    r   )r   s   "r   r   r   D   s   € ÷ ñ �tð  ñ r   c                óL   €  V P                  RR7      #   \         d     R# i ; i)z<Return the marker file's text, or None if absent/unreadable.z	utf-8-sigr#   N)Ú	read_textr(   )rA   s   &r   Ú_read_markerrD   D   s*   € ðØ�~‰~ {ˆ~Ó3Ð3øÜô Úðús   ‚ ”#¢#c               ó    € V ^8„  d   QhRRRR/# )r   Úreceived_signalr   r   r1   r   )r   s   "r   r   r   L   s   € ÷ 'ñ '¨sð '¸nñ 'r   c                ó2  € \         P                  ! 4       \         P                  ! 4       r!R\        P                  ! 4       R\        P                  ! 4       R\        V 4      RV e   \        V 4      MRRVRVR\        V4      R	\        V4      /pR FE  w  rE\         P                  P                  V4      '       g   K,  \         P                  V,          W4&   KG  	  \        \         P                  P                  R
4      4      ;'       g    V^8H  VR&   \        P                  ! \        \        4      ;_uu_ 4        \         P                  ! 4       ^ ,          VR&   RRR4       \        P                  ! \         \"        4      ;_uu_ 4        \%        VR4      ;pe]   VR8w  dV   VP'                  4       '       d   \        V4      MTVR&   VP'                  4       '       d   \        \        V4      4      MRVR&   RRR4       \        P                  ! \(        4      ;_uu_ 4        \         P*                  P-                  \         P                  P                  RR4      4      pV'       dr   \/        \1        V4      R,          4      pVe(   VR,          VR&   RV 2V9   ;'       g	    RV 2V9   VR&   \/        \1        V4      R,          4      pVe   VR,          VR&   RRR4       V#   + '       g   i     EL�; i  + '       g   i     EL; i  + '       g   i     T# ; i)zìFast (<10ms) snapshot of who/what is asking us to shut down: signal name/number, own + parent
/proc summaries, systemd parentage, takeover/planned-stop markers, TracerPid, 1-min load,
timestamps. Pure stdlib, never raises, never blocks.ÚtsÚts_monotonicÚsignalÚ
signal_numNr   r4   ÚparentÚselfÚINVOCATION_IDÚunder_systemdÚ
loadavg_1mÚ	TracerPidÚ0Ú
tracer_pidÚtracerÚHERMES_HOMEÚ z.gateway-takeover.json:Ni,  NÚtakeover_markerz"target_pid": z'target_pid': Útakeover_marker_for_selfz.gateway-planned-stop.jsonÚplanned_stop_marker))Úsystemd_invocation_idrN   )Úsystemd_journal_streamÚJOURNAL_STREAM)ÚosÚgetpidÚgetppidÚtimeÚ	monotonicr   r   r?   Úenvironr   Úboolr&   r'   r(   ÚAttributeErrorÚ
getloadavgr   r   r/   ÚisdigitÚ	ExceptionrA   Ú
expanduserrD   r   )	rF   r   r4   ÚctxÚctx_keyÚenv_keyrT   Úhermes_home_strÚraws	   &        r   Úsnapshot_shutdown_contextrn   L   s[  € ô —	’	“œRŸZšZ›\ˆàŒd�iŠi‹k˜>¬4¯>ª>Ó+;Ø”,˜Ó/Ø¨oÒ.I”c˜/Ô*ÈtØˆs�F˜D (¬M¸$Ó,?ÀÌÐWZÓI[ð	€CóKÑˆä�:‰:�>‰>˜'×"Ô"ÜŸ:™: gÕ.ˆC‹LñKô  ¤§
¡
§¡¨Ó ?Ó@×MÐMÀDÈAÁI€CˆÑä	×	Ò	œW¤n×	5Õ	5ÜŸMšM›O¨AÕ.ˆˆLÑ÷ 
6ô 
×	Ò	œY¬
×	3Õ	3Ü& s¨KÓ8Ð8ˆFÒEÈ&ÐTWÌ-Ø/5¯~©~×/?Ò/?¤ F¤ÀVˆC�ÑØ:@¿.¹.×:JÒ:JœM¬#¨f«+Ô6ÐPTˆC�‰M÷ 
4ô 
×	Ò	œY×	'Õ	'ÜŸ'™'×,Ñ,¬R¯Z©Z¯^©^¸MÈ2Ó-NÓOˆßÜœt OÓ4Ð7OÕOÓPˆCØŠØ),¨T­�Ð%Ñ&Ø5CÀCÀ5Ð3IÈSÑ3P÷ 4Tð 4TØ8FÀsÀeÐ6LÐPSÑ6Sð Ð.Ñ/äœt OÓ4Ð7SÕSÓTˆCØŠØ-0°­Y�Ð)Ñ*÷ 
(ð €J÷+ 
6×	5Ð	5ú÷ 
4×	3Ð	3ú÷ 
(Ö	'ð €Jús7   Ä6 KÆ-K1Æ3%K1ÇK1ÈA?LÊ7LËK.	Ë1L	ÌL	c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úsignal_namer   Úself_pidr   r   r   )r   s   "r   r   r   v   s!   € ÷ ñ ¨#ð ¸ð Àñ r   c                ó   € RV  RV R2# )u^   POSIX listing used by the detached diagnostic. Columns are identity/resource only â€” no argv.z echo '=== shutdown diagnostic @ zÿ ==='; echo '--- date ---'; date -u +%Y-%m-%dT%H:%M:%SZ; echo '--- ps (top 60 by cpu, comm only) ---'; ps -eo pid,ppid,user,pcpu,pmem,stat,comm 2>/dev/null | { IFS= read -r h; echo "$h"; sort -nrk4; } | head -60; echo '--- pstree of self ---'; pstree -pl a&   2>/dev/null | head -40 || true; echo '--- loadavg ---'; cat /proc/loadavg 2>/dev/null || sysctl -n vm.loadavg 2>/dev/null || true; echo '--- recent dmesg (oom/killed) ---'; dmesg -T 2>/dev/null | tail -20 || journalctl --user -n 20 --no-pager 2>/dev/null | tail -20 || true; echo '=== end ==='r   )rp   rq   s   &&r   Ú_async_diagnostic_scriptrs   v   s&   € ð +¨;¨-ð 85ð 6>°Jð ?ð
	ðr   Útimeout_secondsg      @c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úlog_pathr   rp   r   rt   Úfloatr   úOptional[int]r   )r   s   "r   r   r   ‡   s*   € ÷ "ñ " Tð "¸ð "Ø,1ð"Ø<Iñ"r   c          	     ó˜  €  V P                   P                  RRR7       \        P                  R8X  d   R# \        T\        P                  ! 4       4      p \        P                  ! \        T 4      \        P                  \        P                  ,          \        P                  ,          R4      p\        P                  ! \        4      ;_uu_ 4        \        P                  ! TR4       RRR4       \         P"                  ! R4      ;'       g    \         P"                  ! R4      pT'       d   YRR .M. p \$        P&                  ! . TOR	NR
NTNT\$        P(                  \$        P*                  RRR7      P,                   \        P                  ! \        4      ;_uu_ 4        \        P.                  ! T4       RRR4       #   \         d     R# i ; i  \         d     R# i ; i  + '       g   i     EL; i  + '       g   i     # ; i  \         dZ     \        P                  ! \        4      ;_uu_ 4        \        P.                  ! T4       RRR4       R#   + '       g   i     R# ; ii ; i  \        P                  ! \        4      ;_uu_ 4        \        P.                  ! T4       RRR4       i   + '       g   i     i ; i; i)a®  Fire-and-forget ``ps``-style snapshot appended to ``log_path``: a detached subprocess (own
``timeout`` so a wedged ``ps`` self-cleans) rather than a blocking process listing in the signal
handler, which can freeze the loop >2s on a busy host. Returns the subprocess PID, or ``None``
on failure / Windows (bash -c is available on every POSIX target; Windows has no ps anyway).
The listing is comm-only: full argv is not persisted.
T)ÚparentsÚexist_okNÚwin32i€  ÚtimeoutÚgtimeoutz.0fÚbashz-c)ÚstdoutÚstderrÚstdinÚstart_new_sessionÚ	close_fds)rL   Úmkdirr(   ÚsysÚplatformrs   r]   r^   r)   r   ÚO_WRONLYÚO_CREATÚO_APPENDr&   r'   ÚfchmodÚshutilÚwhichÚ
subprocessÚPopenÚSTDOUTÚDEVNULLr   Úclose)rv   rp   rt   ÚscriptÚfdÚtimeout_binÚbounds   &&$    r   Úspawn_async_diagnosticr—   ‡   sä  € ðØ�‰×Ñ d°TÐÔ:ô ‡|�|�wÔÙÜ% k´2·9²9³;Ó?€FðÜ�WŠW”S˜“]¤B§K¡K´"·*±*Õ$<¼r¿{¹{Õ$JÈEÓRˆô 
×	Ò	œW×	%Õ	%Ü
�	Š	�"�eÔ÷ 
&ô —,’,˜yÓ)×EÐE¬V¯\ª\¸*Ó-E€Kß7Bˆ[¨SÐ1Ñ3È€Eð	Ü×ÒØ*ˆeÐ*�VÐ*˜TÐ* 6Ð*°2Ü×$Ñ$¬J×,>Ñ,>ÐRVØô÷  ™Cð	 ô × Ò ¤×)Õ)Ü�HŠH�RŒL÷ *Ð)øô/ ô Úðûô ô Úðúç	%×	%Ð	%ú÷ *×)ûô ô Øä× Ò ¤×)Õ)Ü�HŠH�RŒL÷ *×)×)Ò)úðûô × Ò ¤×)Õ)Ü�HŠH�RŒL÷ *×)×)Ð)ýs…   ‚G ÁAG ÃG%Ä5A	H Æ!G9ÇGÇGÇG"Ç!G"Ç%G6	Ç9H	ÈI0ÈI3 È:IÉI,	É/I0É0I3 É3#K	ÊJ6	Ê-	K	Ê6KËK	c               ó    € V ^8„  d   QhRRRR/# ©r   ri   r1   r   r   r   )r   s   "r   r   r   ¬   s   € ÷ ñ  ð °3ñ r   c                óò  € V P                  R4      ;'       g    / p\        V P                  R4      ;p\        \        34      '       d   VR MRp. pV P                  R4      e0   V P                  R4      '       d   RMRpVP	                  R	V 24       V P                  R
4      e   VP	                  R4       V P                  R4      '       d   VP	                  RV R,           24       V'       d   RRP                  V4      ,           MRpRV P                  RR4       RV P                  R4      '       d   RMR RVP                  R4      ;'       g    R RVP                  R4      ;'       g    R RV V 2# )zWRender a shutdown context dict as one scannable log line (parent identity, never argv).rL   rP   z.2fÚ?rW   rX   rM   Úotherztakeover_marker_present=rY   zplanned_stop_marker_present=yesrS   ztracer_pid=Ú rV   zsignal=rJ   z under_systemd=rO   ÚyesÚnoz parent_pid=r   z parent_name=r7   z loadavg_1m=)r   Ú
isinstancer   rw   ÚappendÚjoin)ri   rL   ÚloadÚload_strÚextrasÚwhoÚ
extras_strs   &      r   Úformat_context_for_logr¨   ¬   sX  € à�W‰W�XÓ×$Ð$ "€FÜ *°3·7±7¸<Ó3HÐ+H¨4Ì3ÔPUÈ,× WÒ W�$�s‘Ð]`€HØ€FØ
‡w�wÐ Ó!Ò-ØŸ™Ð :×;Ò;‰fÀˆØ�‰Ð0°°Ð6Ô7Ø
‡w�wÐ$Ó%Ò1Ø�‰Ð7Ô8Ø
‡w�wˆ|×ÒØ�‰˜ C¨Õ$5Ð#6Ð7Ô8ß-3�#˜Ÿ™ Ó(Ö(¸€Jà
�#—'‘'˜( CÓ(Ð)¨À#Ç'Á'È/×BZÒBZ¹Ð`dÐ8eð fØ—j‘j Ó'×.Ð.¨3Ð/¨}¸V¿Z¹ZÈÓ=O×=VÐ=VÐSVÐ<Wð XØ�Z 
˜|ð	-ðr   c               ó    € V ^8„  d   QhRRRR/# r™   r   )r   s   "r   r   r   À   s   € ÷ ñ ˜ð ¨Cñ r   c                ón   €  \         P                  ! V \        RR7      #   \        \        3 d     R# i ; i)zFJSON-serialise a context dict for structured ingestion.  Never raises.T)ÚdefaultÚ	sort_keysz{})ÚjsonÚdumpsr   r   r   )ri   s   &r   Úcontext_as_jsonr¯   À   s1   € ðÜ�zŠz˜#¤s°dÔ;Ð;øÜ”zÐ"ô Úðús   ‚ Ÿ4³4c               ó$   € V ^8„  d   QhRRRRRR/# )r   Údrain_timeoutrw   Úcron_drain_timeoutr   zOptional[dict[str, Any]]r   )r   s   "r   r   r   È   s$   € ÷ 5ñ 5Øð5Ø.3ð5àñ5r   c                ó^  € \         P                  P                  R4      '       g   R# Rp\        P                  ! \
        4      ;_uu_ 4        \        RRR7      ;_uu_ 4       pV FH  p\        VP                  4       P                  R4      4      p\        R V 4       R4      pV'       g   KH   M	  RRR4       RRR4       V'       d   \        V4      MR;pf   R# VR,          p\        \        W4      4      pR	VR
VRV RVRVRWx8  /#   + '       g   i     L`; i  + '       g   i     Lk; i)aÁ  At startup, sanity-check that systemd's TimeoutStopSec covers stop. A stale unit file
(upgraded without re-running ``hermes setup``) can have ``TimeoutStopSec`` below the stop
budget, so systemd SIGKILLs the cgroup mid-drain (a phantom ``code=killed status=9`` in the
journal). ``None`` when aligned OR undeterminable (not under systemd, no ``systemctl``);
otherwise a dict with ``timeout_stop_sec``/``drain_timeout``/``expected_min``/``mismatch``.
rN   Nz/proc/self/cgroupr"   r#   Ú/c              3  óV   "  € T F  qP                  R 4      '       g   K  Vx € K!  	  R# 5i)z.serviceN)Úendswith)Ú.0Úps   & r   Ú	<genexpr>Ú1check_systemd_timing_alignment.<locals>.<genexpr>Ø   s   é € ÐI© A·*±*¸Z×2HŸaša«ùs   ‚)Ÿ
)g    €„.AÚunitÚtimeout_stop_secr±   r²   Úexpected_minÚmismatch)r]   rb   r   r&   r'   r(   r)   Úreversedr,   r+   ÚnextÚ_systemd_timeout_stop_usrw   r	   )	r±   r²   Ú	unit_namer-   r.   ÚpartsÚ
timeout_usr¼   Úexpecteds	   &&       r   Úcheck_systemd_timing_alignmentrÆ   È   sü   € ô �:‰:�>‰>˜/×*Ò*Ùà#€IÜ	×	Ò	œW×	%Õ	%¤tÐ,?È'×'RÕ'RÐVXÛˆDÜ˜TŸZ™Z›\×/Ñ/°Ó4Ó5ˆEÜÑI©ÓIÈ4ÓPˆIß‰yÙñ	 ÷ (S×	%÷ >GÔ.¨yÔ9ÈDÐPˆ
ÒYÙØ! KÕ/ÐÜÔ5°mÓXÓY€HØ�IÐ1Ð3CÀ_ÐVcØ Ð"4°nÀhØÐ(Ñ3ð5ð 5÷ (S×'Rú×	%×	%ús+   ÁDÁ"AD		Â-D		Â1DÄ	DÄDÄD,	c               ó    € V ^8„  d   QhRRRR/# )r   rÂ   r   r   rx   r   )r   s   "r   r   r   ä   s   € ÷ ñ ¨ð °ñ r   c                ó  € R.. 3 FÔ  p \         P                  ! R.VORNV NRNRRRRRR	R
7      pTP                  ^ 8X  d   TP
                  P                  4       MR Fy  pTP                  R4      '       g   K  TP                  R^4      ^,          P                  4       pTP                  4       '       d   \        T4      M
\        T4      pTf   Ku  Tu u # 	  KÖ  	  R#   \         P                  \        3 d     Kø  i ; i)zW``TimeoutStopUSec`` of ``unit_name`` in microseconds; ``--user`` first (hermes' usual).z--userÚ	systemctlÚshowz--property=TimeoutStopUSecTr"   Úreplaceg       @F)Úcapture_outputÚtextr$   Úerrorsr}   ÚcheckzTimeoutStopUSec=Ú=Nr   )rŽ   ÚrunÚTimeoutExpiredr(   Ú
returncoder€   Ú
splitlinesr*   r+   r,   rf   r   Úparse_systemd_duration_to_us)rÂ   ÚflagÚresultr.   r>   rÄ   s   &     r   rÁ   rÁ   ä   sö   € à�˜RÓ ˆð	Ü—^’^ØÐU˜tÐU VÐU¨YÐUÐ8TÐUØ#¨$¸ÈÐ\_ØôˆFð 39×2CÑ2CÀqÔ2H�F—M‘M×,Ñ,Ô.ÈbÒPˆDØ�‰Ð1×2Ô2ØŸ
™
 3¨Ó*¨1Õ-×3Ñ3Ó5�Ø+0¯=©=¯?ª?œS œZÔ@\Ð]bÓ@c�
ØÔ)Ø%Ô%ó Qñ !ñ  øô ×)Ñ)¬7Ð3ô 	Úð	ús   Š&C Ã C?Ã>C?c               ó    € V ^8„  d   QhRRRR/# )r   rm   r   r   rx   r   )r   s   "r   r   r   ù   s   € ÷ ".ñ ". cð ".¨mñ ".r   c                ó   aaaa€ V '       g   R# R^RRRRRRRR	R
RRRRRRRRRRR/o^ RRuoooR VVVV3R llpV R,            F~  pVP                  4       '       g   VR8X  d$   S'       d   V! 4       '       g    R# SV,          oKC  VP                  4       '       d   SV,          oKd  S'       g   Kn  V! 4       '       d   K}   R# 	  S^ 8”  d   S# R# )zùParse 'TimeoutStopUSec=1min 30s' / '90s' style values to microseconds. Covers us, ms, s, min,
h, d, w, month, y; a bare number is seconds. None on anything unexpected; never raises. Public: also consumed by
hermes_cli.gateway's restart-wait sizing.
NÚusÚmsiè  Úsé@B ÚsecÚmini ‡“Úhl    $'- ÚhrÚdl    `®;P Úwl     Ç!3Úmonthl    z–‘	Úyl    8'ÎrrV   c               ó   € V ^8„  d   QhRR/# )r   r   rc   r   )r   s   "r   r   Ú2parse_systemd_duration_to_us.<locals>.__annotate__  s   € ÷ 
ñ 
�Dñ 
r   c                 óô   <€ S'       d    SP                  SP                  4       4      MR p V e	   S'       g   R#  S\        \        S4      V ,          4      ,          oR;ooR#   \        \
        3 d     R# i ; i)rÝ   FrV   T)r   Úlowerr   rw   r   ÚOverflowError)Ú
multiplierÚdigitsÚtokenÚtotal_usÚunitss    €€€€r   Ú_flushÚ,parse_systemd_duration_to_us.<locals>._flush  sk   ø€ ç16�U—Y‘Y˜uŸ{™{›}Ô-¸Iˆ
ØÒ§VÙð	ØœœE &›M¨JÕ6Ó7Õ7ˆHð Ðˆ�Ùøô œMÐ*ô 	Úð	ús   º"A" Á"A7Á6A7r�   Ú.)rf   Úisalpha)rm   rð   Úchrì   rí   rî   rï   s   &  @@@@r   rÕ   rÕ   ù   sÎ   û€ ÷
 ÙØ�1�d˜E 3¨	°5¸)Ø�J  ]°D¸-à�. # ØÐ'¨Ð.@ð	B€Eð
    RÐ€Hˆe�V÷
ó 
ð �C�iˆiˆØ�:‰:�<Š<˜2 œ9ß™VŸXšXÚØ�b�LŠFØ�Z‰Z�\Š\Ø�R�KŠEß‰V™FŸHœHÚñ ð   !”|ˆ8Ð-¨Ð-r   )ÚSIGTERMÚSIGINTÚSIGHUPÚSIGQUITÚSIGUSR1ÚSIGUSR2)N)&Ú__conditional_annotations__Ú__doc__Ú
__future__r   r­   r]   rŒ   rJ   rŽ   r†   r`   Úpathlibr   Útypingr   r   r   r   Úgateway.restartr   r	   r&   Úgetattrr   r
   Ú__annotations__r   r/   r?   rD   rn   rs   r—   r¨   r¯   rÆ   rÁ   rÕ   )Ú_namerû   s   0@r   Ú<module>r     sÎ   øðôõ #ã Û 	Û Û Û Û 
Û Ý ß ,Ó ,ç `Û ñ Ró'áQˆÙˆv�u˜dÓ#ô '�C‰�˜ÓÓ Ò&ÙQñ'Ð �^ó õAõõõ"÷'õTð""Ø47÷"õJõ(ð 7Y÷5õ8÷*".ùòC's   ÁCÁC