Ë
    @çi)9  ã                   óR  — d Z ddlmZmZ ddlmZmZ ddlZddlm	Z	 ddl
Z
ddlZddlZddlZddlZddlmZ ddlZddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ ddlmZm Z   ejB                  e"«      Z# G d„ d«      Z$ G d„ d«      Z%de&fd„Z'e G d„ d«      «       Z( G d„ d«      Z)y)z)Scheduling and job monitoring utilities.
é    )ÚcontextmanagerÚ	ExitStack)Ú	dataclassÚfieldN)ÚPath)ÚSlurmJobé   )Úgit_save)ÚSlurmConfigÚSubmitRules)Úget_distrib_spec)ÚDecoratedMain)Útry_load)ÚXPÚ_get_sigc                   ó<   — e Zd Zdedej
                  e   fd„Zd„ Zy)Ú_SubmitItTargetÚmainÚargvc                 óÄ   — |j                  |«      | _        t        «       }t        |j                  «      t
        j                  d<   |t        j                  dd   |«        y )NÚRANKr	   )	Úget_xpÚxpr   ÚstrÚrankÚosÚenvironÚsysr   )Úselfr   r   Úspecs       ú^/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/dora/shep.pyÚ__call__z_SubmitItTarget.__call__#   sF   € Ø—+‘+˜dÓ#ˆŒÜÓ!ˆô ! §¡›^Œ�
