Ë
    rPêj‚D ã            <       ó  — d Z ddl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m	Z	m
Z
m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mZ dd	lmZmZmZ dd
lmZ ddlZddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZI ddlJmKZKmLZL ddlMmNZNmOZOmPZP ddlQmRZRmSZSmTZT  e/jª                  eV«      ZWdeXdeXdz  deYeXeXdz  f   fd„ZZde[eX   dz  de deXdz  de[e%   dz  fd„Z\e G d„ d«      «       Z]ede d eXd!e[eX   dz  d"e[eX   dz  d#eXdz  d$eXdz  d%eXdz  d&e[eX   dz  d'eXdz  d(e[eX   dz  d)eXdz  d*eXdz  d+e^dz  d,eXdz  d-e[eX   dz  d.e[eX   dz  deXdz  d/eXdz  d0e[eX   dz  d1e_de
e]ddf   f*d2„«       Z`d3d4œd(e[eX   dz  d)eXdz  d1e_deaeXeXdz  f   fd5„Zbd3d4œd6e[eX   d7eaeXeXdz  f   d1e_deaeXeXdz  f   fd8„Zcd9e[eX   d:e[eX   deYe[eX   e[eX   f   fd;„Zddddd<œd$eXdz  d*eXdz  deXdz  d&eaeXeXdz  f   d(eaeXeXdz  f   d=e[eX   d/eXdz  d0e[eX   dz  d>e[eX   dz  de[eX   fd?„Zed@ZfdAd3dBœdCeaeXef   dDe	eX   d1e_ddfdE„ZgdFeXdGedDe	eX   deXfdH„ZhdIZieeX eKdJ¬K«      f   ZjeeXdz   eLdL¬K«      f   ZkeeXdz   eLdM e?e!«      ¬N«      f   Zlee[eX   dz   eLdOdPdQ¬K«      f   ZmeeXdz   eLdRdS¬K«      f   ZneeXdz   eLdT¬K«      f   Zoee^dz   eLdUddV¬W«      f   Zpee_ eLdXdYdZ¬K«      f   Zqee_ eLd[d\¬K«      f   ZreeXdz   eLd]¬K«      f   ZseeXdz   eLd^d_¬K«      f   Ztee[e^   dz   eLd`da¬K«      f   Zuee[e^   dz   eLdbdc¬K«      f   Zvee_ eLddde¬K«      f   ZweeXdz   eLdfdg¬K«      f   Zxee[eX   dz   eLdhdi¬K«      f   Zyee[eX   dz   eLdjdk¬K«      f   ZzeeXdz   eLdldmdn¬K«      f   Z{ee_dz   eLdo¬K«      f   Z|ee_dz   eLdp¬K«      f   Z}eeX eKdq¬K«      f   Z~eeX eKdr¬K«      f   Zee[eX   dz   eKds¬K«      f   Z€ee[eX    eKdt¬K«      f   Z�eeX eKdu¬K«      f   Z‚ee[eX   dz   eKdv¬K«      f   ZƒeeX eKdw¬K«      f   Z„ee[eX   dz   eLdxdydz¬K«      f   Z… eId{¬K«      Z†de d|e"ddfd}„Z‡de d|e"ddfd~„Zˆde d|e"de_ddfd€„Z‰e†�j                  d�d‚dƒig d„¢¬…«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 �dd#ejd†e�d&e9d(e>d,end-emd.e…d'e8d)e=d$eld*eod+epdeqd1erd‡eudˆevd‰ewd/exdŠeyd‹etdesdŒeBd�e:dŽe;d�e<ddf4d�„«       Z‹e†�j                  d‘g d’¢¬“«      	 	 	 	 �dde‚d”ee_ eLd•d–d—¬K«      f   d˜ee^dz   eLd™dšd›¬K«      f   desdŒeBddfdœ„«       ZŒd�e^ddfdž„Z�deXdŸeaeXef   d e[eX   de[e[eXe^z        fd¡„ZŽdeXd¢eeaeXef      d e[eX   deeYe_eXe[e[eXe^z        f      fd£„Z�e†�j                  d¤g d¥¢¬“«      	 	 	 	 �dd¦eƒd”ee_ eLd•d–d§¬K«      f   desdŒeBddf
d¨„«       Z�e†�j                  d©g dª¢¬“«      	 	 	 	 	 	 	 �dd«ee_ eLd¬d­d®¬K«      f   d¯ee[eX   dz   eLd° e?e$«      d±¬²«      f   d-ee[eX   dz   eLdOdPd³¬K«      f   d,eeXdz   eLdRd´¬K«      f   dµee^ eLd¶d·¬K«      f   desdŒeBddfd¸„«       Z‘e†�j                  d¹dºg¬“«      �d d»„«       Z’e†�j                  d¼d½g¬“«      	 	 �d!d¦ee[eX    eKd¾¬K«      f   desdŒeBddfd¿„«       Z“e†�j                  dÀdÁdÂg¬“«      	 	 	 �d"de‚deqdesdŒeBddf
dÃ„«       Z”e†�j                  d‡g dÄ¢¬“«      	 	 	 	 	 �d#de‚dÅee[e^   dz   eKdÆ¬K«      f   dÇee[e^   dz   eLdÈdÉ¬K«      f   dÊee_ eLdËdÌ¬K«      f   desdŒeBddfdÍ„«       Z•e†�j                  dÎdÏg¬“«      	 	 �d!de‚desdŒeBddfdÐ„«       Z–e†�j                  dÑg dÒ¢¬“«      	 	 	 �d$d¦ee[eX    eKdÓ¬K«      f   d*eeXdz   eLdÔ¬K«      f   desdŒeBddf
dÕ„«       Z—e†�j                  dÖg d×¢¬“«      	 	 	 	 	 �d#de‚d,end-emdÊee_ eLdËdØ¬K«      f   desdŒeBddfdÙ„«       Z˜e†�j                  d‰g dÚ¢¬“«      	 	 	 	 �dde‚dÛeAd1e@desdŒeBddfdÜ„«       Z™ eIdÝ¬K«      Zše†�j7                  ešdÞ¬ß«       eš�j                  d�d‚dƒig dà¢¬…«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 �d%d ed!e€d#ekd$eld&e9d(e>d,end-emd.e…d'e8d)e=d*eod+epdeqd1erd‡eudˆevd‰ewd/exdŠeyd‹etdesdŒeBdáezd%e{d�e:dŽe;d�e<ddf:dâ„«       Zœ G dã„ däeXe«      Z� eIdå¬K«      Zže†�j7                  eždæ¬ß«       ež�j                  d�d‚dƒidçg¬…«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 �d&dèe~d#ejd†e�dée|dêe}d&e9d(e>d,end-emd.e…d'e8d)e=d$eld*eod+epd1erd‡eudˆevd‹etdesdŒeBd�e:dŽe;d�e<ddf2dë„«       ZŸež�j                  d©g dì¢¬“«      	 	 	 	 	 	 �d'd«ee_ eLd¬d­dí¬K«      f   d¯ee[eX   dz   eLd° e?e�«      dî¬²«      f   d-ee[eX   dz   eLdOdPdï¬K«      f   d,eeXdz   eLdRdð¬K«      f   desdŒeBddfdñ„«       Z ež�j                  d¼dòg¬“«      	 	 �d!dóee[eX    eKdô¬K«      f   desdŒeBddfdõ„«       Z¡ež�j                  död÷g¬“«      	 	 �d!døe„desdŒeBddfdù„«       Z¢ež�j                  dédúg¬“«      	 	 �d!døe„desdŒeBddfdû„«       Z£ež�j                  düdýg¬“«      	 	 �d!døe„desdŒeBddfdþ„«       Z¤ež�j                  dÿ�d g¬“«      	 	 �d!døe„dèe~desdŒeBddf
�d„«       Z¥ež�j                  �d�dg¬“«      	 	 �d!døe„desdŒeBddf�d„«       Z¦ež�j                  dÖg �d¢¬“«      	 	 	 	 	 �d#døe„d,end-emdÊee_ eLdË�d¬K«      f   desdŒeBddf�d„«       Z§ eI�d¬K«      Z¨ež�j7                  e¨dÞ¬ß«       e¨�j                  d�d‚dƒi�d	�d
g¬…«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 �d(dèe~d ed!e€dée|dêe}d#ekd$eld&e9d(e>d,end-emd.e…d'e8d)e=d*eod+epd1erd‡eudˆevd‹etdesdŒeBdáezd%e{d�e:dŽe;d�e<ddf8�d„«       Z©�deaeXef   dÖeaeXeXf   dz  deaeXef   f�d„Zª�d)d,eXdz  d-e[eX   dz  dDe	eX   de_f�d„Z«ddßœdÖe[eX   dz  d,eXdz  deaeXeXf   dz  f�d„Z¬�de[e[eXe^z        �de[eX   deXf�d„Z­ e�d«      Z®�dee®   �de�dee®   f   �deaddf�d„Z¯�de�j`                  �jb                  �de�dee®   f   �de[ea   dee®   f�d„Z²y(*  z@Contains commands to interact with jobs on the Hugging Face Hub.é    N)ÚCallableÚ
CollectionÚ	GeneratorÚIterable)Úcontextmanager)Ú	dataclassÚfield)ÚEnum)ÚPath)ÚEmptyÚQueue)Ú	AnnotatedÚAnyÚTypeVar)Úurlsplit)ÚHfApiÚJobHardwareÚJobInfoÚ
JobNetworkÚJobStageÚVolumeÚ	constants)ÚDEFAULT_UV_IMAGEÚTERMINAL_JOB_STAGESÚ_default_job_name_from_imageÚ_default_job_name_from_script)ÚCLIError)Úlogging)Ú_format_size©Ú_split_mount)Úformat_durationÚparse_durationé   )Ú
EnvFileOptÚEnvOptÚ	FormatOptÚJsonOptÚQuietOptÚSecretsFileOptÚ
SecretsOptÚ
SoftChoiceÚSshDryRunOptÚSshIdentityFileOptÚTokenOptÚ_get_extended_environÚexec_sshÚ
get_hf_apiÚparse_env_mapÚparse_volumesÚset_output_formatÚtyper_factory)ÚArgumentÚOption)ÚOutputFormatÚ_dataclass_to_dictÚout)Ú
TABLE_NAMEÚUvScriptHeaderÚload_uv_scriptÚjob_idÚ	namespaceÚreturnc                 óü   — | st        d«      ‚| j                  d«      dkD  rt        d| › d�«      ‚d| vr| |fS | j                  dd«      \  }}|r|st        d| › d�«      ‚|�||k7  rt        d|› d|› d�«      ‚||fS )	a&  Extract namespace from job_id if provided in 'namespace/job_id' format.

    Allows users to pass job IDs copied from the Hub UI (e.g. 'username/job_id')
    instead of only bare job IDs. If the namespace is also provided explicitly via
    --namespace and conflicts, a CLIError is raised.
    zJob ID cannot be empty.ú/r$   z<Job ID must be in the form 'job_id' or 'namespace/job_id': 'z'.z(Conflicting namespace: got --namespace='z ' but job ID implies namespace='ú')r   ÚcountÚsplit)r?   r@   Úextracted_namespaceÚparsed_job_ids       ú]/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/huggingface_hub/cli/jobs.pyÚ_parse_namespace_from_job_idrJ   J   sÁ   € ñ ÜÐ0Ó1Ð1à‡|�|�CÓ˜1ÒÜÐUÐV\ÐU]Ð]_Ð`ÓaÐaà
�&ÑØ�yÐ Ð à)/¯©°c¸1Ó)=Ñ&Ð˜Ù¡mÜÐUÐV\ÐU]Ð]_Ð`ÓaÐaàÐ Ð.AÒ!AÜØ6°y°kÐAaÐbuÐavÐvwÐxó
ð 	
ð Ð-Ð-Ð-ó    ÚvolumesÚapic                ó*  — | syg }| D �]  }|j                  t        j                  «      r |j                  t	        |g«      xs g «       ŒCt        ||¬«      \  }}}|€t        d|› d�«      ‚t        |«      j                  «       j                  «       st        d|› d�«      ‚|j                  |||�|nd|¬«      }|j                  d	u r5t        j                  d
|› d|j                  › d|j                  › d|› �«       |j!                  |«       �Œ
 |S )a  Parse `-v` specs for Jobs commands.

    Same as [`parse_volumes`] but the source side can also be a local directory: it is synced to a
    bucket via [`HfApi.sync_job_volume`] and the resulting bucket subfolder is mounted (read-only
    unless ':rw' is specified).
    N©Úrawz#Missing mount path in volume spec 'zC'. Expected 'LOCAL_DIR:/MOUNT_PATH[:ro|:rw]' (e.g. './data:/data').zVolume source 'z�' is not an existing local directory. To mount a repo or bucket instead, use the 'hf://' syntax (e.g. 'hf://buckets/my-org/my-bucket:/data').T)Ú	read_onlyr@   FzVolume 'zg' is mounted read-write. Once the job is over, pull back its data with:
  hf buckets sync hf://buckets/rC   ú )Ú
startswithr   ÚHF_PROTOCOLÚextendr4   r!   r   r   Ú
expanduserÚis_dirÚsync_job_volumerQ   r;   ÚhintÚsourceÚpathÚappend)	rL   rM   r@   ÚresultÚraw_specrZ   Ú
mount_pathrQ   Úvolumes	            rI   Ú_parse_and_sync_job_volumesra   f   sK  € ñ Øà€FØó ˆØ×Ñœy×4Ñ4Ô5Ø�M‰Mœ-¨¨
Ó3Ò9°rÔ:Øô )5°XÀ8Ô(LÑ%ˆ�
˜IØÐÜØ5°h°Zð  @Cð  Dóð ô �F‹|×&Ñ&Ó(×/Ñ/Ô1ÜØ! & ð *zð zóð ð ×$Ñ$ØØØ#,Ð#8‘i¸dØð	 %ó 
ˆð ×Ñ˜uÑ$Ü�H‰HØ˜:˜,ð '2Ø28·-±-°ÀÀ&Ç+Á+ÀÈaÐPVÈxðYôð 	�‰�fÖð7ð8 €MrK   c                   ó¶  — e Zd ZU dZeed<   	  ee¬«      Zee   ed<   dZ	edz  ed<   dZ
edz  ed<   dZedz  ed<   dZedz  ed	<   dZedz  ed
<   dZedz  ed<    ee¬«      Zeeedz  f   ed<    ee¬«      Zeeedz  f   ed<    ee¬«      Zeeef   ed<    ee¬«      Zee   ed<   dZee   dz  ed<    ee¬«      Zee   ed<    ee¬«      Zee   ed<   y)Ú_UvJobConfigzeResolved launch configuration of a UV Job: CLI flags merged with the script's `[tool.hf-jobs]` table.Úscript)Údefault_factoryÚscript_argsNÚimageÚflavorÚpythonÚtimeoutr@   Únetwork_groupÚenvÚsecretsÚlabelsÚvolume_specsrL   Únetwork_aliasesÚfrom_script)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r	   Úlistrf   rg   rh   ri   rj   r@   rk   Údictrl   rm   rn   ro   rL   r   rp   Úsetrq   © rK   rI   rc   rc   ’   s  … áoàƒKØqá"°4Ô8€K��c‘Ó8Ø€Eˆ3�‰:ÓØ€FˆC�$‰JÓØ€FˆC�$‰JÓØ€GˆS�4‰ZÓØ €Iˆs�T‰zÓ Ø $€M�3˜‘:Ó$Ù!&°tÔ!<€Cˆˆc�3˜‘:ˆoÑ	Ó<Ù%*¸4Ô%@€GˆT�#�s˜T‘z�/Ñ"Ó@Ù"°4Ô8€FˆD��c�‰NÓ8Ù#°DÔ9€L�$�s‘)Ó9Ø#'€GˆT�&‰\˜DÑ Ó'Ù!&°tÔ!<€O�T˜#‘YÓ<á!°#Ô6€K��S‘Ó6Ø`rK   rc   rd   rf   Údependenciesrg   rh   ri   rl   Úenv_filerm   Úsecrets_filerj   ÚattemptsÚnameÚlabelr`   rk   rp   Údry_runc              #   ór  ‡!‡"K  — t        |«      5 }|j                  xs
 t        «       Š"t        «       Š!dt        dt        dz  dt        dz  fˆ!ˆ"fd„} |d|«      } |d|«      } |d|«      } |d	|«      } |d
|«      } |d|«      }|s)‰"j
                  r‰!j                  d«       ‰"j
                  }t        ||«      }‰"j                  j                  «       D ��ci c]  \  }}||vsŒ||“Œ }}}‰!j                  d„ |D «       «       i |¥|¥}t        |	|
|¬«      }t        ‰"j                  ||¬«      }‰!j                  d„ |D «       «       i |¥|¥}t        ||¬«      xs i }i ‰"j                  ¥‰"j                   �d‰"j                   ini ¥}|j                  «       D ��ci c]  \  }}||vsŒ||“Œ }}}‰!j                  d„ |D «       «       i |¥|¥}t#        |xs g ‰"j$                  «      \  }}‰!j                  d„ |D «       «       t'        |j(                  |xs g |||||||||||rdnt+        || |¬«      |xs g ‰!¬«      } d| j                  vr¿t-        || j.                  t1        | j2                  | j4                  | j6                  | j                  | j                  | j8                  | j:                  | j
                  | j<                  xs t>        | j@                  xs dg|xs g ¢|�t	        |«      gng ¢¬«	      ¬«      | j                  d<   | –— ddd«       yc c}}w c c}}w # 1 sw Y   yxY w­w)aw  Merge the CLI flags with the `[tool.hf-jobs]` table the script carries, if any.

    An explicit CLI flag always wins over the script; `env`, `labels`, `secrets` and `volumes` are merged
    entry by entry (by key, by name and by mount path respectively), so a script value and a CLI value
    only ever conflict when they target the same entry. `network_aliases` is the exception: the aliases
    a Job claims form a set, so `--network-alias` replaces the script's list rather than adding to it.

    A URL script is downloaded to a temporary file that lives until the `with` block exits: submit the
    Job inside the block.
    ÚkeyÚ	cli_valueNrA   c                 óP   •— |�|S t        ‰| «      x}�‰j                  | «       |S y)z2Keep the CLI value, and fall back to the script's.N)ÚgetattrÚadd)r„   r…   Úscript_valuerq   Úheaders      €€rI   Úpickz$_resolve_uv_job_config.<locals>.pickÑ   s6   ø€ àÐ$Ø Ð Ü '¨°Ó 4Ð4�ÐAØ—‘ Ô$Ø#Ð#ØrK   rg   rh   ri   rj   r@   rk   rp   c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)zenv.Nr{   ©Ú.0r„   s     rI   ú	<genexpr>z)_resolve_uv_job_config.<locals>.<genexpr>ç   s   è ø€ Ò>¨C˜T # œ<Ñ>ùó   ‚©r‚   c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)zsecrets.Nr{   r�   s     rI   r�   z)_resolve_uv_job_config.<locals>.<genexpr>ì   s   è ø€ ÒF°˜X c UÔ+ÑFùr�   ©r€   r€   c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)zlabels.Nr{   r�   s     rI   r�   z)_resolve_uv_job_config.<locals>.<genexpr>ó   s   è ø€ ÒD¨s˜W S Eœ?ÑDùr�   c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)zvolumes.Nr{   )rŽ   Úspecs     rI   r�   z)_resolve_uv_job_config.<locals>.<genexpr>÷   s   è ø€ ÒM°˜X d VÔ,ÑMùr�   ©rM   r@   )rd   rf   rg   rh   ri   rj   r@   rk   rl   rm   rn   ro   rL   rp   rq   Ú ©	rh   rj   r@   rl   rm   ro   rk   rp   Úextra©Úconfig_parts)!r>   rŠ   r=   rz   rv   rp   rˆ   r3   rl   ÚitemsÚupdateÚ_parse_secrets_mapÚ_resolve_script_secretsrm   Ú_parse_labels_maprn   r€   Ú_merge_volume_specsrL   rc   rd   ra   r   rf   Ú_name_hash_partsrh   rj   r@   ro   rk   rg   r   ri   )#rM   rd   rf   r|   rg   rh   ri   rl   r}   rm   r~   rj   r   r€   r�   r`   r@   rk   rp   r‚   rZ   r‹   Úenv_mapr„   ÚvalueÚ
script_envÚsecrets_mapÚscript_secretsÚ
labels_mapÚscript_labelsro   Úscript_volume_specsÚconfigrq   rŠ   s#                                    @@rI   Ú_resolve_uv_job_configr­   «   sY  ùè ø€ ôD 
˜Ó	ð U 6Ø—‘Ò2¤.Ó"2ˆÜ #£ˆð	”cð 	¤c¨D¡jð 	´S¸4±Zö 	ñ �W˜eÓ$ˆÙ�h Ó'ˆÙ�h Ó'ˆÙ�y 'Ó*ˆÙ˜ iÓ0ˆ	Ù˜_¨mÓ<ˆá 6×#9Ò#9Ø�O‰OÐ-Ô.Ø$×4Ñ4ˆOä  XÓ.ˆØ39·:±:×3CÑ3CÓ3E×\¡Z S¨%ÈÐT[ÒI[�c˜5‘jÐ\ˆ
Ñ\Ø×ÑÑ>°:Ô>Ô>Ø+�ZÐ+ 7Ð+ˆä(¨°,ÈÔPˆÜ0°·±ÀÐV]Ô^ˆØ×ÑÑF°~ÔFÔFØ7˜Ð7¨;Ð7ˆä& u°4Ô8Ò>¸Bˆ
àg˜6Ÿ=™=ÐgÀfÇkÁkÐF]¨f°f·k±kÑ-BÐceÐgˆØ6C×6IÑ6IÓ6K×e©
¨¨UÈsÐZdÒOd˜˜e™ÐeˆÑeØ×ÑÑD°mÔDÔDØ4˜Ð4¨Ð4ˆ
ä,?ÀÂÈ"ÈfÏnÉnÓ,]Ñ)ˆÐ)Ø×ÑÑMÐ9LÔMÔMäØ—=‘=Ø#Ò) rØØØØØØ'ØØØØ%á#‘DÔ)DÀ\ÐWZÐfoÔ)pØ+Ò1¨rØ#ô!
ˆð$ ˜Ÿ™Ñ&ô %BØØ×"Ñ"Ü-Ø!Ÿ=™=Ø"ŸN™NØ$×.Ñ.ØŸ
™
Ø"ŸN™NØ!'×!4Ñ!4Ø"(×"6Ñ"6Ø$*×$:Ñ$:àŸ™Ò8Ô(8ØŸ™Ò+¨ðð 'Ò,¨"ðð .6Ð-Aœ3˜x›=™/Àrð	ôô%ˆF�M‰M˜&Ñ!ð( Š÷kUð Uùó2 ]ùó f÷KUð UüsI   „L7�CL+ÃLÃ)LÃ.B3L+Æ!L%Æ.L%Æ3E#L+Ì	L7ÌL+Ì+L4Ì0L7Fr‘   c                ó   — t        | |«      }| xs g D �cg c]  }d|vsŒ|j                  «       x}|vsŒ|‘Œ  }}|r&|s$t        ddj                  |«      › d|d   › d�«      ‚i |¥t        j                  |«      ¥S c c}w )a7  Parse `--secrets`/`--secrets-file`, failing if a bare `--secrets NAME` is not set locally.

    Same behavior as for the secrets requested by a script (see `_resolve_script_secrets`): a missing secret
    is an error rather than silently dropped, except in `--dry-run` where it is displayed as `<not set>`.
    ú=z9The following secret(s) are not set in your environment: ú, ú$. Export them locally (e.g. `export r   ú)=...`) or use `--secrets-file` otherwise.)r3   Ústripr   Újoinry   Úfromkeys)rm   r~   r‚   r§   r¥   r€   Úmissings          rI   rŸ   rŸ   %  s¢   € ô   ¨Ó6€KØ!(¢¨BÖr˜°#¸UÒ2BÐPU×P[ÑP[ÓP]ÐH]ÈÐfqÒGqŠtÐr€GÐrÙ‘wÜØGÈÏ	É	ÐRYÓHZÐG[ð \2Ø29¸!±*°Ð=fðhó
ð 	
ð 5ˆkÐ4œTŸ]™]¨7Ó3Ð4Ð4ùò ss   •	A;ŸA;´A;ÚnamesÚcli_secretsc          	      ól  — | si S t        «       }i }g }| D ]%  }||v rŒ||v r	||   ||<   Œ|j                  |«       Œ' |r&|s$t        ddj                  |«      › d|d   › d�«      ‚|r6t	        j
                  dt        › ddj                  |«      › d|rd	nd
› d�«       i |¥t        j                  |«      ¥S )a¤  Resolve the secrets requested by a script from the caller's environment.

    A script only lists secret *names*: values always come from whoever runs it (`HF_TOKEN` also
    resolves from `hf auth login`). A requested secret that is not set locally is an error rather than
    an empty value: forgetting to export a secret before launching is easy, and debugging the Job that
    results from it is not.

    In `--dry-run` a missing secret is not an error but a `None` value, displayed as `<not set>` in the
    summary: nothing is submitted, so the point is to see the full configuration of a script - including
    one whose secrets are not provisioned locally (yet).
    zTThe script requires the following secret(s), which are not set in your environment: r°   r±   r   r²   zThe script's [z] table requests z+: the value(s) from your local environment zwould bezwill bez sent to the Job.)	r0   r\   r   r´   r;   Úwarningr<   ry   rµ   )r·   r¸   r‚   ÚenvironÚresolvedr¶   r€   s          rI   r    r    7  sö   € ñ Øˆ	Ü#Ó%€GØ&(€HØ€GØò !ˆØ�;ÑØØ�7‰?Ø$ T™]ˆH�TŠNà�N‰N˜4Õ ð!ñ ‘wÜØbÐcg×clÑclÐmtÓcuÐbvð w2Ø29¸!±*°Ð=fðhó
ð 	
ñ Ü�‰ØœZ˜LÐ(9¸$¿)¹)ÀHÓ:MÐ9Nð OÙ*1™J°yÐAÐARðTô	
ð 2ˆhÐ1œ$Ÿ-™-¨Ó0Ð1Ð1rK   Ú	cli_specsÚscript_specsc                 ó¢   — | D �ch c]  }t        ||¬«      d   ’Œ }}|D �cg c]  }t        ||¬«      d   |vsŒ|‘Œ }}|| z   |fS c c}w c c}w )z¢Merge `-v` specs with the ones from the script. Returns `(all specs, specs from the script)`.

    A CLI mount overrides the script's mount at the same path.
    rO   r$   r    )r½   r¾   r–   Úcli_mount_pathsÚkepts        rI   r¢   r¢   ^  se   € ð
 DMÖM¸4”| D¨dÔ3°AÓ6ÐM€OÐMØ)Öd�T¬\¸$ÀDÔ-IÈ!Ñ-LÐTcÒ-cŠDÐd€DÐdØ�)Ñ˜TÐ!Ð!ùò NùÚds   …A¢AºA)rk   rp   rš   ro   rš   c        	         óÐ   — | xs t         j                  j                  |xs d|xs d|xs dg|xs g ¢d„ t        |j	                  «       «      D «       ¢t        |«      ¢|¢|xs g ¢S )a„  The resolved launch values hashed into a Job's default name, on top of its image/script.

    Same inputs for `hf jobs run` and `hf jobs uv run`, so that both name Jobs after what they actually
    submit (`extra` carries what is specific to UV runs). Env *values* are part of the hash since they
    change what the Job does; secrets only contribute their names, never their values.
    r˜   c              3   ó0   K  — | ]  \  }}|› d |› �–— Œ y­w)r¯   Nr{   )rŽ   r„   r¥   s      rI   r�   z#_name_hash_parts.<locals>.<genexpr>€  s   è ø€ Ò	A™z˜s EˆSˆE��5�'Ô
Ñ	Aùs   ‚)r   Ú	CPU_BASICr¥   Úsortedr�   r™   s	            rI   r£   r£   h  sˆ   € ð& 	Ò-”+×'Ñ'×-Ñ-ØŠ�2ØŠ�RØÒ˜ð	
ð
 Š+�2ð