‰
�6ÑØŒ�‰��ˆÙ�ó    c                 ó  — t        «       j                  dk(  rH| j                  j                  j	                  «       r$| j                  j                  j                  «        t        j                  j                  | g|¢­i |¤ŽS )Nr   )	r   r   r   Úrendezvous_fileÚexistsÚunlinkÚsubmititÚhelpersÚDelayedSubmission)r   ÚargsÚkwargss      r!   Ú
checkpointz_SubmitItTarget.checkpoint,   s`   € ÜÓ×"Ñ" aÒ'à�w‰w×&Ñ&×-Ñ-Ô/Ø—‘×'Ñ'×.Ñ.Ô0Ü×Ñ×1Ñ1°$ÐH¸ÒHÀÑHÐHr#   N)	Ú__name__Ú
__module__Ú__qualname__r   ÚtpÚSequencer   r"   r-   © r#   r!   r   r   "   s$   „ ð˜]ð °"·+±+¸cÑ2Bó óIr#   r   c                   óX   — e Zd ZdZdefd„Zedefd„«       Zdd„Z	dd„Z
ed„ «       Zd	„ Zy
)ÚSheepz[
    A Sheep is a specific run for a given XP. Sheeps are managed
    by the Shepherd.
    r   c                 óÜ   — || _         d | _        d | _        | j                  j	                  «       r=t        | j                  «      }t        |t        «      r|\  | _        | _        y || _        y y ©N)r   ÚjobÚ_other_jobsÚ	_job_filer&   r   Ú
isinstanceÚtuple)r   r   Úcontents      r!   Ú__init__zSheep.__init__9   s[   € ØˆŒØ37ˆŒàDHˆÔØ�>‰>× Ñ Ô"Ü˜tŸ~™~Ó.ˆGÜ˜'¤5Ô)Ø-4Ñ*�”˜$Õ*à"�•ð #r#   Úreturnc                 ó„   — | j                   j                  | j                   j                  j                  j                  z  S r7   )r   ÚfolderÚdoraÚshepÚjob_file©r   s    r!   r:   zSheep._job_fileE   s)   € à�w‰w�~‰~ §¡§¡× 1Ñ 1× :Ñ :Ñ:Ð:r#   c                 ó  — | j                   €y| j                   j                  j                  | j                   j                  |«      }|dk(  r*| j                  rt        d„ | j                  D «       «      rd}|j                  d«      ry|S )z1Return the current state of the `Sheep`.
        NÚUNKNOWNc              3   ó:   K  — | ]  }|j                   d k7  –— Œ y­w)rG   N)Ústate)Ú.0r8   s     r!   Ú	<genexpr>zSheep.state.<locals>.<genexpr>P   s   è ø€ ÐFÑ5E¨c�3—9‘9 	Õ)Ñ5Eùs   ‚ÚMISSINGÚ	CANCELLED)r8   ÚwatcherÚ	get_stateÚjob_idr9   ÚanyÚ
startswith)r   ÚmoderI   s      r!   rI   zSheep.stateI   sv   € ð �8‰8ÐØØ—‘× Ñ ×*Ñ*¨4¯8©8¯?©?¸DÓAˆØ�IÒ $×"2Ò"2ÜÑF°T×5EÒ5EÓFÔFð "�Ø×Ñ˜KÔ(ØØˆr#   c                 ó�   — | j                   €y| j                   j                  j                  | j                   j                  |«      S )zDReturn True if the job is no longer running on the cluster.
        T)r8   rN   Úis_donerP   )r   rS   s     r!   rU   zSheep.is_doneY   s6   € ð �8‰8ÐØØ�x‰x×Ñ×'Ñ'¨¯©¯©¸Ó>Ð>r#   c                 ó|   — | j                   �0| j                  j                  | j                   j                  › d�z  S y)z)Return the path to the main log.
        Nz
_0_log.out)r8   r   r(   rP   rE   s    r!   Úlogz	Sheep.log`   s6   € ð �8‰8ÐØ—7‘7×#Ñ#¨¯©¯©Ð(9¸Ð&DÑDÐDØr#   c                 óè   — d| j                   j                  › d| j                  «       › d�}| j                  �|d| j                  j                  › d�z  }|d| j                   j
                  › d�z  }|S )NzSheep(z, state=z, zsid=zargv=Ú))r   ÚsigrI   r8   rP   r   )r   Úouts     r!   Ú__repr__zSheep.__repr__h   sj   € Ø�t—w‘w—{‘{�m 8¨D¯J©J«L¨>¸Ð<ˆØ�8‰8ÐØ�T˜$Ÿ(™(Ÿ/™/Ð*¨"Ð-Ñ-ˆCà��t—w‘w—|‘|�n AÐ&Ñ&ˆØˆ
r#   N)Ústandard)r.   r/   r0   Ú__doc__r   r>   Úpropertyr   r:   rI   rU   rW   r\   r3   r#   r!   r5   r5   4   sQ   „ ñð
#˜2ó 
#ð ð;˜4ò ;ó ð;óó ?ð ñó ðór#   r5   Úxc                  ó   — y)z7No logging logging function, passed to `Shepherd`.
    Nr3   )r`   s    r!   Úno_logrb   q   s   € ð 	r#   c                   óN   — e Zd ZU eed<    ee¬«      Zej                  e
   ed<   y)Ú	_JobArrayÚslurm_config)Údefault_factoryÚsheepsN)r.   r/   r0   r   Ú__annotations__r   Úlistrg   r1   ÚListr5   r3   r#   r!   rd   rd   w   s   … àÓÙ"°4Ô8€FˆB�G‰G�E‰NÔ8r#   rd   c                   óÔ  — e Zd ZdZefdedej                  egdf   fd„Z	dej                  e   defd„Zd	edej                  e   fd
„Zdedej                  e   fd„Zd„ Zedefd„«       Zdededefd„Zdej.                  fd„Zd„ Zedefd„«       Zedefd„«       Zedefd„«       Zdej>                  e   fd„Z dedededejB                  fd„Z"d„ Z#edefd„«       Z$d e%fd!„Z&y)"ÚShepherdzÖ
    Takes care of the little jobs.

    Args:
        main (DecoratedMain): main function decorated by Dora.
        log (callable): log function, if provided should take a single string
            argument.
    r   rW   Nc                 ó&  — || _         | j                  j                  dd¬«       | j                  j                  dd¬«       | j                  j                  dd¬«       || _        d| _        d | _        g | _        g | _	        | j                  «        y )NT)Úexist_okÚparentsF)r   Ú_by_idÚmkdirÚ_orphansÚ_arraysrW   Ú_in_job_arrayÚ_existing_git_cloneÚ
_to_cancelÚ
_to_submitÚ_check_orphans)r   r   rW   s      r!   r>   zShepherd.__init__†   s   € ØˆŒ	Ø�‰×Ñ 4°ÐÔ6Ø�‰×Ñ T°4ÐÔ8Ø�‰×Ñ D°$ÐÔ7ØˆŒà#(ˆÔØ6:ˆÔ Ø68ˆŒØ.0ˆŒà×ÑÕr#   r   r?   c                 ór   — t        |t        «      rJ ‚| j                  j                  |«      }t	        |«      S )zÄ
        Given a list of of arguments, return the matching `Sheep`,
        which will contain both information on the `dora.xp.XP`, and on
        the latest job associated with that XP.
        )r;   r   r   r   r5   )r   r   r   s      r!   Úget_sheep_from_argvzShepherd.get_sheep_from_argv”   s2   € ô ˜d¤CÔ(Ð(Ð(Ø�Y‰Y×Ñ˜dÓ#ˆÜ�R‹yÐr#   rZ   c                 óN   — | j                   j                  |«      }t        |«      S )zj
        Returns a `Sheep` given the XP signature, if any exists, otherwise
        returns None.
        )r   Úget_xp_from_sigr5   )r   rZ   r   s      r!   Úget_sheep_from_sigzShepherd.get_sheep_from_sigž   s"   € ð
 �Y‰Y×&Ñ& sÓ+ˆÜ�R‹yÐr#   rP   c                 óÂ   — | j                   |z  }|j                  «       r@|j                  «       j                  }| j                  j                  |«      }t        |«      S y)zu
        Returns the `Sheep` associated with the given `job_id`. If no sheep
        is found, returns None.
        N)rp   Ú
is_symlinkÚresolveÚnamer   r|   r5   )r   rP   ÚlinkrZ   r   s        r!   Úget_sheep_from_job_idzShepherd.get_sheep_from_job_id¦   sN   € ð
 �{‰{˜VÑ#ˆØ�?‰?ÔØ—,‘,“.×%Ñ%ˆCØ—‘×*Ñ*¨3Ó/ˆBÜ˜“9ÐØr#   c                 ó@   — t         j                  j                  «        y)zB
        Force an update of all job states with submitit.
        N)r   rN   ÚupdaterE   s    r!   r…   zShepherd.update²   s   € ô 	×Ñ×ÑÕ!r#   re   c              #   ó®   K  — | j                   rJ ‚| j                  j                  t        |«      «       d| _         	 d–— d| _         y# d| _         w xY w­w)z*Context manager to launch XP in job array.TNF)rt   rw   Úappendrd   )r   re   s     r!   Ú	job_arrayzShepherd.job_array¸   sN   è ø€ ð ×%Ò%Ð%Ð%Ø�‰×Ñœy¨Ó6Ô7Ø!ˆÔð	'Ûà!&ˆDÕø ˆDÕüs   ‚:A½A	 ÁAÁ		AÁAÚsheepÚrulesc                 ó  — |j                   �÷|j                  «       }|dk(  r@|j                  rÖt        j	                  d|j                   j
                  › �«       d|_         n¢|dv rAt        j	                  d|j                   j
                  › d�«       |j                  red|_         n]|j                  rQt        j	                  d|j                   j
                  › d|› �«       | j                  |j                   «       d|_         |j                   €w| j                  s$| j                  j                  t        |«      «       || j                  d	   j                  k(  sJ ‚| j                  d	   j                  j                  |«       yy)
zÈ
        Decides whether to schedule a new job for the given sheep, based on the rules
        given in `rules`.
        Jobs are actually only scheduled once the `commit()` method is called.
        NÚ	COMPLETEDz"Ignoring previously completed job )ÚFAILEDrM   ÚOUT_OF_MEMORYÚTIMEOUTrL   Ú	NODE_FAILzPrevious job z failed or was canceledzCancelling previous job z with status éÿÿÿÿ)r8   rI   Úreplace_doneÚloggerÚdebugrP   ÚretryÚreplaceÚcancel_lazyrt   rw   r‡   rd   re   rg   )r   r‰   re   rŠ   rI   s        r!   Úmaybe_submit_lazyzShepherd.maybe_submit_lazyÃ   s<  € ð �9‰9Ð Ø—K‘K“MˆEØ˜Ò#Ø×%Ò%Ü—L‘LÐ#EÀeÇiÁi×FVÑFVÐEWÐ!XÔYØ $�E•IØð (ñ (ä—‘˜}¨U¯Y©Y×-=Ñ-=Ð,>Ð>UÐVÔWØ—;’;Ø $�E•Ià—=’=Ü—L‘LÐ#;¸E¿I¹I×<LÑ<LÐ;MÈ]Ð[`ÐZaÐ!bÔcØ×$Ñ$ U§Y¡YÔ/Ø $�E”Ià�9‰9ÐØ×%Ò%Ø—‘×&Ñ&¤y°Ó'>Ô?Ø 4§?¡?°2Ñ#6×#CÑ#CÒCÐCÐCØ�O‰O˜BÑ×&Ñ&×-Ñ-¨eÕ4ð	 r#   r8   c                 ó:   — | j                   j                  |«       y)z]
        Cancel a job. The job is actually cancelled only when `commit()` is called.
        N)rv   r‡   )r   r8   s     r!   r—   zShepherd.cancel_lazyà   s   € ð 	�‰×Ñ˜sÕ#r#   c                 óú   — | j                   r"| j                  | j                   «       g | _         d| _        | j                  r:| j                  j	                  d«      }| j                  |«       | j                  rŒ9yy)zu
        Commit all changes registered so far with either `maybe_submit_lazy()`
        and `cancel_lazy()`.
        Nr   )rv   Ú_cancelru   rw   ÚpopÚ_submit)r   rˆ   s     r!   ÚcommitzShepherd.commitæ   sZ   € ð
 �?Š?Ø�L‰L˜Ÿ™Ô)Ø ˆDŒOà#'ˆÔ Ø�oŠoØŸ™×+Ñ+¨AÓ.ˆIØ�L‰L˜Ô#ð �o�or#   c                 ó˜   — | j                   j                  j                  | j                   j                  j                  j                  z  S r7   )r   rB   ÚdirrC   Úby_idrE   s    r!   rp   zShepherd._by_idô   s/   € à�y‰y�~‰~×!Ñ! D§I¡I§N¡N×$7Ñ$7×$=Ñ$=Ñ=Ð=r#   c                 ó˜   — | j                   j                  j                  | j                   j                  j                  j                  z  S r7   )r   rB   r    rC   ÚorphansrE   s    r!   rr   zShepherd._orphansø   s/   € à�y‰y�~‰~×!Ñ! D§I¡I§N¡N×$7Ñ$7×$?Ñ$?Ñ?Ð?r#   c                 ó˜   — | j                   j                  j                  | j                   j                  j                  j                  z  S r7   )r   rB   r    rC   ÚarraysrE   s    r!   rs   zShepherd._arraysü   s/   € à�y‰y�~‰~×!Ñ! D§I¡I§N¡N×$7Ñ$7×$>Ñ$>Ñ>Ð>r#   Újobsc                 óÂ   — dg|D �cg c]  }|j                   ‘Œ c}z   }t        j                  ddj                  |«      «       t	        j
                  |d¬«       y c c}w )NÚscancelz