ñ 
B¬V°C·I±I³KÓ-@Ô	Að
ô 
�‹ð
ð 
ð
ð Ò
˜Rð
ð 
rK   z (from script)r{   ©rq   r‚   Úvaluesrq   c          
      ó  — | j                  «       D ��cg c]  \  }}|ddg i dfvr|t        |||«      f‘Œ }}}t        d„ |D «       «      }dg}|D ]`  \  }}|||v rt        ndz  }|t	        |j                  d«      «      D ��	cg c]#  \  }}	d|dk(  r|ndj                  |«      › d|	› �‘Œ% c}	}z  }Œb dj                  |«      }
|rt        j                  |
› d	�«       yt        j                  |
«       yc c}}w c c}	}w )
ad  Echo the launch configuration of a Job before submitting it.

    Printed on every run, so that what is sent to the Jobs API is always visible - in particular the
    values injected by a script's `[tool.hf-jobs]` table, which are marked as such. Goes to stderr for a
    real run, and to stdout for `--dry-run`, where it is the output of the command.
    Nr˜   Fc              3   ó8   K  — | ]  \  }}t        |«      –— Œ y ­w©N)Úlen)rŽ   r„   Ú_s      rI   r�   z%_print_job_summary.<locals>.<genexpr>–  s   è ø€ Ò,™V˜S !”�C—Ñ,ùs   ‚zJob configuration:ú
ú  r   z
(dry run) Job not submitted.)r�   Ú_format_job_valueÚmaxÚ_FROM_SCRIPTÚ	enumeraterF   Úljustr´   r;   ÚtextÚlog)rÇ   rq   r‚   r„   r¥   ÚrowsÚwidthÚlinesÚindexÚlineÚsummarys              rI   Ú_print_job_summaryrÜ   Š  s  € ð !Ÿ,™,›.÷áˆC�Ø˜˜r 2 r¨5Ð1Ñ1ð 
Ô  U¨KÓ8Ò9ð€Dñ ô
 Ñ, tÔ,Ó,€EØ!Ð"€EØò 
‰
ˆˆUØ ¨Ñ!3•¸Ñ;ˆàÜW`Ðaf×alÑalÐmqÓarÓWs÷
ÙHSÈÈtˆb˜ !š‘#¨×2Ñ2°5Ó9Ð:¸"¸T¸FÒCó
ñ 	
‰ð
ð �i‰i˜Ó€GÙÜ�‰�G�9Ð:Ð;Õ<ä�‰�Õùó#ùó
s   ”"C5Â(C;
r„   r¥   c                 ó  ‡ ‡— ‰ xdk(  rB i }|j                  «       D ]+  \  }}|xs d}|› dt        |«      dkD  r|dd dz   n|› �||<   Œ- nƒxdk(  r. |j                  «       D ��ci c]  \  }}||› d|�d	nd
› �“Œ }}}nPxdk(  r* |j                  «       D ��ci c]  \  }}||› d|› �“Œ }}}n!dk(  r|D �ci c]  }||“Œ }}n	 t        |«      S dj                  ˆˆ fd„|j                  «       D «       «      S c c}}w c c}}w c c}w )zVFormat config entries, redacting secrets and marking values inherited from the script.rl   r˜   r¯   é<   Né;   u   â€¦rm   z***z	<not set>rn   rL   rÍ   c              3   óL   •K  — | ]  \  }}|‰› d |› �‰v rt         ndz   –— Œ y­w)ú.r˜   N)rÑ   )rŽ   r€   rÔ   rq   r„   s      €€rI   r�   z$_format_job_value.<locals>.<genexpr>¶  s1   øè ø€ ÒwÑYcÐY]Ð_c�T°¨u°A°d°V¨_ÀÑ-K�\ÐQSÕTÑwùs   ƒ!$)r�   rË   rv   r´   )r„   r¥   rq   Úentriesr€   ÚitemrÔ   r–   s   ` `     rI   rÏ   rÏ   ¥  s!  ù€ à
ÝàˆGØ#Ÿk™k›mò Z‘
��dØ’z˜r�Ø#' &¨¼sÀ4»yÈ2º~¨$¨s°¨)°eÒ*;ÐSWÐ)XÐ Y�˜’ñZõ Øfk×fqÑfqÓfs×tÑXbÐX\Ð^b�t ˜v Q°Ð0@¡uÀkÐ&RÐSÑSÐtˆGÒtÝØ@EÇÁÃ×N±*°$¸�t ˜v Q t fÐ-Ñ-ÐNˆGÒNÛØ.3Ö4 d�t˜T‘zÐ4ˆGÑ4ØÜ�u“:ÐØ�9‰9ÔwÐgn×gtÑgtÓgvÔwÓwÐwùó uùãNùâ4s   Á$C7ÂC=Â5
Dgš™™™™™¹?zThe Docker image to use.)Úhelpz.Use a custom Docker image with `uv` installed.zcFlavor for the hardware. Run 'hf jobs hardware' to list available flavors. Defaults to `cpu-basic`.)rä   Ú
click_typez-lz--labelz3Set labels. E.g. --label KEY=VALUE or --label LABELz--namez¦Name the Job. Stored as the `name` label. Names do not have to be unique. Defaults to the image or script name plus a short hash of the resolved launch configuration.zPMax duration: int with s (seconds, default), m (minutes), h (hours) or d (days).z
--attemptsz9Maximum attempts, including the first run. Defaults to 1.)Úminrä   z-dz--detachz3Run the Job in the background and print the Job ID.z	--dry-runz@Print the resolved Job configuration without submitting the Job.zVThe namespace where the job will be running. Defaults to the current user's namespace.z--resource-group-idzŸThe ID of the resource group to create the Job in. Used to control access to resources within an organization and for cost attribution/spending-limit features.z--exposez÷Expose a container port through the jobs proxy. Repeat the flag for multiple ports (e.g. `--expose 8000 --expose 8001`). Each exposed port is reachable on the public jobs domain; access requires an HF token with read access to the job's namespace.z--expose-publicz™Expose a container port through the jobs proxy without authentication. Repeat the flag for multiple ports. No need to also pass the port with `--expose`.z--sshz Make the job's container reachable over SSH. Connect with `hf jobs ssh <job_id>`. Requires an SSH public key registered on https://huggingface.co/settings/keys.z--network-groupa  Join a network group. Jobs in the same namespace and resource group sharing a group are placed together and reach each other on every port. Inside each member, `$HF_NETWORK_GROUP_HOSTNAME` resolves to every member. Lowercase alphanumerics and dashes, 46 characters max.z--network-aliaszþClaim an alias in the network group. Members reach the jobs claiming it at `${HF_NETWORK_GROUP_PREFIX}<alias>`. Repeat the flag for several aliases. Lowercase alphanumerics and dashes, 34 characters max, unique within the job. Requires `--network-group`.z--withz%Run with the given packages installedz-pz--pythonz5The Python interpreter to use for the run environmentz!Suspend (pause) the scheduled Jobz8Allow multiple instances of this Job to run concurrentlyz]One of @annually, @yearly, @monthly, @weekly, @daily, @hourly, or a CRON schedule expression.z$UV script to run (local file or URL)zArguments for the scriptzThe command to run.zJob ID (or 'namespace/job_id')zJob IDs (or 'namespace/job_id')z2Scheduled Job ID (or 'namespace/scheduled_job_id')z-vz--volumeaÓ  Mount one or more volumes. Format: hf://[TYPE/]SOURCE:/MOUNT_PATH[:ro|:rw] or LOCAL_DIR:/MOUNT_PATH[:ro|:rw]. TYPE is one of: models, datasets, spaces, buckets. TYPE defaults to models if omitted. models, datasets and spaces are always mounted read-only. buckets are read+write by default. A local directory source is first synced to a bucket and mounted read-only by default. E.g. -v hf://datasets/org/ds:/data or -v hf://buckets/org/b:/mnt:ro or -v ./inputs:/inputszRun and manage Jobs on the Hub.Újobc                 óÌ  — t        j                  «       }t        j                  «       }	 |j                  j                  t
        j                  k(  rÔt        d«      D ]m  }|j                  |j                  j                  xs d› dt        t        t        j                  «       |z
  «      «      › d�«       t        j                  d«       Œo | j                  |j                  |j                  j                   ¬«      }|j                  j                  t
        j                  k(  rŒÔ|j                  d«       y# t"        j$                  $ r Y Œ'w xY w# |j                  d«       w xY w)	z[Wait while the Job is scheduling, showing why (e.g. waiting for hardware) and for how long.é   Ú
Schedulingú (ú)r$   ©r?   r@   r˜   N)r;   ÚstatusÚtimeÚ	monotonicÚstager   Ú
SCHEDULINGÚrangerž   Úmessager"   ÚintÚsleepÚinspect_jobÚidÚownerr€   Úhttpx2Ú	HTTPError)rM   rç   rî   ÚstartrÌ   s        rI   Ú_wait_while_schedulingrý   ›  s  € ä�Z‰Z‹\€FÜ�N‰NÓ€EðØ�j‰j×Ñ¤(×"5Ñ"5Ò5Ü˜1“Xò �Ø—‘Ø—z‘z×)Ñ)Ò9¨\Ð:¸"¼_ÌSÔQU×Q_ÑQ_ÓQaÐdiÑQiÓMjÓ=kÐ<lÐlmÐnôô —
‘
˜1•ð	ð
 —/‘/¨¯©¸3¿9¹9¿>¹>�/ÓJˆCð �j‰j×Ñ¤(×"5Ñ"5Ó5ð 	�‰�bÕøô ×Ñò Ùðûð 	�‰�bÕús$   ªC:D7 Ä7EÅ
E ÅEÅE ÅE#c           
      ó  — 	 t        | |«       | j                  |j                  |j                  j                  d¬«      D ]  }t        j                  |«       Œ | j                  |j                  |j                  j                  ¬«      }|j                  j                  t        j                  k7  rc|j                  j                  rd	|j                  j                  › �nd
}t        d|j                  › d|j                  j                  › d|› �«      ‚t        j                  d|j                  › d�«       y# t        $ rF |j                  j                  › d|j                  › �}t        j                  d|› d|› d|› d�«       ‚ w xY w)zcStream Job logs until the Job ends, then fail the command if the Job did not complete successfully.T©r?   r@   Úfollowrí   rC   zJob z( was not canceled. Use `hf jobs logs -f z)` to follow it again, or `hf jobs cancel z` to cancel it.z: r˜   z finished with stage 'rD   z
 completedN)rý   Úfetch_job_logsrø   rù   r€   r;   rÔ   Úwait_for_jobÚKeyboardInterruptrY   rî   rñ   r   Ú	COMPLETEDrô   r   )rM   rç   rÕ   ÚfinalÚjob_refrô   s         rI   Ú_stream_logs_and_check_statusr  ­  sU  € ðÜ˜s CÔ(Ø×%Ñ%¨S¯V©V¸s¿y¹y¿~¹~ÐVZÐ%Ó[ò 	ˆCÜ�H‰H�S�Mð	ð × Ñ ¨¯©¸#¿)¹)¿.¹.Ð ÓIˆð ‡|�|×ÑœX×/Ñ/Ò/Ø16·±×1EÒ1E�B�u—|‘|×+Ñ+Ð,Ñ-È2ˆÜ˜˜eŸh™h˜ZÐ'=¸e¿l¹l×>PÑ>PÐ=QÐQRÐSZÐR[Ð\Ó]Ð]Ü‡H�Hˆt�E—H‘H�:˜ZÐ(Õ)øô ò Ø—Y‘Y—^‘^Ð$ A c§f¡f XÐ.ˆÜ�‰Ø�7�)ÐCÀGÀ9ð M#Ø#* )¨?ð<ô	
ð 	ðús   ‚B	D9 Ä9AFÚdetachc                ó¸  — |j                   j                  › d|j                  › �}t        |j                  j
                  t        «      rDdj                  d„ |j                  j
                  D «       «      }t        j                  d|› �«       t        |j                  j                  t        «      rt        j                  d|› d�«       t        |j                  t        «      r2|j                  j                  }t        j                  d|› d|› d	�«       |r6t        j                  d
|› d|› d�«       t        j                  d|› d�«       yt        | |«       y)zZPrint hints about how to reach a started Job, then stream its logs unless `detach` is set.rC   rÍ   c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)rÎ   Nr{   )rŽ   Úurls     rI   r�   z._hint_or_follow_started_job.<locals>.<genexpr>Æ  s   è ø€ ÒF¨˜2˜c˜UœÑFùr�   z Exposed ports are reachable at:
zUse `hf jobs ssh z&` to open an SSH session into the job.zJoined network group 'zK'. Jobs of this namespace and resource group started with `--network-group z…` reach each other at `$HF_NETWORK_GROUP_HOSTNAME` (every member) or `${HF_NETWORK_GROUP_PREFIX}<alias>` (members claiming an alias).úUse `hf jobs logs -f z&` to stream logs, or `hf jobs inspect z` to check status.zUse `hf jobs wait z` to block until it finishes.N)rù   r€   rø   Ú
isinstancerî   Úexpose_urlsrx   r´   r;   rY   Ússh_urlrv   Únetworkr   Úgroupr  )rM   rç   r  r  Úurlsr  s         rI   Ú_hint_or_follow_started_jobr  Â  s  € à—‘—‘Ð   #§&¡& Ð*€GÜ�#—*‘*×(Ñ(¬$Ô/Ø�y‰yÑF¨s¯z©z×/EÑ/EÔFÓFˆÜ�‰Ð4°T°FÐ;Ô<Ü�#—*‘*×$Ñ$¤cÔ*Ü�‰Ð$ W IÐ-SÐTÔUÜ�#—+‘+œzÔ*Ø—‘×!Ñ!ˆÜ�‰Ø$ U Gð , Ø %˜wð 'RðRô	
ñ
 Ü�‰Ð(¨¨	Ð1WÐX_ÐW`Ð`rÐsÔtÜ�‰Ð% g YÐ.KÐLÔMØÜ! # sÕ+rK   ÚrunÚignore_unknown_optionsT)zFhf jobs run --name hello-world python:3.12 python -c 'print("Hello!")'z1hf jobs run --detach python:3.12 python script.pyz3hf jobs run -e FOO=foo python:3.12 python script.pyz;hf jobs run --secrets HF_TOKEN python:3.12 python script.pyz^hf jobs run -v hf://org/my-model:/data -v hf://buckets/org/b:/mnt python:3.12 python script.py)Úcontext_settingsÚexamplesÚcommandÚexposeÚexpose_publicÚsshÚnetwork_aliasÚresource_group_idÚtokenÚformatÚjson_outputÚquietc                 ój  — t        |||«       t        ||«      }t        |||¬«      }t        ||¬«      xs i }|j	                  dt        | |t        |	|
|�t        |«      gnd||||xs g ||¬«	      ¬«      «       t        |¬«      }|rdnt        |||¬«      }t        i d	| “d
t        j                  |«      “d|	xs t        j                  j                  “d|
“d|“d|“d|“d|xs g “d|“ddj                  d„ |xs g D «       «      “ddj                  d„ |xs g D «       «      “d|“d|“ddj                  |xs g «      “d|“d|“|¬«       |ry|j!                  | ||||||	|
||||||||¬«      }t#        j$                  d|j&                  |j(                  xs i j+                  d«      |j,                  ¬«       t/        ||«      s\|j(                  xs i j+                  d«      }t#        j0                  d|› d |j2                  j4                  › d!|j&                  › d"�«       t7        |||¬#«       y)$z
Run a Job.r‘   r“   r€   N)	rh   rj   rš   r@   rl   rm   ro   rk   rp   r›   ©r  r—   rg   r  rh   rj   r   rl   rm   rL   rn   r  rR   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   ©rv   ©rŽ   Úports     rI   r�   zjobs_run.<locals>.<genexpr>#  ó   è ø€ ÒB¨Tœs 4ŸyÑBùó   ‚r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   r%  r&  s     rI   r�   zjobs_run.<locals>.<genexpr>$  ó   è ø€ Ò%P°D¤c¨$§iÑ%Pùr)  r  rk   rp   r  r@   )rg   r  rl   rm   rn   rL   rh   rj   r   r  r  r  rk   rp   r  r@   úJob started©rø   r€   r  úJob auto-named 'ú('. Pass `--name` or run `hf jobs labels rC   ú --name NAME` to rename it.©r  )r5   r3   rŸ   r¡   Ú
setdefaultr   r£   rv   r2   ra   rÜ   Úshlexr´   r   rÄ   r¥   Úrun_jobr;   r]   rø   rn   Úgetr  Ú_has_explicit_namerY   rù   r€   r  ) rg   r  rl   rm   r€   r�   r`   r}   r~   rh   rj   r   r  r‚   r  r  r  rk   r  r  r@   r  r  r   r!  r¤   r§   r©   rM   rL   rç   Ú	auto_names                                    rI   Újobs_runr8  Ø  s¹  € ôN �f˜k¨5Ô1Ü˜C Ó*€GÜ$ W¨lÀGÔL€KÜ" 5¨tÔ4Ò:¸€JØ×ÑØÜ$ØØÜ)ØØØ)1Ð)=”s˜8“}‘oÀ4Ø#ØØ#Ø#š\ rØ+Ø -ô
ô	
ôô& ˜5Ô
!€CÙ‰dÔ#>¸vÈ3ÐZcÔ#d€GÜð	
Ø�Uð	
à”u—z‘z 'Ó*ð	
ð �fÒ;¤× 5Ñ 5× ;Ñ ;ð	
ð �wð		
ð
 ˜ð	
ð �7ð	
ð �{ð	
ð �v’| ð	
ð �jð	
ð �c—h‘hÑB°V²\¸rÔBÓBð	
ð ˜SŸX™XÑ%P¸MÒ<OÈRÔ%PÓPð	
ð �3ð	
ð ˜]ð	
ð ˜sŸx™x¨Ò(;¸Ó<ð	
ð  Ð!2ð	
ð  ˜ð!	
ð$ õ'ñ* ØØ
�+‰+ØØØØØØØØØØØ#ØØ#Ø%Ø+Øð! ó €Cô$ ‡J�Jˆ} §¡¨s¯z©zÒ/?¸R×.DÑ.DÀVÓ.LÐRU×RYÑRYÕZÜ˜d EÔ*Ø—Z‘ZÒ% 2×*Ñ*¨6Ó2ˆ	Ü�‰Ø˜y˜kð *Ø"Ÿy™yŸ~™~Ð.¨a°·±¨xÐ7RðTô	
ô    S°Ö8rK   Úlogs)zhf jobs logs <job_id>zhf jobs logs -f <job_id>zhf jobs logs --tail 20 <job_id>z#hf jobs logs -f --tail 100 <job_id>)r  r   z-fz--followzqFollow log output (stream until the job completes). Without this flag, only currently available logs are printed.Útailz-nz--tailzvNumber of lines to show from the end of the logs. When combined with --follow, starts streaming from the last N lines.c                 ó  — t        | |«      \  } }t        |¬«      }|j                  | |||¬«      }|D ]  }t        j                  |«       Œ |r|› d| › �n| }|rt        j
                  d|› d�«       yt        j
                  d|› d�«       y)	a­  Fetch the logs of a Job.

    By default, prints currently available logs and exits (non-blocking).
    Use --follow/-f to stream logs in real-time until the job completes.
    Use --tail/-n to limit the number of lines returned (server-side when supported).

    Note: following exits when the log stream ends, regardless of whether the Job
    succeeded or failed. Run `hf jobs inspect <job_id>` to check the final status.
    r#  )r?   r@   r   r:  rC   ú#Stream ended. Run `hf jobs inspect ú6` to check the final status (e.g. COMPLETED or ERROR).z2If the job is still running, use `hf jobs logs -f z(` to stream new logs until it completes.N)rJ   r2   r  r;   rÔ   rY   )	r?   r   r:  r@   r  rM   r9  rÕ   r  s	            rI   Ú	jobs_logsr>  K  s›   € ôN 5°V¸YÓGÑ€FˆIä
˜5Ô
!€CØ×Ñ V°yÈÐVZÐÓ[€DØò ˆÜ�‰��ðá)2��˜1˜V˜HÑ%¸€GÙÜ�‰Ð6°w°iÐ?uÐvÕwä�‰Ø@ÀÀ	ÐIqÐrõ	
rK   Únc                 óF   — d}d}t        | «      D ]  }t        ||¬«       Œ y )Nz[1Az[2K)Úend)ró   Úprint)r?  ÚLINE_UPÚ
LINE_CLEARÚis       rI   Ú_clear_linerF  �  s)   € Ø€GØ€JÜ�1‹Xò 'ˆÜˆg˜:Ö&ñ'rK   ÚmetricsÚtable_headersc                 ó´  — | |d   › d�t        |d   dz  d«      t        d|d   z  |d   z  d	«      › d�t        |d   «      › d
t        |d   «      › d�t        |d   «      › dt        |d   «      › d�g}|d   r»t        |d   t        «      r¨|gt	        t        |d   «      dz
  «      D �cg c]  }dgt        |«      z  ‘Œ c}z   }t        |t        |d   «      «      D ]R  \  }}|d   |   }||d   › d�t        d|d   z  |d   z  d	«      › d�t        |d   «      › d
t        |d   «      › d�gz  }ŒT |S |dgt        |«      t        |«      z
  z  z  }|gS c c}w )NÚcpu_usage_pctú%Úcpu_millicoresg     @�@r$   éd   Úmemory_used_bytesÚmemory_total_bytesré   zB / ÚBÚrx_bpszbps / Útx_bpsÚbpsÚgpusr˜   ÚutilizationúN/A)Úroundr   r  ry   ró   rË   ÚziprÅ   )r?   rG  rH  ÚrowrÌ   rÖ   Úgpu_idÚgpus           rI   Ú_format_job_stats_rowsr\  ˆ  sÏ  € àØ�?Ñ#Ð
$ AÐ&ÜˆgÐ&Ñ'¨&Ñ0°!Ó4Ü��wÐ2Ñ3Ñ3°gÐ>RÑ6SÑSÐUVÓWÐ
XÐXYÐZÜ˜Ð 3Ñ4Ó5Ð
6°d¼<ÈÐPdÑHeÓ;fÐ:gÐghÐiÜ˜ Ñ)Ó*Ð
+¨6´,¸wÀxÑ?PÓ2QÐ1RÐRUÐVð€Cð ˆv‚œ: g¨f¡o´tÔ<Ø'* eÌÌcÐRYÐZ`ÑRaÓNbÐefÑNfÓHgÖ.hÀ1°¨t´c¸#³h«Ò.hÑ&hˆÜ˜t¤V¨G°F©OÓ%<Ó=ò 	‰KˆC�Ø˜&‘/ &Ñ)ˆCØØ�}Ñ%Ð& aÐ(Ü˜˜sÐ#6Ñ7Ñ7¸#Ð>RÑ:SÑSÐUVÓWÐXÐXYÐZÜ Ð$7Ñ 8Ó9Ð:¸$¼|ÈCÐPdÑLeÓ?fÐ>gÐghÐiðñ ‰Cð	ð ˆØˆEˆ7”c˜-Ó(¬3¨s«8Ñ3Ñ4Ñ4€CØˆ5€Lùò /is   Â*EÚmetrics_streamc              #   óL   K  — |D ]  }d| t        | ||«      f–— Œ d| g f–— y ­w)NFT)r\  )r?   r]  rH  rG  s       rI   Ú_get_jobs_stats_rowsr_  Ÿ  s=   è ø€ ð "ò TˆØ�VÔ3°F¸GÀ]ÓSÐSÓSðTà
�˜Ð
Óùó   ‚"$Ústats)zhf jobs statszhf jobs stats <job_id>zhf jobs stats -f <job_id>Újob_idsziFollow stats output (live view until the Jobs complete). Without this flag, a single snapshot is printed.c           
      óÔ  ‡‡— |rHt         j                  t        j                  k7  r't	        dt         j                  j
                  › d�«      ‚| �+g }| D ]"  }t        |‰«      \  }Š|j                  |«       Œ$ |} t        |¬«      Š‰€‰j                  «       d   Š| €O‰j                  ‰¬«      D �cg c]4  }|j                  r|j                  j                  nddv r|j                  ‘Œ6 } }t        | «      d	k(  r+t        j                  g «       t        j                   d
«       yg d¢}|�sbdt"        dt$        t"        t&        f   dz  fˆˆfd„}t(        j*                  j-                  t        | «      «      5 }	|	j/                  || «      }
ddd«       g }t1        | 
«      D ]6  \  }}|€t        j2                  d|› d�«       Œ"|j                  d|i|¥«       Œ8 t         j                  t        j                  k(  r||rz|D ��cg c]  }t5        |d   ||«      D ]  }|‘Œ Œ }}}t        j6                  t9        ||¬«      «       dj;                  ˆfd„|D «       «      }t        j                   d|› d�«       yt        j                  |d¬«       yt(        j*                  j-                  t        | «      «      5 }	i }| D ]+  }|g}||dd D �cg c]  }d|v sd|v rdnd‘Œ c}z  }|g||<   Œ- t=        j<                  «       }|D ��cg c]  }||   D ]  }|‘Œ Œ }}}t?        t9        ||¬«      «       | D �cg c]  }|‰jA                  |‰d¬«      |dœ‘Œ }}tC        |	tD        |¬«      D ]‹  \  }}}|r|jG                  |d«       n|||<   t=        j<                  «       }||z
  tH        k\  sŒBtK        d t        |«      z   «       |D ��cg c]  }||   D ]  }|‘Œ Œ }}}t?        t9        ||¬«      «       |}Œ� 	 ddd«       dj;                  ˆfd!„| D «       «      }t        j                   d"|› d#�«       yc c}w # 1 sw Y   �Œ­xY wc c}}w c c}w c c}}w c c}w c c}}w # 1 sw Y   ŒkxY w)$zÒFetch the resource usage statistics and metrics of Jobs.

    By default, prints a snapshot of the current stats and exits (non-blocking).
    Use --follow/-f to display live stats until the Jobs complete.
    zD`--follow` displays a live terminal view and is not supported with 'z3' output. Run without `--follow` to get a snapshot.Nr#  r€   )r@   ÚUNKNOWN)ÚRUNNINGÚUPDATINGr   zHNo running jobs. Use `hf jobs ps -a` to list finished (and failed) jobs.)	zJOB IDzCPU %zNUM CPUzMEM %z	MEM USAGEzNET I/Oz
GPU UTIL %z	GPU MEM %zGPU MEM USAGEr?   rA   c                 óP   •— t        t        ‰j                  | ‰¬«      «      d «      S )Nrí   )ÚnextÚiterÚfetch_job_metrics)r?   rM   r@   s    €€rI   Úfetch_latest_metricsz(jobs_stats.<locals>.fetch_latest_metricsæ  s&   ø€ Üœ˜S×2Ñ2¸&ÈIÐ2ÓVÓWÐY]Ó^Ð^rK   zNo stats available for Job z. Is it running?)ÚheadersrR   c              3   ó2   •K  — | ]  }‰› d |d   › �–— Œ y­w)rC   r?   Nr{   )rŽ   rã   r@   s     €rI   r�   zjobs_stats.<locals>.<genexpr>ô  s!   øè ø€ ÒRÀD 9 +¨Q¨t°H©~Ð.>Ô ?ÑRùs   ƒzUse `hf jobs stats -f z` to follow live stats.©Úid_keyr$   rC   ÚUSAGEz-- / --z--Trÿ   )r?   r]  rH  )Úkwargs_listré   c              3   ó,   •K  — | ]  }‰› d |› �–— Œ y­w)rC   Nr{   )rŽ   r?   r@   s     €rI   r�   zjobs_stats.<locals>.<genexpr>  s   øè ø€ ÒF°F˜9˜+ Q v hÔ/ÑFùs   ƒr<  r=  )&r;   Úmoder9   Úhumanr   r¥   rJ   r\   r2   ÚwhoamiÚ	list_jobsrî   rñ   rø   rË   ÚtablerY   rv   ry   r   ÚmultiprocessingÚpoolÚ
ThreadPoolÚmaprX  rº   r\  rÔ   Ú	_tabulater´   rï   rB  rj  Úiflatmap_unorderedr_  ÚpopÚSTATS_UPDATE_MIN_INTERVALrF  )rb  r   r@   r  Ú
parsed_idsr?   rç   rH  rk  ry  Úlatest_metricsr�   rG  rã   rY  rÖ   Újob_refsÚrows_per_job_idrŠ   Úlast_update_timeÚ
total_rowsrq  ÚdoneÚnowrM   s     `                     @rI   Ú
jobs_statsrˆ  §  s�  ù€ ñ4 ”#—(‘(œl×0Ñ0Ò0ÜØRÔSV×S[ÑS[×SaÑSaÐRbð c9ð 9ó
ð 	
ð ÐØˆ
Øò 	&ˆFÜ <¸VÀYÓ OÑˆF�IØ×Ñ˜fÕ%ð	&ð ˆÜ
˜5Ô
!€CØÐØ—J‘J“L Ñ(ˆ	Ø€ð —}‘}¨y�}Ó9ö
àØ$'§J¢J�—
‘
× Ò °IÐBYÑYð �F‹Fð
ˆð 
ô
 ˆ7ƒ|�qÒÜ�	‰	�"ŒÜ�‰Ð[Ô\Øò
€Mò ð	_¬ð 	_´´c¼3°h±À$Ñ1Fö 	_ô ×!Ñ!×,Ñ,¬S°«\Ó:ð 	E¸dØ!ŸX™XÐ&:¸GÓDˆN÷	EàˆÜ" 7¨NÓ;ò 	<‰OˆF�GØˆÜ—‘Ð9¸&¸ÐAQÐRÕSà—‘˜h¨Ð:°'Ð:Õ;ð		<ô
 �8‰8”|×)Ñ)Ò)©eØ$)×q˜DÔ5KÈDÐQYÉNÐ\`ÐboÓ5pÒq¨c’CÐq�CÐqˆDÑqÜ�H‰H”Y˜t¨]Ô;Ô<Ø—x‘xÓRÈEÔRÓRˆHÜ�H‰HÐ-¨h¨ZÐ7NÐOÔPð 	ô �I‰I�e HÕ-ØÜ	×	Ñ	×	(Ñ	(¬¨W«Ó	6ð '¸$Ø<>ˆØò 	,ˆFØ$* 8ˆCØÐ^kÐlmÐlnÐ^oÖpÐTZ #¨¡-°7¸fÑ3D‘IÈ4ÑOÒpÑpˆCØ'* eˆO˜FÒ#ð	,ô  Ÿ9™9›;ÐØ(7×[˜fÀ?ÐSYÑCZÒ[¸C’cÐ[�cÐ[ˆ
Ñ[ô 	Œi˜
¨MÔ:Ô;ð "ö
ð ð	 !Ø"%×"7Ñ"7¸vÐQZÐcgÐ"7Ó"hØ!.óð
ˆð 
ô #5°TÔ;OÐ]hÔ"iò 
	'ÑˆD�&˜$ÙØ×#Ñ# F¨DÕ1à*.� Ñ'Ü—)‘)“+ˆCØÐ%Ñ%Ô)BÓBÜ˜A¤ J£Ñ/Ô0Ø0?×c fÈ?Ð[aÑKbÒcÀCšcÐc˜cÐc�
ÑcÜ”i 
°MÔBÔCØ#&Ñ ñ
	'÷)'ð> �x‰xÓF¸gÔFÓF€HÜ‡H�HÐ2°8°*Ð<rÐsÕtùòS
÷2	Eñ 	Eüó rùò qùó \ùò

ùó  d÷9'ð 'úsa   Â19P0Å7P5ÈQÊ6QË	Q
Ë&QÌQÌQÌ2QÍAQÎ'QÏQ
ÏQÐ5P?ÑQÑQ'zlist | ls | ps)z
hf jobs lszhf jobs ls -az&hf jobs ls --status running,schedulingzhf jobs ls --name training-v2z+hf jobs ls --label env=prod --label team=mlz%hf jobs ls --all --label hf-sandbox=1Úallz-az--allzWShow all Jobs (default shows running and scheduling). Cannot be combined with --status.rî   z--statuszfOnly show Jobs with the given status. Comma-separated or repeated, e.g. `--status running,scheduling`.)rå   rä   z{Only show Jobs with the given `key=value` label. Repeat to require several labels, e.g. `--label env=prod --label team=ml`.zFOnly show Jobs with the given name (shortcut for `--label name=NAME`).Úlimitz--limitzCMaximum number of Jobs to display. Set to 0 to show all (no limit).c                 ó$  — t        |¬«      }| r|rt        d«      ‚g }|xs g D ])  }	|j                  d„ |	j                  d«      D «       «       Œ+ |r|}
n9| rd}
n4t        j
                  j                  t        j                  j                  g}
i }|xs g D ].  }d|vrt        d|› d�«      ‚|j                  d«      \  }}	|	||<   Œ0 |�d	|v rt        d
«      ‚||d	<   |j                  ||
|xs d¬«      }d}|dkD  r8t        t        j                  ||dz   «      «      }t        |«      |kD  rd}|d| }nt        |«      }g }|D �],  }t        |«      }|j                  d«      xs i }|j                  d«      xs g }|j                  dd«      |d<   |j                  d«      xs i j                  d	«      xs d|d	<   |j                  d«      xs d|d<   |rdj                  |«      nd|d<   |j                  d«      r|d   dd j!                  dd«      nd|d<   |j                  d«      xs i j                  dd «      |d<   t#        |j                  d!«      «      |d"<   |j%                  |«       �Œ/ t'        j(                  |g d#¢d¬$«       |rt'        j*                  d%|› d&�«       |sg|s|rJd'j                  g d(„ |D «       ¢d)„ |j-                  «       D «       ¢«      }t'        j.                  d*|› �«       y| st'        j*                  d+«       yyy),z½List Jobs.

    Use `--status` to filter by status (see [`JobStage`] for possible values) and `--label` to filter by `key=value`
    labels. A Job must match every filter to be listed.
    r#  ú0`-a`/`--all` cannot be combined with `--status`.c              3   ó^   K  — | ]%  }|j                  «       sŒ|j                  «       –— Œ' y ­wrÊ   )r³   ©rŽ   Úparts     rI   r�   zjobs_ps.<locals>.<genexpr>^  s   è ø€ ÒV¨TÈÏÉÍ˜DŸJ™JŸLÑVùs   ‚-˜-ú,Nr¯   úInvalid label filter 'ú"': must be in the form 'key=value'r€   ú6Cannot filter by both `--name` and `--label name=...`.)r@   rî   rn   Fr   r$   TÚ	durationsr  rø   r˜   r?   rn   rV  Údocker_imageúimage/spacerR   Ú
created_até   ÚTÚcreatedrî   rñ   rd  Úrunning_secsÚruntime)r?   r€   r–  r  rš  rî   rœ  ©rl  ro  zOutput truncated to z4 Jobs. Use `--limit 0` to show all (or `--limit N`).r°   c              3   ó&   K  — | ]	  }d |› �–— Œ y­w©zstatus=Nr{   ©rŽ   Úss     rI   r�   zjobs_ps.<locals>.<genexpr>›  ó   è ø€ Ò7 Q�W˜Q˜C”=Ñ7ùr�   c              3   ó2   K  — | ]  \  }}d |› d|› �–— Œ y­w©zlabel=r¯   Nr{   ©rŽ   ÚkÚvs      rI   r�   zjobs_ps.<locals>.<genexpr>›  ó$   è ø€ Ò:gÑPTÐPQÐST¸VÀAÀ3ÀaÈÀsÔ;KÑ:gùr)  zNo jobs matched filters: zHNo running jobs. Use `-a`/`--all` to include finished (and failed) jobs.)r2   r   rU   rF   r   re  r¥   rò   rv  rx   Ú	itertoolsÚislicerË   r:   r5  r´   Úreplacer"   r\   r;   rw  rY   r�   rÔ   )r‰  rî   r�   r€   rŠ  r@   r  rM   Úraw_statusesr¥   Úserver_statusesrn   rã   r„   Ú	jobs_iterÚ	truncatedÚjobsÚ	job_itemsrç   Újob_itemr”  ÚcmdÚfilters_msgs                          rI   Újobs_psrµ    s6  € ôt ˜5Ô
!€Cá
‰vÜÐIÓJÐJð !€LØ’˜2ò WˆØ×ÑÑV°U·[±[ÀÓ5EÔVÕVðWñ Ø&‰Ù	Ø‰ä#×+Ñ+×1Ñ1´8×3FÑ3F×3LÑ3LÐMˆð  €FØ’˜ò ˆØ�d‰?ÜÐ3°D°6Ð9[Ð\Ó]Ð]Ø—Z‘Z “_‰
ˆˆUØˆˆsŠð	ð ÐØ�VÑÜÐSÓTÐTØˆˆv‰à—‘¨	¸/ÐRXÒR`Ð\`�Óa€Ið €IØˆq‚yÜ”I×$Ñ$ Y°¸±	Ó:Ó;ˆÜˆt‹9�uÒØˆIØ˜˜�<‰Dä�I‹ˆð ')€IØó #ˆÜ% cÓ*ˆØ—L‘L Ó-Ò3°ˆ	Ø�l‰l˜9Ó%Ò+¨ˆØ%Ÿ\™\¨$°Ó3ˆ�ÑØ$ŸL™L¨Ó2Ò8°b×=Ñ=¸fÓEÒNÈˆ�ÑØ"*§,¡,¨~Ó">Ò"GÀ%ˆ�ÑÙ/2˜cŸh™h sœm¸ˆ�ÑØOWÏ|É|Ð\hÔOi˜h |Ñ4°S°bÐ9×AÑAÀ#ÀsÔKÐotˆ�ÑØ&Ÿl™l¨8Ó4Ò:¸×?Ñ?ÀÈÓSˆ�ÑÜ-¨i¯m©m¸NÓ.KÓLˆ�ÑØ×Ñ˜Ö"ð#ô ‡I�IØÚ\Øõñ
 Ü�‰Ð'¨ wÐ.bÐcÔdÙÙ™6ØŸ)™)ØhÑ7¨,Ô7ÐhÑ:gÐX^×XdÑXdÓXfÔ:gÐhóˆKô �H‰HÐ0°°Ð>Õ?ÙÜ�H‰HÐ_Õ`ð ð rK   Úhardwarezhf jobs hardwarec                  ó^  — t        «       } | j                  «       }g }|D ]â  }d}|j                  rG|j                  j                  › d|j                  j                  › d|j                  j
                  › d�}|j                  rd|j                  d›�nd}|j                  rd|j                  dz  d	›�nd}|j                  |j                  |j                  |j                  |j                  |j                  |||d