Running %sÚ T©Úcheck)rP   r“   r”   ÚjoinÚspÚrun)r   r¦   r8   Ú
cancel_cmds       r!   r›   zShepherd._cancel   sL   € Ø�[¹$Ó#?¹$°3 C§J£J¸$Ñ#?Ñ?ˆ
Ü�‰�\ 3§8¡8¨JÓ#7Ô8Ü
�‰ˆz Ö&ùò $@s   ‡Ar�   rA   c                 óv  — dt         j                  d<   t        |j                  «      }t	        j
                  ||j                  d«      ¬«      }|j                  }|dkD  r|dz  dk7  rt        d«      ‚|dz  |d<   d}n|}d	|d<   |j                  }|r|j                  |z  }	|	› d
�|d<   d|› �|d<   |j                  r$d	|d<   |j                  €3||j                  z  |d<   n ||d<   |j                  €|j                  |d<   |d= |d= |d= |d= t        j                  d|«        |j                  d|ddœ|¤Ž |S )NÚ1ÚSLURM_KILL_BAD_EXITÚmax_num_timeout)rA   r³   é   r   z.Can only take <= 8 gpus, or multiple of 8 gpusÚnodesr	   ÚGBÚmemzgpu:ÚgresÚntasks_per_nodeÚcpus_per_taskÚgpusÚmem_per_gpuÚcpus_per_gpuÚone_task_per_nodezSlurm parameters %rT)Újob_nameÚstderr_to_stdoutr3   )r   r   ÚdictÚ__dict__r(   ÚSlurmExecutorrœ   r»   Ú
ValueErrorr¼   r¾   rº   r½   r“   r”   Úupdate_parameters)
r   r�   rA   re   r,   Úexecutorr»   Úgpus_per_noder¼   r·   s
             r!   Ú_get_submitit_executorzShepherd._get_submitit_executor  s~  € à,/Œ�
‰
Ð(Ñ)Ü�l×+Ñ+Ó,ˆÜ×)Ñ)Ø¨6¯:©:Ð6GÓ+HôJˆà× Ñ ˆØ�!Š8Ø�a‰x˜1Š}Ü Ð!QÓRÐRØ" a™iˆF�7‰OØ‰Mà ˆMØˆF�7‰OØ"×.Ñ.ˆÙØ×*Ñ*¨]Ñ:ˆCØ"˜e 2˜JˆF�5‰MØ ˜Ð/ˆˆv‰Ø×)Ò)Ø()ˆFÐ$Ñ%Ø×)Ñ)Ð1Ø*7¸,×:SÑ:SÑ*S��Ò'à(5ˆFÐ$Ñ%Ø×)Ñ)Ð1Ø*6×*CÑ*C��Ñ'Ø�6ˆNØ�=Ð!Ø�>Ð"ØÐ&Ð'Ü�‰Ð*¨FÔ3à"ˆ×"Ñ"ð 	ØØ!ñ	ð ò	ð ˆr#   c                 ó  — | j                   j                  «       D ]æ  }|j                  }t        j	                  d|› d�«       t        j                  ddt        j                  «       d|dddgd	d	¬
«      }|j                  j                  «       j                  «       j                  d«      D �cg c]  }|sŒ|‘Œ	 }}|r4t        j	                  d|› d�«       t        j                  dg|z   d	¬«       |j                  «        Œè yc c}w )zCheck for orphaned jobs.zFound dirty tag z`, meaning a job might have been scheduled but Dora or Slurm crashed before the job id was saved.Úsqueuez-uz-nz-oz%iz-hT)Úcapture_outputr«   Ú
zFound orphan job ids z, will cancelr¨   rª   N)rr   Úiterdirr�   r“   Úwarningr­   r®   r   ÚgetloginÚstdoutÚdecodeÚstripÚsplitr'   )r   Údirtyr�   ÚprocÚlineÚidss         r!   rx   zShepherd._check_orphans-  sæ   € à—]‘]×*Ñ*Ö,ˆEØ—:‘:ˆDÜ�N‰NÐ-¨d¨Vð 4Tð Tô Uä—6‘6˜8 T¬2¯;©;«=¸$ÀÀdÈDÐRVÐWØ)-°Tô;ˆDà$(§K¡K×$6Ñ$6Ó$8×$>Ñ$>Ó$@×$FÑ$FÀtÔ$LÓUÑ$L˜DÒPT’4Ð$LˆCÐUÙÜ—‘Ð!6°s°e¸=ÐIÔJÜ—‘˜	�{ SÑ(°Õ5Ø�L‰L�Nñ -ùò Vs   Â.DÂ6Dc              #   óž   K  — | j                   |z  }|j                  «        	 d–— |j                  «        y# |j                  «        w xY w­w)z,Context manager to enter a potential orphan.N)rr   Útouchr'   )r   r�   Útokens      r!   Ú_enter_orphanzShepherd._enter_orphan;  s9   è ø€ ð —‘ Ñ$ˆØ�‰Œð	Ûà�L‰L�NøˆE�L‰L�Nüs   ‚ A£8 §A¸A
Á
Arˆ   c           
      ó
  ‡— |j                   }|j                  }|sy t        |«      dkD  }|d   }| j                  j	                  |j
                  «       |j
                  j                  j                  Št        ˆfd„|D «       «      sJ d«       ‚|r7t        t        |D �cg c]  }|j
                  j                  ‘Œ c}«      «      }n|j
                  j                  }|r| j                  j                  dz   |z   }n| j                  j                  dz   |z   }|r| j                  |z  }	n|j
                  j                  }	|	j                  d¬«       |D ]^  }|j
                  }
| j                  j	                  |
«       |
j                   j#                  «       sŒE|
j                   j%                  «        Œ` | j'                  ||	|«      }g }‰r0| j(                  €$t        j*                  | j                  «      | _        | j-                  |«      5  t/        «       5 }‰r<| j(                  €J ‚|j1                  t        j2                  | j(                  «      «       |r|j1                  |j5                  «       «       |j                   D ]„  }‰r8| j(                  €J ‚t        j6                  |j
                  | j(                  «       |j9                  |j;                  t=        «       | j                  |j
                  j>                  «      «       Œ† 	 d d d «       tA        ||«      D �]»  \  }}tC        jD                  ||ftG        |jH                  d	«      «       tJ        jM                  d