œ«       Œä t        j                  |«       t        j                  d«       y)z(List available hardware options for Jobsr˜   zx rë   rì   ú$z.4fÚfreerÞ   z.2f)r€   zpretty nameÚcpuÚramÚstorageÚacceleratorzcost/minz	cost/hourzLUse `hf jobs run --flavor <name> ...` to request a specific hardware flavor.N)r2   Úlist_jobs_hardwarer½  ÚquantityÚmodelÚvramÚunit_cost_usdr\   r€   Úpretty_namerº  r»  Úephemeral_storager;   rw  rY   )rM   Úhardware_listr�   ÚhwÚaccelerator_infoÚcost_minÚ	cost_hours          rI   Újobs_hardwarerÊ  ¢  s  € ô ‹,€CØ×*Ñ*Ó,€MØ€EØò 
ˆØÐØ�>Š>Ø"$§.¡.×"9Ñ"9Ð!:¸"¸R¿^¹^×=QÑ=QÐ<RÐRTÐUW×UcÑUc×UhÑUhÐTiÐijÐkÐØ13×1AÒ1A�Q�r×'Ñ'¨Ð,Ñ-ÀvˆØ79×7GÒ7G�a˜×(Ñ(¨2Ñ-¨cÐ2Ñ3ÈVˆ	Ø�‰àŸ™Ø!Ÿ~™~Ø—v‘vØ—v‘vØ×/Ñ/Ø/Ø$Ø&ñ	õ	
ð
ô$ ‡I�IˆeÔÜ‡H�HÐ[Õ\rK   Úinspectzhf jobs inspect <job_id>z*Job IDs to inspect (or 'namespace/job_id')c           
      óL  — g }| D ]"  }t        ||«      \  }}|j                  |«       Œ$ |} t        |¬«      }| D �cg c]  }|j                  ||¬«      ‘Œ }}t	        j
                  |D �cg c]"  }t        t        |«      |j                  ¬«      ‘Œ$ c}d¬«       yc c}w c c}w )z0Display detailed information on one or more Jobsr#  rí   ©rn   rø   rn  N)	rJ   r\   r2   r÷   r;   rw  Ú_surface_namer:   rn   )rb  r@   r  r€  r?   rM   r°  rç   s           rI   Újobs_inspectrÏ  ¾  s�   € ð €JØò "ˆÜ8¸ÀÓKÑˆ�	Ø×Ñ˜&Õ!ð"ð €GÜ
˜5Ô
!€CØNUÖVÀFˆC�O‰O 6°YˆOÕ?ÐV€DÐVÜ‡I�IÐTXÖYÈSŒ}Ô/°Ó4¸S¿Z¹ZÖHÒYÐbfÖgùò WùÚYs   ¼BÁ+'B!Úrerunzhf jobs rerun <job_id>zhf jobs rerun --detach <job_id>c                 ó  — t        | |«      \  } }t        |¬«      }|j                  | |¬«      }t        j                  d|j
                  |j                  xs i j                  d«      |j                  ¬«       t        |||¬«       y)z*Run a new Job with an existing Job's spec.r#  rí   r,  r€   r-  r1  N)
rJ   r2   Ú	rerun_jobr;   r]   rø   rn   r5  r  r  )r?   r  r@   r  rM   rç   s         rI   Ú
jobs_rerunrÓ  Ô  sn   € ô 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØ
�-‰-˜v°ˆ-Ó
;€CÜ‡J�Jˆ} §¡¨s¯z©zÒ/?¸R×.DÑ.DÀVÓ.LÐRU×RYÑRYÕZÜ  S°Ö8rK   )zhf jobs expose <job_id> 8000z*hf jobs expose <job_id> 8000 --public 9000zhf jobs expose <job_id> --clearÚportszlPorts to expose through the jobs proxy. Access requires an HF token with read access to the job's namespace.Úpublicz--publicz�Expose a port without authentication. Repeat the flag for multiple ports. No need to also pass the port as a positional argument.Úclearz--clearzClose all exposed ports.c                 ó&  — |r|s|rt        d«      ‚|s|s|st        d«      ‚t        | |«      \  } }t        |¬«      }|j                  | |||¬«      }t	        j
                  d|j                  |j                  xs g |j                  xs g ¬«       y)z'Replace exposed ports on a running Job.z6`--clear` cannot be combined with ports or `--public`.zKPass at least one port or `--public` port, or `--clear` to close all ports.r#  )r?   r  r  r@   zExposed ports updated)rø   rÔ  Úpublic_portsN)	r   rJ   r2   Úupdate_job_exposer;   r]   rø   r  r  )r?   rÔ  rÕ  rÖ  r@   r  rM   rç   s           rI   Újobs_exposerÚ  ã  sŒ   € ñ8 ‘%™6ÜÐOÓPÐPÙ™¡vÜÐdÓeÐeÜ4°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØ
×
Ñ
 v°eÈ6Ð]fÐ
Ó
g€CÜ‡J�JÐ&¨3¯6©6¸¿¹Ò9IÀrÐX[×XiÑXiÒXoÐmoÖprK   Úcancelzhf jobs cancel <job_id>c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)zCancel a Jobr#  rí   zJob cancelled©rø   N)rJ   r2   Ú
cancel_jobr;   r]   )r?   r@   r  rM   s       rI   Újobs_cancelrß  	  s=   € ô 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØ‡N�N˜&¨I€NÔ6Ü‡J�Jˆ 6Ö*rK   Úwait)zhf jobs wait <job_id>z"hf jobs wait <job_id_1> <job_id_2>z"hf jobs ls -q | xargs hf jobs waitz,Job IDs to wait for (or 'namespace/job_id').zTMax time to wait: int with s (seconds, default), m (minutes), h (hours) or d (days).c           
      ó*  — g }t        «       }| D ]3  }t        ||«      \  }}|j                  |«       |j                  |«       Œ5 t	        |«      dkD  r3t        ddj                  d„ t        |t        ¬«      D «       «      z   «      ‚|j                  «       }|�t        |«      nd}	t        |¬«      }
t        j                  dt	        |«      › d	�«      }	 |
j                  ||	|¬
«      }|j!                  t	        |«      › d�«       t        j"                  |D �cg c]C  }|j$                  t        |j                  j&                  «      |j                  j(                  dœ‘ŒE c}«       |D �cg c],  }|j                  j&                  t*        j,                  k7  sŒ+|‘Œ. }}|r<t        t	        |«      › dt	        |«      › d�dj                  d„ |D «       «      z   «      ‚y# t        $ r" |j!                  d«       t        d|› d�«      d‚w xY wc c}w c c}w )a  Wait for one or more Jobs to reach a terminal state.

    Blocks until every Job has finished, then exits with code 0 if all Jobs completed
    successfully, or a non-zero exit code if any Job was canceled, errored or deleted.

    All Jobs must belong to the same namespace.
    r$   z0All Job IDs must be in the same namespace, got: r°   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   r%  )rŽ   Únss     rI   r�   zjobs_wait.<locals>.<genexpr>>  s   è ø€ ÒF Bœ˜BŸÑFùr)  )r„   Nr#  zWaiting for z Job(s) to finish...)rj   r@   z
Timed out.zTimed out after z waiting for Job(s) to finish.z Job(s) finished.)rø   rñ   rô   z of z' Job(s) did not complete successfully: c              3   óh   K  — | ]*  }|j                   › d |j                  j                  › d�–— Œ, y­w)rë   rì   N)rø   rî   rñ   )rŽ   rç   s     rI   r�   zjobs_wait.<locals>.<genexpr>Q  s,   è ø€ ÒK¸S˜3Ÿ6™6˜( " S§Z¡Z×%5Ñ%5Ð$6°aÔ8ÑKùs   ‚02)rz   rJ   r\   rˆ   rË   r   r´   rÅ   rv   r~  r#   r2   r;   rî   r  ÚTimeoutErrorr†  rw  rø   rñ   rô   r   r  )rb  rj   r@   r  r€  Ú
namespacesr?   Ú	parsed_idÚparsed_namespaceÚtimeout_secsrM   rî   r°  rç   Úfaileds                  rI   Ú	jobs_waitrë    só  € ð> €JÜ“€JØò )ˆÜ&BÀ6È9Ó&UÑ#ˆ	Ð#Ø×Ñ˜)Ô$Ø�‰Ð'Õ(ð)ô ˆ:ƒ˜ÒÜØ>Ø�i‰iÑF¬&°ÄÔ*EÔFÓFñGó
ð 	
ð —‘Ó €IØ.5Ð.A”> 'Ô*Àt€Lä
˜5Ô
!€CÜ�Z‰Z˜,¤s¨:£Ð&7Ð7KÐLÓM€Fð]Ø×Ñ 
°LÈIÐÓVˆð ‡K�K”3�t“9�+Ð.Ð/Ô0ä‡I�IÐhlÖmÐad�c—f‘f¤s¨3¯:©:×+;Ñ+;Ó'<ÈÏÉ×I[ÑI[Ó\ÒmÔnØ!ÖL�c S§Z¡Z×%5Ñ%5¼×9KÑ9KÓ%KŠcÐL€FÐLÙÜÜ�6‹{ˆm˜4¤ D£	˜{Ð*QÐRØ�i‰iÑKÀFÔKÓKñLó
ð 	
ð øô ò ]Ø�‰�LÔ!ÜÐ)¨'¨Ð2PÐQÓRÐX\Ð\ð]üò
 nùÚLs   ÃG ÄAHÅ+,HÆHÇ+Hrn   )z*hf jobs labels <job_id> --name training-v2z8hf jobs labels <job_id> --label env=prod --label team=mlzhf jobs labels <job_id> --clearzRemove all labels from the job.c                 ó†  — |s|€|st        d«      ‚|s|�|rt        d«      ‚t        | |«      \  } }t        |¬«      }|�,|s*|j                  | |¬«      j                  xs i }i |¥d|i¥}nt        ||¬«      xs i }|j                  | ||¬«      }	t        j                  d	|	j                  |j                  d«      ¬
«       y)zfUpdate labels on a Job. Passing --label replaces all existing labels; passing --name alone keeps them.NúePlease set a name with --name or at least one label with --label. To remove all labels, pass --clear.úlCannot set a name or labels and clear them at the same time. Please use --name/--label or --clear, not both.r#  rí   r€   r“   )r?   rn   r@   úLabels updated©rø   r€   )r   rJ   r2   r÷   rn   r¡   Úupdate_job_labelsr;   r]   rø   r5  )
r?   r€   r�   rÖ  r@   r  rM   Úcurrent_labelsrn   rç   s
             rI   Újobs_labelsró  U  sÓ   € ñ" �T�\©%ÜØsó
ð 	
ñ 	�Ð!¡uÜØzó
ð 	
ô 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØÐ¡àŸ™°À)˜ÓL×SÑSÒYÐWYˆØ1�NÐ1 F¨DÑ1‰ä" 5¨tÔ4Ò:¸ˆØ
×
Ñ
 v°fÈ	Ð
Ó
R€CÜ‡J�JÐ C§F¡F°·±¸FÓ1CÖDrK   )zhf jobs ssh <job_id>zhf jobs ssh <job_id> --dry-runz)hf jobs ssh <job_id> -i ~/.ssh/id_ed25519Úidentity_filec                 óê  — t        | |«      \  } }t        |¬«      }|j                  | |¬«      }|j                  j                  €t        d«      ‚|j                  j                  t        v r0t        d|j                  › d|j                  j                  › d�«      ‚|j                  j                  t        j                  k7  ràt        j                  d|j                  › d	|j                  j                  › d
�«      }|j                  |j                  |t        j                  g¬«      }|j                  j                  t        j                  k7  rA|j                  d«       t        d|j                  › d|j                  j                  › d�«      ‚|j                  d«       t        |j                  j                  «      }t        |j                   › d|j"                  › �|j$                  ||¬«       y)a   SSH into a running Job.

    If the Job is not yet running, waits until it reaches the RUNNING state before
    connecting. Requires the Job to be started with SSH enabled (`hf jobs run --ssh ...`)
    and your SSH public key to be registered at https://huggingface.co/settings/keys.
    r#  rí   Nz[SSH is not enabled on this job. Start a job with SSH support using `hf jobs run --ssh ...`.zCannot SSH into job 'z%': job has already finished (stage: 'z').zWaiting for job 'z' to be running (stage: 'z')...)r?   r@   ÚstageszJob finished.z1': job finished before reaching RUNNING (stage: 'zJob is running.ú@)r'  rô  r‚   )rJ   r2   r÷   rî   r  r   rñ   r   rø   r   re  r;   r  r†  r   r1   ÚusernameÚhostnamer'  )	r?   rô  r‚   r@   r  rM   rç   rî   r  s	            rI   Újobs_sshrú  z  s¨  € ô* 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØ
�/‰/ °9ˆ/Ó
=€CØ
‡z�z×ÑÐ!ÜÐtÓuÐuØ
‡z�z×ÑÔ.Ñ.ÜÐ.¨s¯v©v¨hÐ6[Ð\_×\fÑ\f×\lÑ\lÐ[mÐmpÐqÓrÐrØ
‡z�z×Ñœ8×+Ñ+Ò+Ü—‘Ð/°·±¨xÐ7PÐQT×Q[ÑQ[×QaÑQaÐPbÐbgÐhÓiˆØ×Ñ c§f¡f¸	Ì8×K[ÑK[ÐJ\ÐÓ]ˆØ�:‰:×Ñœx×/Ñ/Ò/Ø�K‰K˜Ô(ÜØ'¨¯© xÐ/`Ðad×akÑak×aqÑaqÐ`rÐruÐvóð ð 	�‰Ð%Ô&Ü�s—z‘z×)Ñ)Ó*€GÜØ×ÑÐ
˜A˜g×.Ñ.Ð/Ð0Ø�\‰\Ø#Øö	rK   zFRun UV scripts (Python with inline dependencies) on HF infrastructure.Úuvr“   )z,hf jobs uv run --name my-script my_script.pyz$hf jobs uv run --detach my_script.pyz1hf jobs uv run --flavor a10g-small ml_training.pyz+hf jobs uv run --with transformers train.pyzNhf jobs uv run -v hf://org/my-model:/data -v hf://buckets/org/b:/mnt script.pyz"hf jobs uv run --dry-run script.pyÚwith_c                 ó–  — t        |||«       t        |¬«      }t        d+i d|“d| “d|“d|“d|“d|“d|“d	|“d
|	“d|“d|
“d|“d|“d|“d|“d|“d|“d|“d|“d|“Ž5 }t        i d| “dt	        j
                  |j                  «      “ddj                  |xs g «      “d|j                  xs t        “d|j                  xs t        j                  j                  “d|j                  “d|j                  “d|“d	|j                  “d|j                   “d|j"                  “d|j$                  “ddj                  d„ |xs g D «       «      “ddj                  d„ |xs g D «       «      “d|“d|j&                  “ddj                  |j(                  «      “||j*                  d œ¥|j,                  |¬!«       |r
	 d"d"d"«       y"|j/                  |j0                  |j                  ||j                  |j                  |j                  |j                   |j$                  |j2                  |j                  |j                  |||||j&                  |j(                  xs d"||j*                  ¬#«      }d"d"d"«       t5        j6                  d$j8                  |j$                  xs i j;                  d«      |j<                  ¬%«       t?        ||j,                  «      s\|j$                  xs i j;                  d«      }t5        j@                  d&|› d'|jB                  jD                  › d(|j8                  › d)�«       tG        |||¬*«       y"# 1 sw Y   ŒÕxY w),ú8Run a UV script (local file or URL) on HF infrastructurer#  rM   rd   rf   r|   rg   rh   ri   rl   r}   rm   r~   rj   r   r€   r�   r`   r@   rk   rp   r‚   ÚargsÚwithrR   rL   rn   r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   r%  r&  s     rI   r�   zjobs_uv_run.<locals>.<genexpr>ý  ó   è ø€ Ò"F°¤3 t§9Ñ"Fùr)  r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   r%  r&  s     rI   r�   zjobs_uv_run.<locals>.<genexpr>þ  ó   è ø€ Ò)T¸¬#¨d¯)Ñ)Tùr)  r  ©r  r@   rÆ   N)rd   rf   r|   ri   rg   rl   rm   rn   rL   rh   rj   r   r  r  r  rk   rp   r  r@   r,  r-  r.  r/  rC   r0  r1  r{   )$r5   r2   r­   rÜ   r3  r´   rf   rg   r   rh   r   rÄ   r¥   ri   rj   rl   rm   ro   rn   rk   rp   r@   rq   Ú
run_uv_jobrd   rL   r;   r]   rø   r5  r  r6  rY   rù   r€   r  ) rd   rf   rg   rh   rl   rm   r€   r�   r`   r}   r~   rj   r   r  r‚   r  r  r  rk   r  r  r@   r  rü  ri   r  r   r!  rM   r¬   rç   r7  s                                    rI   Újobs_uv_runr  ¬  sÚ  € ôV �f˜k¨5Ô1Ü
˜5Ô
!€CÜ	ò 
Ùð
áð
ñ  ð
ñ ð	
ñ
 ð
ñ ð
ñ ð
ñ ð
ñ ð
ñ ð
ñ "ð
ñ ð
ñ ð
ñ ð
ñ ð
ñ  ð!
ñ" ð#
ñ$ $ð%
ñ& &ð'
ñ( ð)
ð E
ð* 
ÜðØ˜&ðàœŸ
™
 6×#5Ñ#5Ó6ðð ˜Ÿ™ ¢¨"Ó-ðð ˜Ÿ™Ò9Ô)9ð	ð
 ˜&Ÿ-™-ÒF¬;×+@Ñ+@×+FÑ+Fðð ˜&Ÿ-™-ðð ˜6Ÿ>™>ðð ˜Hðð �v—z‘zðð ˜6Ÿ>™>ðð ˜6×.Ñ.ðð ˜&Ÿ-™-ðð ˜#Ÿ(™(Ñ"F¸ºÀ2Ô"FÓFðð   §¡Ñ)TÀÒ@SÐQSÔ)TÓ!Tðð �sðð    ×!5Ñ!5ð!ð" " 3§8¡8¨F×,BÑ,BÓ#Cð#ð$ &7Ø#×-Ñ-ò'ð* ×*Ñ*Øõ/	
ñ2 Ø÷aE
ð E
ðb �n‰nØ—=‘=Ø×*Ñ*ØØ—=‘=Ø—,‘,Ø—
‘
Ø—N‘NØ—=‘=Ø—N‘NØ—=‘=Ø—N‘NØØØ'ØØ ×.Ñ.Ø"×2Ñ2Ò:°dØ/Ø×&Ñ&ð' ó 
ˆ÷cE
ôL ‡J�Jˆ} §¡¨s¯z©zÒ/?¸R×.DÑ.DÀVÓ.LÐRU×RYÑRYÕZÜ˜d E¨6×+=Ñ+=Ô>Ø—Z‘ZÒ% 2×*Ñ*¨6Ó2ˆ	Ü�‰Ø˜y˜kð *Ø"Ÿy™yŸ~™~Ð.¨a°·±¨xÐ7RðTô	
ô    S°Ö8÷[E
ð E
ús   ÁEL?ÇB*L?Ì?Mc                   ó   — e Zd ZdZdZdZy)ÚScheduledJobStatusFilterz§Possible values for `hf jobs scheduled ls --status`.

    Scheduled Jobs are not "running": they are either active (i.e. they will trigger new runs) or suspended.
    ÚactiveÚ	suspendedN)rr   rs   rt   ru   ÚACTIVEÚ	SUSPENDEDr{   rK   rI   r	  r	  )  s   „ ñð
 €FØ�IrK   r	  z,Create and manage scheduled Jobs on the Hub.Ú	scheduledzRhf jobs scheduled run "0 0 * * *" --name daily-script python:3.12 python script.pyÚscheduleÚsuspendÚconcurrencyc                 óª  — t        |||«       t        ||
«      }t        |||¬«      }t        ||¬«      xs i }|j	                  dt        ||t        |||�t        |«      gnd||||	xs g ¬«      ¬«      «       t        |¬«      }|rdnt        |	||¬«      }t        i d	| “d
|“d|“d|“dt        j                  |«      “d|xs t        j                  j                  “d|“d|“d|“d|“d|	xs g “d|“ddj                  d„ |xs g D «       «      “ddj                  d„ |xs g D «       «      “d|“d|“|¬«       |ry|j!                  ||| |||||||||||||¬«      }t#        j$                  d|j&                  |j(                  j*                  xs i j-                  d«      ¬«       t/        ||«      sf|j(                  j*                  xs i j-                  d«      }t#        j0                  d|› d |j2                  j4                  › d!|j&                  › d"�«       t#        j0                  d#|j2                  j4                  › d!|j&                  › d$�«       y)%zSchedule a Job.r‘   r“   r€   N)rh   rj   rš   r@   rl   rm   ro   r›   r#  r—   r  r  r  rg   r  rh   rj   r   rl   rm   rL   rn   r  rR   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   r%  r&  s     rI   r�   z scheduled_run.<locals>.<genexpr>|  r(  r)  r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   r%  r&  s     rI   r�   z scheduled_run.<locals>.<genexpr>}  r+  r)  r  r@   )rg   r  r  r  r  rl   rm   rn   rL   rh   rj   r   r  r  r  r@   úScheduled Job createdrð  úScheduled Job auto-named 'ú2'. Pass `--name` or run `hf jobs scheduled labels rC   r0  úUse `hf jobs scheduled inspect ú` to view its details.)r5   r3   rŸ   r¡   r2  r   r£   rv   r2   ra   rÜ   r3  r´   r   rÄ   r¥   Úcreate_scheduled_jobr;   r]   rø   Újob_specrn   r5  r6  rY   rù   r€   )r  rg   r  r  r  rl   rm   r€   r�   r`   r}   r~   rh   rj   r   r‚   r  r  r  r@   r  r  r   r!  r¤   r§   r©   rM   rL   Úscheduled_jobr7  s                                  rI   Úscheduled_runr  7  sß  € ô@ �f˜k¨5Ô1Ü˜C Ó*€GÜ$ W¨lÀGÔL€KÜ" 5¨tÔ4Ò:¸€JØ×ÑØÜ$ØØÜ)ØØØ)1Ð)=”s˜8“}‘oÀ4Ø#ØØ#Ø#š\ rôô	
ôô" ˜5Ô
!€CÙ‰dÔ#>¸vÈ3ÐZcÔ#d€GÜð	
Ø˜ð	
à�wð	
ð ˜;ð	
ð �Uð		
ð
 ”u—z‘z 'Ó*ð	
ð �fÒ;¤× 5Ñ 5× ;Ñ ;ð	
ð �wð	
ð ˜ð	
ð �7ð	
ð �{ð	
ð �v’| ð	
ð �jð	
ð �c—h‘hÑB°V²\¸rÔBÓBð	
ð ˜SŸX™XÑ%P¸MÒ<OÈRÔ%PÓPð	
ð  Ð!2ð	
ð  ˜ð!	
ð$ õ'ñ* ØØ×,Ñ,ØØØØØØØØØØØØØØ#Ø+Øð! -ó €Mô$ ‡J�JÐ&¨=×+;Ñ+;À=×CYÑCY×C`ÑC`ÒCfÐdf×BkÑBkÐlrÓBsÕtÜ˜d EÔ*Ø"×+Ñ+×2Ñ2Ò8°b×=Ñ=¸fÓEˆ	Ü�‰Ø(¨¨ð 4)Ø)6×)<Ñ)<×)AÑ)AÐ(BÀ!ÀM×DTÑDTÐCUÐUpðrô	
ô ‡H�HÐ.¨}×/BÑ/B×/GÑ/GÐ.HÈÈ-×JZÑJZÐI[Ð[qÐrÕsrK   )zhf jobs scheduled lszhf jobs scheduled ls -az'hf jobs scheduled ls --status suspendedz(hf jobs scheduled ls --name daily-scriptz5hf jobs scheduled ls --label env=prod --label team=mlzTShow all scheduled Jobs (default hides suspended). Cannot be combined with --status.zgOnly show scheduled Jobs with the given status. Comma-separated or repeated, e.g. `--status suspended`.z…Only show scheduled Jobs with the given `key=value` label. Repeat to require several labels, e.g. `--label env=prod --label team=ml`.zPOnly show scheduled Jobs with the given name (shortcut for `--label name=NAME`).c           	      óð  — t        |¬«      }| r|rt        d«      ‚g }|xs g D ])  }|j                  d„ |j                  d«      D «       «       Œ+ |D �	cg c]  }	|	t	        t
        «      vsŒ|	‘Œ }
}	|
r.t        d|
› dt
        D �	cg c]  }	|	j                  ‘Œ c}	› d�«      ‚|r%t
        j                  |v }t
        j                  |v }nd}| }i }|xs g D ]/  }d	|vrt        d
|› d�«      ‚|j                  d	d«      \  }}|||<   Œ1 |�d|v rt        d«      ‚||d<   |j                  ||xs d¬«      }g }|D ]-  }|j                  xs d}|r|sŒ|s|sŒ|j                  |«       Œ/ g }|D �]@  }t        |«      }|j                  d«      xs i }|j                  d«      xs i }|j                  d«      }|j                  d«      xs g }|j                  d«      xs i j                  d«      xs d|d<   |j                  d«      xs d|d<   |rdj                  |«      nd|d<   |r)|j                  d«      r|d   dd j                  dd«      nd|d<   |j                  d«      r|d   dd j                  dd«      nd|d <   |j                  d!«      xs d|d!<   |j                  |«       �ŒC t!        j"                  |g d"¢d#¬$«       |se|s|rJd%j                  g d&„ |D «       ¢d'„ |j%                  «       D «       ¢«      }t!        j&                  d(|› �«       n| st!        j(                  d)«       |r;|d*   d#   }t!        j(                  d+|› d,�«       t!        j(                  d-|› d.�«       yyc c}	w c c}	w )/zÄList scheduled Jobs.

    Use `--status` to filter by status (`active` or `suspended`) and `--label` to filter by `key=value` labels.
    A scheduled Job must match every filter to be listed.
    r#  rŒ  c              3   óz   K  — | ]3  }|j                  «       sŒ|j                  «       j                  «       –— Œ5 y ­wrÊ   )r³   ÚlowerrŽ  s     rI   r�   zscheduled_ps.<locals>.<genexpr>á  s+   è ø€ Ò^°TÐQU×Q[ÑQ[ÕQ]˜DŸJ™J›L×.Ñ.×0Ñ^ùs   ‚;˜#;r�  zInvalid status filter(s) z: expected one of rá   Tr¯   r‘  r’  r$   Nr€   r“  )r@   rn   Fr  rî   Úlast_jobr  rn   rV  r•  r–  rR   Úatr˜  r™  Úlast_runÚnext_job_run_atÚnext_runr  )rø   r€   r  r–  r  r#  r%  r  rø   r�  r°   c              3   ó&   K  — | ]	  }d |› �–— Œ y­wrŸ  r{   r   s     rI   r�   zscheduled_ps.<locals>.<genexpr>$  r¢  r�   c              3   ó2   K  — | ]  \  }}d |› d|› �–— Œ y­wr¤  r{   r¥  s      rI   r�   zscheduled_ps.<locals>.<genexpr>$  r¨  r)  z#No scheduled jobs matched filters: zENo active scheduled jobs. Use `-a`/`--all` to include suspended ones.r   r  z(` to view details about a scheduled job.zUse `hf jobs scheduled trigger z)` to trigger a scheduled job immediately.)r2   r   rU   rF   Útupler	  r¥   r  r  Úlist_scheduled_jobsr  r\   r:   r5  r´   r«  r;   rw  r�   rÔ   rY   )r‰  rî   r�   r€   r@   r  rM   r¬  r¥   r¡  Úunknown_statusesÚshow_activeÚshow_suspendedrn   Ú	raw_labelr„   Úscheduled_jobsÚfiltered_jobsr  r  r�   Úsjrã   r  Ústatus_dictr!  r³  r´  Úfirst_item_ids                                rI   Úscheduled_psr3  ¡  sÎ  € ôp ˜5Ô
!€Cá
‰vÜÐIÓJÐJð !€LØ’˜2ò _ˆØ×ÑÑ^¸U¿[¹[ÈÓ=MÔ^Õ^ð_ð $0Ö\˜a°1¼EÔBZÓ<[Ò3[šÐ\ÐÐ\ÙÜØ'Ð(8Ð'9ð :Ü":Ö;˜Q�—“Ò;Ð<¸Að?ó
ð 	
ñ
 Ü.×5Ñ5¸ÐEˆÜ1×;Ñ;¸|ÐK‰àˆØˆð  €FØ’[˜bò ˆ	Ø�iÑÜÐ3°I°;Ð>`ÐaÓbÐbØ—_‘_ S¨!Ó,‰
ˆˆUØˆˆsŠð	ð ÐØ�VÑÜÐSÓTÐTØˆˆv‰à×,Ñ,°yÈÊÐSWÐ,ÓX€Nà€MØ'ò ,ˆØ×'Ñ'Ò0¨5ˆÙ™>ØÙ™{ØØ×Ñ˜]Õ+ð,ð #%€EØó ˆÜ! "Ó%ˆØ—8‘8˜JÓ'Ò-¨2ˆØ—h‘h˜xÓ(Ò.¨BˆØ—?‘? :Ó.ˆØ�l‰l˜9Ó%Ò+¨ˆØ Ÿ™ XÓ.Ò4°"×9Ñ9¸&ÓAÒJÀUˆˆV‰Ø&Ÿl™l¨>Ó:ÒC¸eˆˆ]ÑÙ+.˜#Ÿ(™( 3œ-°EˆˆY‰ÙDLÐQY×Q]ÑQ]Ð^bÔQc˜8 D™>¨#¨2Ð.×6Ñ6°s¸CÔ@ÐinˆˆZÑàEPÇ_Á_ÐUfÔEgˆKÐ)Ñ*¨3¨BÐ/×7Ñ7¸¸SÔAÐmrð 	ˆZÑð Ÿ(™( 9Ó-Ò6°ˆˆY‰Ø�‰�TÖðô  ‡I�IØÚgØõñ
 Ù™6ØŸ)™)ØhÑ7¨,Ô7ÐhÑ:gÐX^×XdÑXdÓXfÔ:gÐhóˆKô �H‰HÐ:¸;¸-ÐHÕIÙÜ�H‰HÐ\Ô]ÙØ˜a™ ™ˆÜ�‰Ð2°=°/ÐAiÐjÔkÜ�‰Ð2°=°/ÐAjÐkÕlð ùòM ]ùò <s   ÁM.Á+M.ÂM3zhf jobs scheduled inspect <id>Úscheduled_job_idsz>Scheduled Job IDs to inspect (or 'namespace/scheduled_job_id')c           
      ó`  — g }| D ]"  }t        ||«      \  }}|j                  |«       Œ$ |} t        |¬«      }| D �cg c]  }|j                  ||¬«      ‘Œ }}t	        j
                  |D �cg c],  }t        t        |«      |j                  j                  ¬«      ‘Œ. c}d¬«       yc c}w c c}w )z:Display detailed information on one or more scheduled Jobsr#  ©Úscheduled_job_idr@   rÍ  rø   rn  N)