|jN                  «       ||_(        ||_)        | jT                  |jN                  z  }|}|jW                  |j
                  jX                  j[                  «       «       |rg|j
                  jX                  |	j                  z  }|j#                  «       r#|j[                  «       |	j[                  «       k(  sJ ‚|jW                  |	«       |j
                  j\                  }|j#                  «       r|j%                  «        |jW                  |	«       | j                  j_                  |j
                  «      }| ja                  d|jN                  › d|j
                  j                  › d|› �«       �Œ¾ 	 d d d «       y c c}w # 1 sw Y   �ŒäxY w# 1 sw Y   y xY w)Nr	   r   c              3   ód   •K  — | ]'  }|j                   j                  j                  ‰k(  –— Œ) y ­wr7   )r   rB   r
   )rJ   ÚotherÚuse_git_saves     €r!   rK   z#Shepherd._submit.<locals>.<genexpr>O  s%   øè ø€ ÐNÁv¸e�5—8‘8—=‘=×)Ñ)¨\Õ9Ávùs   ƒ-0z?All jobs inside an array must have the same value for git_save.Ú_array_Ú_T)rn   ÚwbzCreated job with id %szScheduled job z for sheep Ú/)1rg   re   Úlenr   Úinit_xpr   rB   r
   Úallr   ÚsortedrZ   r�   rs   Ú_xp_submititrq   r%   r&   r'   rÈ   ru   Úget_new_clonerÛ   r   Úenter_contextÚenter_cloneÚbatchÚassign_cloner‡   Úsubmitr   r   ÚzipÚpickleÚdumpÚopenr:   r“   r”   rP   r8   r9   rp   Ú
symlink_torA   r€   Ú_latest_submititÚget_namerW   )r   rˆ   rg   re   Úis_arrayÚfirstr‰   Úname_sigr�   Úsubmitit_folderr   rÆ   r¦   Ústackr8   r‚   Úsubmitit_linkÚlatestrß   s                     @r!   r�   zShepherd._submitE  sá  ø€ Ø×!Ñ!ˆØ ×-Ñ-ˆÙØä�v“; ‘?ˆØ�q‘	ˆØ�	‰	×Ñ˜%Ÿ(™(Ô#Ø—x‘x—}‘}×-Ñ-ˆÜÓNÁvÓNÔNð 	PØOó	PÐNñ Ü¤Á&Ó'IÁ&¸¨¯©¯«À&Ñ'IÓ JÓK‰Hà—x‘x—|‘|ˆHÙØ—9‘9—>‘> IÑ-°Ñ8‰Dà—9‘9—>‘> CÑ'¨(Ñ2ˆDáØ"Ÿl™l¨TÑ1‰Oà#Ÿh™h×3Ñ3ˆOØ×Ñ tÐÔ,ãˆEØ—‘ˆBØ�I‰I×Ñ˜bÔ!Ø×!Ñ!×(Ñ(Õ*Ø×"Ñ"×)Ñ)Õ+ð	 ð ×.Ñ.¨t°_ÀlÓSˆØ&(ˆÙ˜D×4Ñ4Ð<Ü'/×'=Ñ'=¸d¿i¹iÓ'HˆDÔ$Ø×Ñ Õ%Ü” ÙØ×3Ñ3Ð?Ð?Ð?Ø×'Ñ'¬×(<Ñ(<¸T×=UÑ=UÓ(VÔWÙØ×'Ñ'¨¯©Ó(8Ô9Ø&×-Ô-�EÙ#Ø#×7Ñ7ÐCÐCÐCÜ ×-Ñ-¨e¯h©h¸×8PÑ8PÔQØ—K‘K §¡´Ó0AÀ4Ç9Á9ÈeÏhÉhÏmÉmÓ \Õ]ñ	 .÷ ô " &¨$×/‘
��sä—‘˜S $˜K¬¨e¯o©o¸tÓ)DÔEÜ—‘Ð5°s·z±zÔBØ�”	Ø$(�Ô!Ø—{‘{ S§Z¡ZÑ/�Ø�Ø—‘ §¡§¡× 7Ñ 7Ó 9Ô:Ùð &+§X¡X§_¡_°×7KÑ7KÑ%K�MØ$×+Ñ+Ô-Ø,×4Ñ4Ó6¸/×:QÑ:QÓ:SÒSÐSÐSà%×0Ñ0°ÔAØŸ™×2Ñ2�Ø—=‘=”?Ø—M‘M”OØ×!Ñ! /Ô2à—y‘y×)Ñ)¨%¯(©(Ó3�Ø—‘˜>¨#¯*©*¨°[ÀÇÁÇÁÀÈaÐPTÈvÐVÖWñ/ 0÷ &Ð%ùò1 (J÷2 ‘ú÷ &Ð%ús,   Â S+ÈS=ÈC3S0ÌGS=Ó0S:	Ó5S=Ó=T)'r.   r/   r0   r^   rb   r   r1   ÚCallabler   r>   r2   r5   rz   ÚOptionalr}   rƒ   r…   r   r   rˆ   r   r˜   r(   r   r—   rž   r_   r   rp   rr   rs   rj   r›   rÃ   rÈ   rx   rÛ   rd   r�   r3   r#   r!   rl   rl   }   s™  „ ñð MSñ ˜]ð °·±¸c¸UÀD¸[Ñ1Ió ð¨¯©°CÑ(8ð ¸Uó ð cð ¨b¯k©k¸%Ñ.@ó ð
¨Cð 
°B·K±KÀÑ4Fó 
ò"ð ð' kò 'ó ð'ð5 uð 5¸Kð 5ÐP[ó 5ð:$˜x×0Ñ0ó $ò$ð ð>˜ò >ó ð>ð ð@˜$ò @ó ð@ð ð?˜ò ?ó ð?ð'˜BŸG™G HÑ-ó 'ð
&¨3ð &¸ð &Ø-8ð&Ø=E×=SÑ=Só&òPð ð #ò ó ððJX ô JXr#   rl   )*r^   Ú
contextlibr   r   Údataclassesr   r   ÚloggingÚpathlibr   rð   r   Ú
subprocessr­   r   Útypingr1   r(   r   Ú r
   Úconfr   r   Údistribr   r   r   Úutilsr   r   r   r   Ú	getLoggerr.   r“   r   r5   r   rb   rd   rl   r3   r#   r!   Ú<module>r
     s�   ðñç 0ß (Û Ý Û Û 	Û Û 
Û õ Û å ß *Ý %Ý Ý ß ð 
ˆ×	Ñ	˜8Ó	$€÷Iñ I÷$:ñ :ðz	ˆcó 	ð ÷9ð 9ó ð9÷
RXò RXr#   