rJ   r\   r2   Úinspect_scheduled_jobr;   rw  rÎ  r:   r  rn   )	r4  r@   r  r€  r?   rM   r7  r.  r0  s	            rI   Úscheduled_inspectr9  /  s¹   € ð €JØ#ò "ˆÜ8¸ÀÓKÑˆ�	Ø×Ñ˜&Õ!ð"ð #ÐÜ
˜5Ô
!€Cð !2öàð 	×!Ñ!Ð3CÈyÐ!ÕYð€Nð ô ‡I�IÐZhÖiÐTVŒ}Ô/°Ó3¸B¿K¹K×<NÑ<NÖOÒiÐrvÖwùò	ùò js   ¼B&Á+1B+Údeletezhf jobs scheduled delete <id>r7  c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)zDelete a scheduled Job.r#  r6  zScheduled Job deletedrÝ  N)rJ   r2   Údelete_scheduled_jobr;   r]   ©r7  r@   r  rM   s       rI   Úscheduled_deleter>  H  óF   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ×ÑÐ.>È)ÐÔTÜ‡J�JÐ&Ð+;Ö<rK   zhf jobs scheduled suspend <id>c                 óÀ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       t        j
                  d| › d�«       y)z Suspend (pause) a scheduled Job.r#  r6  zScheduled Job suspendedrÝ  zUse `hf jobs scheduled resume z` to resume it.N)rJ   r2   Úsuspend_scheduled_jobr;   r]   rY   r=  s       rI   Úscheduled_suspendrB  U  s^   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ×ÑÐ/?È9ÐÔUÜ‡J�JÐ(Ð-=Õ>Ü‡H�HÐ-Ð.>Ð-?¸ÐOÕPrK   Úresumezhf jobs scheduled resume <id>c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)z!Resume (unpause) a scheduled Job.r#  r6  zScheduled Job resumedrÝ  N)rJ   r2   Úresume_scheduled_jobr;   r]   r=  s       rI   Úscheduled_resumerF  c  r?  rK   Ú
reschedulez-hf jobs scheduled reschedule <id> "0 9 * * 1"c                 ó.  — t        | |«      \  } }t        |¬«      }|j                  | ||¬«      }t        j                  d|j
                  |j                  ¬«       t        j                  d|j                  j                  › d|j
                  › d�«       y)	z!Change when a scheduled Job runs.r#  )r7  r  r@   zScheduled Job rescheduled)rø   r  r  rC   z` to see its next run.N)
rJ   r2   Úupdate_scheduled_job_scheduler;   r]   rø   r  rY   rù   r€   )r7  r  r@   r  rM   rç   s         rI   Úscheduled_reschedulerJ  p  s   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ
×
+Ñ
+Ð=MÐX`ÐluÐ
+Ó
v€CÜ‡J�JÐ*¨s¯v©vÀÇÁÕMÜ‡H�HÐ.¨s¯y©y¯~©~Ð.>¸aÀÇÁ¸xÐG]Ð^Õ_rK   Útriggerzhf jobs scheduled trigger <id>c                 ó,  — t        | |«      \  } }t        |¬«      }|j                  | |¬«      }t        j                  d|j
                  |j                  ¬«       t        j                  d|j                  j                  › d|j
                  › d�«       y)	zJTrigger a scheduled Job to run immediately (does not change the schedule).r#  r6  zScheduled Job triggered)rø   r  r  rC   z` to stream logs.N)
rJ   r2   Útrigger_scheduled_jobr;   r]   rø   r  rY   rù   r€   )r7  r@   r  rM   rç   s        rI   Úscheduled_triggerrN    s|   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ
×
#Ñ
#Ð5EÐQZÐ
#Ó
[€CÜ‡J�JÐ(¨S¯V©V¸¿¹ÕAÜ‡H�HÐ$ S§Y¡Y§^¡^Ð$4°A°c·f±f°XÐ=NÐOÕPrK   )z1hf jobs scheduled labels <id> --name daily-scriptz>hf jobs scheduled labels <id> --label env=prod --label team=mlz%hf jobs scheduled labels <id> --clearz)Remove all labels from the scheduled job.c                 óš  — |s|€|st        d«      ‚|s|�|rt        d«      ‚t        | |«      \  } }t        |¬«      }|�6|s4|j                  | |¬«      j                  j
                  xs i }i |¥d|i¥}nt        ||¬«      xs i }|j                  | ||¬«      }	t        j                  d	|	j                  |j                  d«      ¬
«       y)zpUpdate labels on a scheduled Job. Passing --label replaces all existing labels; passing --name alone keeps them.Nrí  rî  r#  r6  r€   r“   )r7  rn   r@   rï  rð  )r   rJ   r2   r8  r  rn   r¡   Úupdate_scheduled_job_labelsr;   r]   rø   r5  )
r7  r€   r�   rÖ  r@   r  rM   rò  rn   r  s
             rI   Úscheduled_labelsrQ  �  sñ   € ñ" �T�\©%ÜØsó
ð 	
ñ 	�Ð!¡uÜØzó
ð 	
ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØÐ¡ð ×%Ñ%Ð7GÐS\Ð%Ó]×fÑf×mÑmÒsÐqsð 	ð 2�NÐ1 F¨DÑ1‰ä" 5¨tÔ4Ò:¸ˆØ×3Ñ3Ø)°&ÀIð 4ó €Mô ‡J�JÐ M×$4Ñ$4¸6¿:¹:ÀfÓ;MÖNrK   z)Schedule UV scripts on HF infrastructure.zBhf jobs scheduled uv run "0 0 * * *" --name daily-script script.pyz<hf jobs scheduled uv run "0 0 * * *" script.py --with pandasc                 óâ  — t        |||«       t        |¬«      }t        d0i d|“d|“d|“d|“d|“d|“d|“d	|“d
|“d|“d|“d|“d|“d|	“d|
“d|“d|“dd“dd“d|“Ž5 }|j                  s|j                  rt        dt        › d�«      ‚t        i d| “d|“d|“d|“dt        j                  |j                  «      “ddj                  |xs g «      “d|j                  xs t        “d|j                  xs t        j                  j                   “d|j"                  “d|j$                  “d|“d	|j&                  “d|j(                  “d|j*                  “d |j,                  “d!dj                  d"„ |xs g D «       «      “d#dj                  d$„ |xs g D «       «      “||j.                  d%œ¥|j0                  |¬&«       |r
	 ddd«       y|j3                  |j4                  |j                  | ||||j"                  |j                  |j&                  |j(                  |j,                  |j6                  |j                  |j$                  |||||j.                  ¬'«      }ddd«       t9        j:                  d(j<                  |j>                  j,                  xs i jA                  d«      ¬)«       tC        |	|
j0                  «      sf|j>                  j,                  xs i jA                  d«      }t9        jD                  d*|› d+|jF                  jH                  › d,|j<                  › d-�«       t9        jD                  d.|jF                  jH                  › d,|j<                  › d/�«       y# 1 sw Y   �ŒxY w)1rþ  r#  rM   rd   rf   r|   rg   rh   ri   rl   r}   rm   r~   rj   r   r€   r�   r`   r@   rk   Nrp   r‚   zjScheduled Jobs do not support network groups: remove 'network_group'/'network_aliases' from the script's [z] table to schedule it.r  r  r  rÿ  r   rR   rL   rn   r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   r%  r&  s     rI   r�   z#scheduled_uv_run.<locals>.<genexpr>  r  r)  r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrÊ   r%  r&  s     rI   r�   z#scheduled_uv_run.<locals>.<genexpr>  r  r)  r  rÆ   )rd   rf   r  r  r  r|   ri   rg   rl   rm   rn   rL   rh   rj   r   r  r  r  r@   r  rð  r  r  rC   r0  r  r  r{   )%r5   r2   r­   rk   rp   r   r<   rÜ   r3  r´   rf   rg   r   rh   r   rÄ   r¥   ri   rj   rl   rm   ro   rn   r@   rq   Úcreate_scheduled_uv_jobrd   rL   r;   r]   rø   r  r5  r6  rY   rù   r€   )r  rd   rf   r  r  rg   rh   rl   rm   r€   r�   r`   r}   r~   rj   r   r‚   r  r  r  r@   r  rü  ri   r  r   r!  rM   r¬   rç   r7  s                                  rI   Úscheduled_uv_runrV  º  s  € ôL �f˜k¨5Ô1Ü
˜5Ô
!€CÜ	ò 
Ùð
áð
ñ  ð
ñ ð	
ñ
 ð
ñ ð
ñ ð
ñ ð
ñ ð
ñ ð
ñ "ð
ñ ð
ñ ð
ñ ð
ñ ð
ñ  ð!
ñ" ð#
ñ& ð'
ñ( ð)
ñ* ð+
ð K
ð, 
Ø×Ò 6×#9Ò#9ÜðÜ(˜\Ð)@ðBóð ô 	ðØ˜Hðà˜7ðð ˜{ðð ˜&ð	ð
 œŸ
™
 6×#5Ñ#5Ó6ðð ˜Ÿ™ ¢¨"Ó-ðð ˜Ÿ™Ò9Ô)9ðð ˜&Ÿ-™-ÒF¬;×+@Ñ+@×+FÑ+Fðð ˜&Ÿ-™-ðð ˜6Ÿ>™>ðð ˜Hðð �v—z‘zðð ˜6Ÿ>™>ðð ˜6×.Ñ.ðð ˜&Ÿ-™-ðð  ˜#Ÿ(™(Ñ"F¸ºÀ2Ô"FÓFð!ð"   §¡Ñ)TÀÒ@SÐQSÔ)TÓ!Tð#ð$ &7Ø#×-Ñ-ò'ð* ×*Ñ*Øõ/	
ñ2 Ø÷mK
ð K
ðn ×)Ñ)Ø—=‘=Ø×*Ñ*ØØØ#ØØ—=‘=Ø—,‘,Ø—
‘
Ø—N‘NØ—=‘=Ø—N‘NØ—=‘=Ø—N‘NØØØ'Ø/Ø×&Ñ&ð' *ó 
ˆ÷oK
ôX ‡J�JÐ&¨3¯6©6¸¿¹×9LÑ9LÒ9RÐPR×8WÑ8WÐX^Ó8_Õ`Ü˜d E¨6×+=Ñ+=Ô>Ø—\‘\×(Ñ(Ò.¨B×3Ñ3°FÓ;ˆ	Ü�‰Ø(¨¨ð 4)Ø),¯©¯©Ð(8¸¸#¿&¹&¸ÐA\ð^ô	
ô ‡H�HÐ.¨s¯y©y¯~©~Ð.>¸aÀÇÁ¸xÐG]Ð^Õ_÷gK
ñ K
ús   ÁE!M$Ç	BM$Í$M.rã   c                ó@   — |xs i j                  d«      }|€| S d|i| ¥S )a  Promote the `name` label to a top-level `name` field for display.

    The `name` is kept inside `labels` too (the dataclasses and API payloads are unchanged); this
    only makes it a first-class column/field in command outputs. No-op when there is no name.
    r€   )r5  )rã   rn   r€   s      rI   rÎ  rÎ  ;  s2   € ð ŠL�b×Ñ˜fÓ%€DØ€|ØˆØ�DÐ!˜DÐ!Ð!rK   c                 óF   — | duxs d|v xs t        d„ |xs g D «       «      S )zlWhether the Job was named on purpose: via `--name`, a `name=` label, or the script's `[tool.hf-jobs]` table.Nzlabels.namec              3   óL   K  — | ]  }|j                  d d«      d   dk(  –— Œ y­w)r¯   r$   r   r€   N)rF   )rŽ   rã   s     rI   r�   z%_has_explicit_name.<locals>.<genexpr>L  s%   è ø€ ÒG°4ˆt�z‰z˜#˜qÓ! !Ñ$¨Õ.ÑGùr`  )Úany)r€   r�   rq   s      rI   r6  r6  G  s7   € ð 	�DÐò 	HØ˜KÐ'ò	HäÑG¸5º;ÀBÔGÓGðrK   c                óš   — | s|€yi }| xs g D ]$  }d|v r|j                  dd«      n|df\  }}|||<   Œ& |�d|v rt        d«      ‚||d<   |S )a  Parse label key-value pairs from CLI arguments.

    Args:
        labels: List of label strings in KEY=VALUE format. If KEY only, then VALUE is set to empty string.

    Returns:
        Dictionary mapping label keys to values, or None if no labels or name provided.
    Nr¯   r$   r˜   r€   z4--name and --label name=... cannot both be provided.)rF   r   )rn   r€   r©   Ú	label_varr„   r¥   s         rI   r¡   r¡   P  s}   € ñ �d�lØØ!#€JØ’\˜rò  ˆ	Ø03°yÑ0@�Y—_‘_ S¨!Ô,ÀyÐRTÀo‰
ˆˆUØˆ
�3Šð ð ÐØ�ZÑÜÐQÓRÐRØ!ˆ
�6ÑØÐrK   rÖ   rl  c           
      óô  — t        g | ¢|‘­Ž D �cg c]  }t        d„ |D «       «      ‘Œ }}t        t        j                  «       j                  t        |«      dz  «      }t        |«      t        |«      z   |kD  r|j                  t        |«      «      }||xx   dz  cc<   t        |«      t        |«      z   |k  r#|t        |«      z
  t        |«      z
  ||   z   ||<   t        |«      t        |«      z   |kD  rŒ dt        |«      z  j                  |Ž }g }|j                   |j                  |Ž «       |j                   |j                  |D �cg c]  }d|z  ‘Œ	 c}Ž «       | D ]r  }	t        |	|«      D �
�cg c];  \  }
}t        t        |
«      «      |kD  rt        |
«      d|dz
   dz   n
t        |
«      ‘Œ= }}
}|j                   |j                  |Ž «       Œt d	j                  |«      S c c}w c c}w c c}}
w )
z‰
    Inspired by:

    - stackoverflow.com/a/8356620/593036
    - stackoverflow.com/questions/9535954/printing-lists-as-tabular-data
    c              3   óD   K  — | ]  }t        t        |«      «      –— Œ y ­wrÊ   )rË   rv   )rŽ   Úxs     rI   r�   z_tabulate.<locals>.<genexpr>m  s   è ø€ Ò/ a”cœ#˜a›&—kÑ/ùs   ‚ é   ré   z{{:{}}} ú-Né   z...rÍ   )rX  rÐ   ÚshutilÚget_terminal_sizeÚcolumnsrË   ÚsumrÙ   r  r\   rv   r´   )rÖ   rl  ÚcolÚ
col_widthsÚterminal_widthÚcol_to_minimizeÚ
row_formatrØ   ÚwrY  r_  Ú	col_widthÚrow_format_argss                rI   r|  r|  f  sê  € ô <?Ð;NÀÐ;NÀgÒ;NÖO°C”#Ñ/¨3Ô/Õ/ÐO€JÐOÜœ×1Ñ1Ó3×;Ñ;¼SÀ»\ÈBÑ=NÓO€NÜ
ˆg‹,œ˜Z›Ñ
(¨>Ò
9Ø$×*Ñ*¬3¨z«?Ó;ˆØ�?Ó#¨Ñ)Ó#Üˆw‹<œ#˜j›/Ñ)¨^Ò;Ø*8¼3¸z»?Ñ*JÌSÐQXË\Ñ*YÐ\fÐgvÑ\wÑ*wˆJ�Ñ'ô	 ˆg‹,œ˜Z›Ñ
(¨>Ó
9ð
 4�*œs 7›|Ñ+×3Ñ3°ZÐ@€JØ€EØ	‡L�LÐ"�×"Ñ" GÐ,Ô-Ø	‡L�LÐ"�×"Ñ"°jÖ$A° S¨1£WÒ$AÐBÔCØò :ˆô !$ C¨Ó 4÷
á��9ô 03´3°q³6«{¸YÒ/FŒC�‹F�?�Y ‘]Ð# eÒ+ÌCÐPQËFÑRð
ˆñ 
ð 	�‰Ð&�Z×&Ñ&¨Ð8Õ9ð:ð �9‰9�UÓÐùò# Pùò %Bùó
s   �G*ÅG/Å6A G4r™  ÚqueueÚfunc.Úkwargsc                 ó@   —  |di |¤ŽD ]  }| j                  |«       Œ y )Nr{   )Úput)ro  rp  rq  r]   s       rI   Ú_write_generator_to_queuert  „  s#   € Ù‘.˜‘.ò ˆØ�	‰	�&ÕñrK   ry  rq  c          	   #   ó6  K  — t        «       }|D �cg c]  }| j                  t        |||f«      ‘Œ }}	 	 	 |j                  d¬«      –— Œc c}w # t        $ r' t        d„ |D «       «      r|j                  «       rY nY Œ5w xY wn# t        $ r Y nw xY w	 |D �cg c]  }|j                  d¬«      ‘Œ nc c}w c} y# t        j                  $ r Y yw xY w# 	 |D �cg c]  }|j                  d¬«      ‘Œ nc c}w c} w # t        j                  $ r Y w w xY wxY w­w)a;  
    Takes a function that returns an iterable of items, and run it in parallel using threads to return the flattened iterable of items as they arrive.

    This is inspired by those three `map()` variants, and is the mix of all three:

    * `imap()`: like `map()` but returns an iterable instead of a list of results
    * `imap_unordered()`: like `imap()` but the output is sorted by time of arrival
    * `flatmap()`: like `map()` but given a function which returns a list, `flatmap()` returns the flattened list that is the concatenation of all the output lists
    gš™™™™™©?)rj   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wrÊ   )Úready)rŽ   Úasync_results     rI   r�   z%iflatmap_unordered.<locals>.<genexpr>Ÿ  s   è ø€ ÒN°�|×)Ñ)×+ÑNùs   ‚N)
r   Úapply_asyncrt  r5  r   r‰  Úemptyr  rx  rå  )ry  rp  rq  ro  rq  Úasync_resultsrx  s          rI   r}  r}  ‰  s  è ø€ ô “g€EØfqÖrÐ\b�T×%Ñ%Ô&?À%ÈÈvÐAVÕWÐr€MÐrðØðØ—i‘i¨�iÓ-Ò-ð ùò søô
 ò ÜÑNÀÔNÔNÐSX×S^ÑS^ÔS`ÙùðúàøÜò Ùðúð	Ø@MÖN°ˆ\×Ñ dÐÕ+ÑNùÖNøÜ×+Ñ+ò 	Ùð	ûð	Ø@MÖN°ˆ\×Ñ dÐÕ+ÑNùÖNøÜ×+Ñ+ò 	Ùð	ÿsÇ   ‚D‘ A±D´B ¶A Á
B ÁDÁ+B Á;B Á?B Â B ÂC Â	BÂC ÂBÂC ÂB; ÂB2Â1	B; Â:DÂ;CÃDÃCÃDÃDÃC=ÃC4Ã3	C=Ã<DÃ=DÄDÄDÄDÄD)NNNNNNNNNNFFNNFNNNNNNFF)FNNN)NFNN)FNNNrM  NN)rA   N)NN)FNN)NNFNN)NNN)NNNNNNNNNNNNFFNNFNNNNNNNNFF)NNNNNNNNNNNNFNNNNNNFF)FNNNNN)NNNNNNNNNNNNNNFNNNNNNNNFF)r{   )³ru   r©  rx  Úmultiprocessing.poolr3  rc  rï   Úcollections.abcr   r   r   r   Ú
contextlibr   Údataclassesr   r	   Úenumr
   Úpathlibr   ro  r   r   Útypingr   r   r   Úurllib.parser   rú   Úhuggingface_hubr   r   r   r   r   r   r   Úhuggingface_hub._jobs_apir   r   r   r   Úhuggingface_hub.errorsr   Úhuggingface_hub.utilsr   Ú$huggingface_hub.utils._cache_managerr   Úhuggingface_hub.utils._hf_urisr!   Úhuggingface_hub.utils._parsingr"   r#   Ú
_cli_utilsr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   Ú
_frameworkr7   r8   Ú_outputr9   r:   r;   Ú_uv_script_headerr<   r=   r>   Ú
get_loggerrr   Úloggerrv   r(  rJ   rx   ra   rc   rõ   Úboolr­   ry   rŸ   r    r¢   r£   rÑ   rÜ   rÏ   r  ÚImageArgÚImageOptÚ	FlavorOptÚ	LabelsOptÚNameOptÚ
TimeoutOptÚAttemptsOptÚ	DetachOptÚ	DryRunOptÚNamespaceOptÚResourceGroupIdOptÚ	ExposeOptÚExposePublicOptÚSshEnabledOptÚNetworkGroupOptÚNetworkAliasOptÚWithOptÚ	PythonOptÚ
SuspendOptÚConcurrencyOptÚScheduleArgÚ	ScriptArgÚScriptArgsArgÚ
CommandArgÚJobIdArgÚ	JobIdsArgÚScheduledJobIdArgÚJobVolumesOptÚjobs_clirý   r  r  r  r8  r>  rF  r\  r_  rˆ  rµ  rÊ  rÏ  rÓ  rÚ  rß  rë  ró  rú  Úuv_appÚ	add_groupr  r	  Úscheduled_appr  r3  r9  r>  rB  rF  rJ  rN  rQ  Úscheduled_uv_apprV  rÎ  r6  r¡   r|  r™  rt  ry  rz  r}  r{   rK   rI   ú<module>r³     s)  ðñ Gã Û Û Û Û Û ß EÓ EÝ %ß (Ý Ý ß ß *Ñ *Ý !ã ç `× `Ñ `÷ó õ ,Ý )Ý =Ý 7ß J÷÷ ÷ ÷ ÷ ÷( )ß :Ñ :ß IÑ Ið 
ˆ×	Ñ	˜HÓ	%€ð.¨ð .¸¸t¹ð .ÈÈcÐSVÐY]ÑS]ÈoÑH^ó .ð8)Ø�#‰Y˜Ñð)Ø',ð)Ø9<¸t¹ð)à	ˆ&�\�DÑó)ðX ÷að aó ðað0 ðvà	ðvð ðvð �c‘˜TÑ!ð	vð
 �s‘)˜dÑ"ðvð �‰:ðvð �$‰Jðvð �$‰Jðvð 
ˆc‰�TÑ	ðvð �D‰jðvð �#‰Y˜Ñðvð ˜‘*ðvð �4‰Zðvð �D‰jðvð �‰*ðvð  �‰9�tÑð!vð" �‰I˜Ñð#vð$ �T‰zð%vð& ˜‘:ð'vð( ˜#‘Y Ñ%ð)vð* ð+vð, ˆ|˜T 4Ð'Ñ(ò-vó ðvðt MRò5Ø�#‰Y˜Ñð5Ø-0°4©Zð5ØEIð5à	ˆ#ˆs�T‰zˆ/Ñó5ð& NSò$2Ø�‰9ð$2Ø#'¨¨S°4©Z¨Ñ#8ð$2ØFJð$2à	ˆ#ˆs�T‰zˆ/Ñó$2ðN" 4¨¡9ð "¸DÀ¹Ið "È%ÐPTÐUXÑPYÐ[_Ð`cÑ[dÐPdÑJeó "ð$ !%Ø(,Ø"òà�$‰Jðð �4‰Zðð �T‰zð	ð
 
ˆc�3˜‘:ˆoÑ	ðð �#�s˜T‘z�/Ñ"ðð �s‘)ðð ˜‘:ðð ˜#‘Y Ñ%ðð �‰9�tÑðð 
ˆ#�Yóð>  €ð RTÐejò ˜t C¨ H™~ð ¸zÈ#¹ð Ð^bð Ðosó ð6x˜3ð x sð x¸ÀC¹ð xÈSó xð(  Ð ð ØÙØ'ôðñ€ð Øˆ$�JÙ
Ø=ôðñ€ð Øˆ$�JÙ
ØrÙ˜kÓ*ôðñ€	ð Øˆ�I�ÑÙ
ØØØBôðñ€	ð Øˆ$�JÙ
Øð vôðñ€ð Øˆ$�JÙ
Ø_ôðñ€
ð Øˆ$�JÙ
ˆ<˜QÐ%`Ôaðcñ€ð
 ØÙ
ØØØBôðñ€	ð ØÙ
ØØOôðñ€	ð Øˆ$�JÙ
Øeôðñ€ð Øˆ$�JÙ
Øð oôðñÐ ð Øˆ�I�ÑÙ
Øð Gôðñ€	ð Øˆ�I�ÑÙ
Øð iôðñ€ð ØÙ
Øð pôðñ€ð Øˆ$�JÙ
Øð ]ôðñ€ð Øˆ�I�ÑÙ
Øð Nôðñ€ð Øˆ�I�ÑÙ
ØØ4ôðñ€ð Øˆ$�JÙ
ØØØDôðñ€	ð Øˆ4�KÙ
Ø0ôðñ€
ð Øˆ4�KÙ
ØGôðñ€ð ØÙØlôðñ€ð ØÙØ3ôðñ€	ð Øˆ�I�ÑÙØ'ôðñ€ð Øˆ�IÙØ"ôðñ€
ð ØÙØ-ôðñ€ð Øˆ�I�ÑÙØ.ôðñ€	ð ØÙØAôðñÐ ð Øˆ�I�ÑÙ
ØØðeô	ð
ñ€ñ Ð?Ô@€ð ð ¨Gð ¸ó ð$* uð *°7ð *¸tó *ð*, Uð ,°ð ,ÀTð ,Èdó ,ð, 
×ÒØ	Ø.°Ð5òð ó 
ð ØØØØ ØØ#'ØØØ ØØØØ%)ØØ%)Ø%)Ø,0Ø"ØØØ Øò3e9Øðe9àðe9ð 
ðe9ð ð	e9ð
 ðe9ð ðe9ð ðe9ð ðe9ð !ðe9ð ðe9ð ðe9ð ðe9ð ðe9ð ðe9ð ðe9ð  #ð!e9ð" 
ð#e9ð$ #ð%e9ð& #ð'e9ð( *ð)e9ð* ð+e9ð, ð-e9ð. ð/e9ð0 ð1e9ð2 ð3e9ð4 
ò5e9ó
ðe9ðP 
×ÒØ
òð ó ð$ 	ð 	Ø"Øò'*
Øð*
àØÙØØð Eô	
ð	ñð*
ð Øˆd‰
ÙØØð Jô	
ð	ñð*
ð$ ð%*
ð& ð'*
ð( 
ò)*
óð*
ðZ'�3ð '˜4ó 'ð 3ð °°c¸3°h±ð ÐPTÐUXÑPYð Ð^bÐcgÐhkÐnqÑhqÑcrÑ^só ð.ØðØ!)¨$¨s°C¨x©.Ñ!9ðØJNÈsÉ)ðàˆe�D˜#˜t D¨¨s©¡OÑ4Ð4Ñ5Ñ6óð 
×ÒØòð ó ð ð 	Ø"ØòjuØðjuàØÙØØØ|ô	
ð	ñðjuð ðjuð ðjuð 
òjuóðjuðZ 
×ÒØòð ó 
ð& 	ð 	ð 	ð 	ð 	Ø"ØòQxaØ	ØÙØØØjô	
ð	ñ
ðxað ØˆS‰	�DÑÙØÙ! (Ó+Øyô	
ð	ñðxað" ØˆS‰	�DÑÙØØð Oô	
ð	ñð#xað2 Øˆd‰
ÙØØYô	
ð	ñð3xað@ ØÙØØVô	
ð	ñðAxaðN ðOxaðP ðQxaðR 
òSxaó
ðxaðv 
×Ò�*Ð(:Ð';ÐÓ<ó]ó =ð]ð6 
×Ò�)Ð'AÐ&BÐÓCð #ØòhØØˆS‰	ÙØ=ô	
ð	ñðhð ðhð ðhð 
òhó Dðhð* 
×Ò�'Ð%=Ð?`Ð$aÐÓbð Ø"Øò	9Øð9àð9ð ð9ð ð	9ð
 
ò9ó cð9ð 
×ÒØòð ó ð 	ð 	ØQVØ"Øò#qØðqàØˆS‰	�DÑÙØô	
ð	ñðqð ØˆS‰	�DÑÙØð Uô	
ð	ñðqð �T™6 )Ð2LÔMÐMÑNðqð  ð!qð" ð#qð$ 
ò%qóðqð< 
×Ò�(Ð&?Ð%@ÐÓAð #Øò	+Øð	+àð	+ð ð	+ð 
ò		+ó Bð	+ð 
×ÒØ
òð ó ð( 	Ø"Øò4
ØØˆS‰	ÙØ?ô	
ð	ñð4
ð Øˆd‰
ÙØgô	
ð	ñð4
ð ð4
ð ð4
ð 
ò4
óð4
ðn 
×ÒØòð ó ð ØØX]Ø"ØòEØðEà
ðEð ðEð �T™6 )Ð2SÔTÐTÑUð	Eð
 ðEð ðEð 
òEóðEð: 
×ÒØ	òð ó ð )-Ø!Ø"Øò#Øð#à%ð#ð ð#ð ð	#ð
 ð#ð 
ò#óð#ñL 
ÐdÔ	e€Ø × Ò �6 Ð Ô %ð ‡‚Ø	Ø.°Ð5òð ó ð "&ØØØØØØØ ØØ#'ØØ ØØØØ%)ØØ%)Ø%)Ø,0Ø"ØØØØØ Øò9n9Øðn9àðn9ð ðn9ð ð	n9ð
 
ðn9ð ðn9ð ðn9ð ðn9ð ðn9ð ðn9ð !ðn9ð ðn9ð ðn9ð ðn9ð ðn9ð  ð!n9ð" #ð#n9ð$ 
ð%n9ð& #ð'n9ð( #ð)n9ð* *ð+n9ð, ð-n9ð. ð/n9ð0 ð1n9ð2 ð3n9ð4 ð5n9ð6 ð7n9ð8 ð9n9ð: 
ò;n9óðn9ôb˜s Dô ñ Ð#QÔR€Ø × Ò �= {Ð Ô 3ð ×ÒØ	Ø.°Ð5ØbÐcð ó ð Ø"&ØØØØØ ØØ#'ØØØ ØØØ%)Ø,0Ø"ØØØ Øò1btØðbtàðbtð ðbtð ð	btð
  ðbtð 
ðbtð ðbtð ðbtð ðbtð ðbtð ðbtð !ðbtð ðbtð ðbtð ðbtð  ð!btð" ð#btð$ #ð%btð& *ð'btð( ð)btð* ð+btð, ð-btð. ð/btð0 ð1btð2 
ò3btóð
btðJ ×ÒØòð ó 	ð$ 	ð 	ð 	ð 	Ø"ØòOAmØ	ØÙØØØgô	
ð	ñ
ðAmð ØˆS‰	�DÑÙØÙ!Ð":Ó;ð)ô		
ð	ñ
ðAmð( ØˆS‰	�DÑÙØØð7ô		
ð	ñ
ð)Amð> Øˆd‰
ÙØØcô	
ð	ñð?AmðL ðMAmðN ðOAmðP 
òQAmó	ðAmðH ×Ò�yÐ,LÐ+MÐÓNð #ØòxØ ØˆS‰	ÙØQô	
ð	ñðxð ðxð ðxð 
òxó Oðxð0 ×Ò�xÐ+JÐ*KÐÓLð #Øò	=Ø'ð	=àð	=ð ð	=ð 
ò		=ó Mð	=ð ×Ò�yÐ,LÐ+MÐÓNð #Øò
QØ'ð
Qàð
Qð ð
Qð 
ò	
Qó Oð
Qð ×Ò�xÐ+JÐ*KÐÓLð #Øò	=Ø'ð	=àð	=ð ð	=ð 
ò		=ó Mð	=ð ×Ò�|Ñ/^Ð._ÐÓ`ð #Øò	`Ø'ð`àð`ð ð`ð ð	`ð
 
ó`ó að`ð ×Ò‘yÑ,LÐ+MÐÓNð #Øò
QØ'ð
Qàð
Qð ð
Qð 
ó	
Qó Oð
Qð ×ÒØóð ó ð ØØbgØ"ØòOØ'ðOà
ðOð ðOð �T™6 )Ñ2]Ô^Ð^Ñ_ð	Oð
 ðOð ðOð 
óOóðOñB !Ñ&QÔRÐ Ø × Ò Ð(¨tÐ Ô 4ð ×ÒØ	Ø.°Ð5áLÙFðð ó ð "&ØØ"&ØØØØØØØ ØØ#'ØØ ØØØ%)Ø,0Ø"ØØØØØ Øò7s`Øðs`àðs`ð ðs`ð ð	s`ð
  ðs`ð ðs`ð ðs`ð 
ðs`ð ðs`ð ðs`ð ðs`ð ðs`ð ðs`ð !ðs`ð ðs`ð  ð!s`ð" ð#s`ð$ ð%s`ð& #ð's`ð( *ð)s`ð* ð+s`ð, ð-s`ð. ð/s`ð0 ð1s`ð2 ð3s`ð4 ð5s`ð6 ð7s`ð8 
ó9s`óðs`ñr	"˜˜S #˜X™ð 	"°4¸¸S¸±>ÀDÑ3Hð 	"ÈTÐRUÐWZÐRZÉ^ô 	"ò˜S 4™Zð °°S±	¸DÑ0@ð ÈzÐZ]Éð Ðhlô ð GKò ˜d 3™i¨$Ñ.ð ¸¸t¹ð ÈtÐTWÐY\ÐT\É~Ð`dÑOdô ñ,�D˜˜c C™i™Ñ)ñ °D¸±Ið À#ô ñ6 ‰CƒL€ñ U¨1¡Xñ °X¹cÀ8ÈAÁ;Ð>NÑ5Oñ ÐY]ð Ðbfô ñ
Ø
×
Ò
×
)Ò
)ñà
‘3˜ ™Ð#Ñ
$ñð �d‘ð	ð
 ˆa�[õrK   