Ë
    ãß²j ` ã                   óP  — U 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Z ej                  d«      Z	dZ
dZdZdZdZd	Zd
ZdZde› d�Zde› de
› de› de› de› de› d�Zde
› de› de› d�Zde› de› d�ZdZdZdZ�d^dededefd„ZdZedz   ZdZe ed«      z   dfe ee«      z   dfe ed«      z   dfed z   d!fed"z   d#fd$d%ed&z   d'fed(z   d)fed*z   d+fed,z   d-fed.z   d/fgZej>                  ej@                  z  Z! e"d0d1h«      Z#eD � �cg c]  \  } } ejH                  | e!«      ||e#v f‘Œ c}} Z% e"h d2£«      Z&d3Z'djQ                  e'«      Z)d4ede*fd5„Z+d4edefd6„Z, ejH                  d7ej>                  «      Z-d4ede.fd8„Z/d4ede.fd9„Z0g d:‘d;‘d<‘d=‘d>‘d?‘d@‘dA‘dB‘dC‘dD‘dE‘dF‘dG‘dH‘dI‘dJ‘dK‘dL‘dM‘dN‘dO‘dP‘dQ‘dR‘dS‘dT‘dU‘dV‘dW‘dX‘dY‘dZ‘ed[z   d\f‘ed]z   d^f‘d_‘d`‘da‘db‘dce› �ddf‘de‘df‘dg‘dh‘di‘dj‘d%‘dke)› dl�dmf‘dne)› do�dpf‘dq‘dr‘dse)› dt�duf‘dve)› dt�dwf‘dxe)› dt�dyf‘dze)› dt�d{f‘d|e› �d}f‘d~e› �df‘d|e› d€e› �d�f‘d~e› d€e› �d‚f‘dƒ‘d„‘ed…z   d†f‘d‡‘dˆ‘d‰‘dŠ‘d‹‘dŒ‘d�‘dŽ‘d�‘d�‘d‘‘d’‘d“‘d”‘d•‘d–‘d—‘d˜‘d™e› �dšf‘d›e› d€e› �dœf‘d›e› d�e› �džf‘dŸe› d �d¡f‘d¢e› d �d£f‘d¤e› d �d¥f‘d¦e› �d§f‘d¨e› �d©f‘dŸe› de› d�dªf‘d¢e› de› d�d«f‘d¤e› de› d�d¬f‘dne)› d­�d®f‘d¯‘d°‘d±‘d²‘d³‘d´‘dµ‘d¶‘d·‘d¸‘ed¹z   ez   dºz   d»f‘ed¼z   ez   d½z   d»f‘ed¾z   ez   d¿z   d»f‘edÀz   ez   dÁz   d»f‘edÂz   ez   dÃz   d»f‘Z1e1D � �cg c]  \  } } ejH                  | e!«      |f‘Œ c}} Z2 e"d†dÄh«      Z3dÅdÆdÇœZ4i Z5e6ee7e   f   e8dÈ<   e1D � �cg c]$  \  } }|dÉ| v r| js                  dÉ«      dÊ   n| ddË f‘Œ& c}}  e:e4jw                  «       «      z   D ]U  \  Z<Z=e5j}                  e< e7«       «      j                  e<e=h«       e5j}                  e= e7«       «      j                  e=e<h«       ŒW dÌZ@e5j}                  dÍ e7«       «      jƒ                  e@«       e5j}                  e@ e7«       «      jƒ                  dÍ«       dÎede7e   fdÏ„ZBd4edefdÐ„ZCd4edefdÑ„ZDdÒZEdÓeEz   dÔz   ZF ejŽ                  dÕ¬Ö«      d×efdØ„«       ZHd4edÙedefdÚ„ZId4edefdÛ„ZJd4edefdÜ„ZK ejH                  dÝ«      ZL ejH                  dÞ«      ZM ejH                  dß«      ZN ejH                  dà«      ZOh dá£ZPh dâ£ZQdãdäheQh då£dæhdçdèhh dé£h dê£h dë£h dì£díœ	ZRdîdïhdðdñhh dò£dðdñhdóœZSdÊdÊdÊdÊdôœZTh dõ£ZU ejH                  dö«      ZV e.d÷„ døD «       «      ZWdùhh dú£dûdühdûhdýhh dþ£dûdühh dÿ£�d œZXh �d£h �d£h �d£h �d£h �d£h �d£h �d£�d�d	h�d œZY�d
h�d�dh�dhh �d£�dœZZh �d£h �d£h �d£h �d£�dœZ[ e"�d«       e"�d«       e"�d«       e"�d«      �dœZ\h �d£Z]h �d£Z^h �d£Z_ e"�d«      Z`�d\  ZaZbZc�dZd�dZe�d Zfd4ede*f�d!„Zg�d"e�d#ehdehdz  f�d$„Zi�d"e�d%ehf�d&„Zjd4ede.e:e.ehehf      e*f   f�d'„Zkd4edef�d(„Zld4ede.ee*f   f�d)„Zm�d*ededz  f�d+„Zn�d"e�d%ehde:e   dz  f�d,„Zod4ef�d-„Zp�d.e�d/e:e   dedz  f�d0„Zq�d/e:e   de.e*edz  f   f�d1„Zr�d2e�d/e:e   de.eef   dz  f�d3„Zsd4ef�d4„Ztd4e�d5ehdehf�d6„Zu�d_�d7�d8�d8�d8�d8�d9œ�d:e�d%eh�d;ehdz  �d<e�d=e*�d>e*�d?e*�d@e*f�dA„Zvd4e�d%ehdehdz  f�dB„Zwd4e�d%ehdehdz  f�dC„Zxd4e�d5ehde.ehehef   f�dD„Zy�dEededz  f�dF„Zz�dGedef�dH„Z{�dGedef�dI„Z|�dGedef�dJ„Z}�dGedef�dK„Z~d4e�dLehde*f�dM„Zd4ef�dN„Z€�d`d4e�dOedef�dP„Z�d4edef�dQ„Z‚d4e�d%eh�d;ehdef�dR„Zƒd4ef�dS„Z„d4e�d%ehdef�dT„Z…�dUede:e   dz  f�dV„Z†�dWe:e   dedz  f�dX„Z‡d4ef�dY„Zˆd4ef�dZ„Z‰d4ede*f�d[„ZŠd4ede*f�d\„Z‹d4ede.f�d]„ZŒyc c}} w c c}} w c c}} w (a  uÀ   Dangerous-command detection: normalization, tokenizing, and pattern tables.

Pure command classification for :mod:`tools.approval` â€” no approval state, config reads, or
prompting live here.
é    Nztools.approvalz$(?:~|\$home|\$\{home\})/\.ssh(?:/|$)z\(?:~\/\.hermes/|(?:\$home|\$\{home\})/\.hermes/|(?:\$hermes_home|\$\{hermes_home\})/)\.env\bzc(?:~\/\.hermes/|(?:\$home|\$\{home\})/\.hermes/|(?:\$hermes_home|\$\{hermes_home\})/)config\.yaml\bz;(?:(?:/|\.{1,2}/)?(?:[^\s/"\'`]+/)*\.env(?:\.[^/\s"\'`]+)*)z0(?:(?:/|\.{1,2}/)?(?:[^\s/"\'`]+/)*config\.yaml)zJ(?:~|\$home|\$\{home\})/\.(?:bashrc|zshrc|profile|bash_profile|zprofile)\bz9(?:~|\$home|\$\{home\})/\.(?:netrc|pgpass|npmrc|pypirc)\bz/private/(?:etc|var|tmp|home)/z	(?:/etc/|ú)z(?:z	|/dev/sd|Ú|z(?:\s*(?:&&|\|\||;).*)?$z(?=[\s;&|<>"\']|$)zm(?:^|[\n`]|\$\()\s*(?:sudo\s+(?:-[^\s]+\s+)*)?(?:env\s+(?:\w+=\S*\s+)*)?(?:(?:exec|nohup|setsid|time)\s+)*\s*Úpath_altÚtailÚreturnc                 ó   — d| › d| › d|› d�S )Nz(?:["\'](?:z
)["\']|(?:r   © )r   r   s     ú=/home/ubuntu/.hermes/hermes-agent/tools/approval_detection.pyÚ_hardline_rm_pathr   I   s   € Ø˜(˜ :¨h¨Z°q¸¸¸aÐ@Ð@ó    z|/home|/home/\*|/root|/root/\*|/etc|/etc/\*|/usr|/usr/\*|/var|/var/\*|/bin|/bin/\*|/sbin|/sbin/\*|/boot|/boot/\*|/lib|/lib/\*zrm\s+(-[^\s]*\s+)*z#(?:-[^\s]+(?:\s+[^-\s][^\s]*)?\s+)*z#/(?:(?:\.\.?)?/)*(?:\.\.?)?\**|/ \*z#recursive delete of root filesystemz$recursive delete of system directoryz(?:~|\$\{?HOME\}?)(?:/?|/\*)?z"recursive delete of home directoryzmkfs(\.[a-z0-9]+)?\bzformat filesystem (mkfs)z7dd\b[^\n]*\bof=/dev/(sd|nvme|hd|mmcblk|vd|xvd)[a-z0-9]*zdd to raw block device)z.>\s*/dev/(sd|nvme|hd|mmcblk|vd|xvd)[a-z0-9]*\búredirect to raw block device)z(:\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;\s*:ú	fork bombzkill\s+(-[^\s]+\s+)*-1\búkill all processesz!(shutdown|reboot|halt|poweroff)\bzsystem shutdown/rebootzinit\s+[06]\bzinit 0/6 (shutdown/reboot)z*systemctl\s+(poweroff|reboot|halt|kexec)\bzsystemctl poweroff/rebootztelinit\s+[06]\bztelinit 0/6 (shutdown/reboot)r   r   >   ÚshÚkshÚzshÚbashÚdashÚevalÚsourceú.)r   r   r   r   r   Úcommandc                 ó8   — t        d„ t        | «      D «       «      S )zEReturn whether any command-position word is a shell-carrying command.c              3   óœ   K  — | ]D  \  }}}t         j                  j                  t        |«      «      j	                  «       t
        v –— ŒF y ­w©N)ÚosÚpathÚbasenameÚ%_deobfuscate_shell_word_for_detectionÚlowerÚ_SHELL_CARRIER_NAMES)Ú.0Ú_Úwords      r
   ú	<genexpr>z*_contains_shell_carrier.<locals>.<genexpr>�   sB   è ø€ ò áˆAˆq�$ô 	�‰×ÑÔ>¸tÓDÓE×KÑKÓMÔQeÔeñùs   ‚A
A)ÚanyÚ_iter_shell_command_word_spans©r   s    r
   Ú_contains_shell_carrierr)   Ž   s!   € äñ ä8¸ÓAôó ð r   c                 óP   ‡ — dj                  ˆ fd„t        ‰ dd¬«      D «       «      S )a  Blank out quoted string CONTENT for positionless hardline matching (detection-only).
    Quote characters stay; inside double quotes `$(...)` and backtick spans are kept RAW because
    the shell really executes them. An unclosed quote masks to end-of-string, which cannot hide a
    runnable command (the shell would not run it either).

    Detection-only rewrite used by the quote-masked hardline rules (redirect-to-block-device, fork bomb):
    text inside single or double quotes is data the shell passes as an argument, so `echo "cat f >
    /dev/sda"` must not trip the unconditional floor (#93392). Unquoted text is untouched.
    Ú c              3   óN   •K  — | ]  \  }}}}|�|dv r‰|| nd||z
  z  –— Œ y ­w)N)ÚquoteÚsubstÚ r	   )r"   ÚkindÚiÚjr-   r   s        €r
   r%   z%_mask_quoted_prose.<locals>.<genexpr>    sC   øè ø€ ò áˆD�!�Q˜ð ˜¨Ð1CÑ)Cˆ��!‰ÈÐPQÐTUÑPUÉÓVñùs   ƒ"%ÚqT)r.   Únaive_backtick©ÚjoinÚ_scan_shellr(   s   `r
   Ú_mask_quoted_proser8   –   s-   ø€ ð �7‰7ó ä!,¨W¸CÐPTÔ!Uôó ð r   z)(?:^|[;&|`\n]|&&|\|\||\$\()\s*sudo\s+-S\bc                 ó‚   — dt         j                  vr-t        j                  t	        | «      j                  «       «      ryy)zâDetect ``sudo -S`` without configured SUDO_PASSWORD -> (is_blocked, description). When
    SUDO_PASSWORD is set, ``_transform_sudo_command`` injects ``-S`` itself, so this guard only
    fires when the LLM wrote it explicitly.ÚSUDO_PASSWORD)Tz*sudo password guessing via stdin (sudo -S)©FN)r   ÚenvironÚ_SUDO_STDIN_REÚsearchÚ _normalize_command_for_detectionr    r(   s    r
   Ú_check_sudo_stdin_guardr@   «   s3   € ð œbŸj™jÑ(¬^×-BÑ-BÔCcÐdkÓCl×CrÑCrÓCtÔ-uØCØr   c                 ó\  — t        | «      rdt        fS t        t        | «      «      \  }}|rdt        fS t        | «      D ]j  }|j                  «       }d}t        D ]M  \  }}}|r(|€&t        |«      r|nt        |«      j                  «       }|j                  |r|n|«      sŒGd|fc c S  Œl y)zWCheck hardline patterns (NEVER bypassable, even in YOLO) -> (is_hardline, description).TNr;   )Ú_command_parser_limit_exceededÚ_PARSER_LIMIT_DESCRIPTIONÚ_grep_safe_detection_variantÚ_mask_quoted_newlinesÚ_MALFORMED_EXEC_DESCRIPTIONÚ_command_detection_variantsr    ÚHARDLINE_PATTERNS_COMPILEDr)   r8   r>   )	r   r#   Úmalformed_grepÚcommand_variantÚvariant_lowerÚmasked_lowerÚ
pattern_reÚdescriptionÚquote_maskeds	            r
   Údetect_hardline_commandrP   ´   sÇ   € ä% gÔ.ØÔ/Ð0Ð0ô
 5Ô5JÈ7Ó5SÓTÑ€A€~ÙØÔ1Ð2Ð2Ü6°wÓ?ò +ˆØ'×-Ñ-Ó/ˆØ#'ˆÜ5Oò 
	+Ñ1ˆJ˜ \Ù Ð 4ô
 &=¸_Ô%M‘MÜ+¨OÓ<×BÑBÓDð ð × Ñ ±¡À=ÕQØ˜kÐ*Ô*ñ
	+ð+ð r   )z\brm\s+(-[^\s]*\s+)*/zdelete in root path)z\brm\s+-[^\s]*rzrecursive delete)z\brm\s+--recursive\bzrecursive delete (long flag))zY\brm\s+(?!--(?:\s|$))(?:(?!\s--(?:\s|$))[^\n"\';|&])*\s(?:-[a-z]*r[a-z]*\b|--recursive\b)z'recursive delete (flags after operands))z9\bcmd(?:\.exe)?\s+/(?:c|k)\s+.*\b(?:del|erase|rd|rmdir)\bzWindows cmd destructive delete)zv\b(?:powershell|pwsh)(?:\.exe)?\b(?:\s+-\S+)*\s+(?:-(?:command|c)\s+)?["\']?(?:remove-item|rmdir|erase|del|rd|ri|rm)\bz%Windows PowerShell destructive delete)z@\b(?:powershell|pwsh)(?:\.exe)?\b.*\s-(?:encodedcommand|enc|e)\bz$PowerShell encoded command execution)z.\bremove-item\b[^\n;|&]*\s-(?:recurse|force)\bz+PowerShell destructive delete (Remove-Item))z0\b(?:del|erase|rd|rmdir)\s+(?:/[a-z]\s+)*/[sq]\bz3Windows destructive delete (recursive/quiet switch))zc\b(?:iwr|invoke-webrequest|invoke-restmethod|irm|curl|wget)\b[^\n]*\|\s*(?:iex|invoke-expression)\bz-pipe remote content to PowerShell (iwr | iex))zT\b(?:iex|invoke-expression)\s*\(\s*(?:iwr|invoke-webrequest|invoke-restmethod|irm)\bz,execute remote content via Invoke-Expression)z\btaskkill\b[^\n]*\s/f\bz"force kill processes (taskkill /F))z \bstop-process\b[^\n]*\s-force\bz*force kill processes (Stop-Process -Force))z\bformat-volume\bz!format filesystem (Format-Volume))z\bclear-disk\bzwipe disk (Clear-Disk))z\bdiskpart\bzdisk partitioning (diskpart))z\bformat(?:\.com)?\s+[a-z]:zformat drive (format.com))z\bcipher\s+/w\bzwipe free space (cipher /w))zX\bicacls\b[^\n]*\s/grant\b[^\n]*\b(?:everyone|todos|jeder|tout\s+le\s+monde|\*s-1-1-0)\bzgrant Everyone access (icacls))z\bicacls\b[^\n]*\s/reset\bz&reset ACLs recursively (icacls /reset))z&\bvssadmin\b[^\n]*\bdelete\s+shadows\bz&delete volume shadow copies (vssadmin))z\bwbadmin\b[^\n]*\bdelete\bzdelete backups (wbadmin))z\bbcdedit\b[^\n]*\s/set\bz(modify boot configuration (bcdedit /set))z\breg(?:\.exe)?\s+delete\bzregistry delete (reg delete))z'\bremove-itemproperty\b[^\n]*\s-force\bz2registry value delete (Remove-ItemProperty -Force))z \bstop-service\b[^\n]*\s-force\bz(force stop service (Stop-Service -Force))z"\bsc(?:\.exe)?\s+(?:stop|delete)\bzstop/delete service (sc))z!\busers[\\/][^\\/\s]+[\\/]\.ssh\bz!access to SSH keys (Windows path))z7\bappdata[\\/](?:local|roaming)[\\/]hermes[^\n]*\.env\bz'access to Hermes secrets (Windows path))z8\bchmod\s+(-[^\s]*\s+)*(777|666|o\+[rwx]*w|a\+[rwx]*w)\bz world/other-writable permissions)z8\bchmod\s+--recursive\b.*(777|666|o\+[rwx]*w|a\+[rwx]*w)z*recursive world/other-writable (long flag))z\bchown\s+(-[^\s]*)?R\s+rootzrecursive chown to root)z\bchown\s+--recur[a-z]*\b.*rootz#recursive chown to root (long flag)zmkfs\bzformat filesystemz
dd\s+.*if=z	disk copy)z>\s*/dev/sdzwrite to block device)z\bDROP\s+(TABLE|DATABASE)\bzSQL DROP)z$\bDELETE\s+FROM\b(?![^\n]*\bWHERE\b)zSQL DELETE without WHERE)z\bTRUNCATE\s+(TABLE)?\s*\wzSQL TRUNCATEz>\s*zoverwrite system config)z8\bsystemctl\s+(-[^\s]+\s+)*(stop|restart|disable|mask)\bzstop/restart system service)z\bkill\s+-9\s+-1\br   )z\bpkill\s+-9\bzforce kill processes)z,\bkillall\s+(-[^\s]*\s+)*-(9|KILL|SIGKILL)\bz$force kill processes (killall -KILL))z0\bkillall\s+(-[^\s]*\s+)*-s\s+(KILL|SIGKILL|9)\bz&force kill processes (killall -s KILL))z\bkillall\s+(-[^\s]*\s+)*-r\bz$kill processes by regex (killall -r)z%\b(curl|wget)\b.*\|\s*(?:[/\w]*/)?(?:z)(?:\s|$|-c)zpipe remote content to shellz\b(?:z)\s+<\s*<?\s*\(\s*(curl|wget)\bz.execute remote script via process substitution)z<(?:\beval\b|\bsource\b|\.)\s*(?:\$\(\s*|`\s*)(?:curl|wget)\bz/execute remote content via command substitution)zz(?<![\d.])(?:169\.254\.169\.254|100\.100\.100\.200)(?![\d.])|(?<![\w.-])metadata\.google\.internal(?![\w.-])|fd00:ec2::254z5cloud metadata endpoint access (instance credentials)z;\b(base64|base32|base16)\s+(?:-[dD]|--decode)\b.*\|\s*\b(?:z)\bz<pipe decoded content to shell (possible command obfuscation)z\bxxd\s+-r\b.*\|\s*\b(?:z@pipe xxd-decoded content to shell (possible command obfuscation)z'\becho\b[^|]*\|\s*\btr\b[^|]*\|\s*\b(?:zBpipe tr-transformed output to shell (possible command obfuscation)z=\bopenssl\b.*\b(?:base64|enc)\b[^|]*\s+-[dD]\b[^|]*\|\s*\b(?:zDpipe openssl-decoded content to shell (possible command obfuscation)z\btee\b.*["\']?zoverwrite system file via teez>>?\s*["\']?z%overwrite system file via redirectionz["\']?z$overwrite project env/config via teez,overwrite project env/config via redirection)z\bxargs\s+.*\brm\bzxargs with rm)z&\bfind\b.*-exec(?:dir)?\s+(/\S*/)?rm\bzfind -exec/-execdir rmzhfind\s[^;|&\n]*(?<!\S)-(?:\{[^}\s]*(?:delete|exec(?:dir)?)[^}\s]*\}|(?:del(?:ete?)?|exec(?:dir)?)[*?\[])z6find dynamic shell word may expand to destructive flag)z\bfind\b.*-delete\bzfind -delete)ze\b(?:rg|sort|ag|man)\b[^;|&\n]*(?<!\S)--(?:pre|hostname-bin|compress-program|pager|html)(?:\{|[*?\[])úAdynamic shell word may expand to arbitrary program execution flag)zA\bhermes\s+(?:-{1,2}\S+(?:\s+\S+)?\s+)*gateway\s+(stop|restart)\bz2stop/restart hermes gateway (kills running agents))z\bhermes\s+update\bz6hermes update (restarts gateway, kills running agents))z?\bdocker\s+(?:-{1,2}\S+(?:[=\s]\S+)?\s+)*(?:-h|--host)[=\s]+\S+z.docker with remote daemon redirect (-H/--host))zB\bdocker\s+(?:-{1,2}\S+(?:[=\s]\S+)?\s+)*(?:-c|--context)[=\s]+\S+z9docker with daemon redirect (--context: alternate daemon))z\bdocker\s+context\s+use\bz@docker context use (switches default daemon for future commands))zS\bpodman\s+(?:-{1,2}\S+(?:[=\s]\S+)?\s+)*(?:--url|--connection|--identity)[=\s]+\S+zBpodman with remote daemon redirect (--url/--connection/--identity))z<\bpodman\s+(?:-{1,2}\S+(?:[=\s]\S+)?\s+)*(?:-r\b|--remote\b)z/podman remote mode (-r/--remote: remote daemon))zH\b(?:docker_host|docker_context|container_host|container_connection)=\S+zJdocker/podman daemon redirect via environment (DOCKER_HOST/CONTAINER_HOST))zZ\bdocker(?:-compose|\s+compose)\s+(?:-{1,2}\S+(?:[=\s]\S+)?\s+)*(restart|stop|kill|down)\bz;docker compose restart/stop/kill/down (container lifecycle))z>\bdocker\s+(?:-{1,2}\S+(?:[=\s]\S+)?\s+)*(restart|stop|kill)\bz.docker restart/stop/kill (container lifecycle))z4gateway\s+run\b.*(&\s*$|&\s*;|\bdisown\b|\bsetsid\b)úMstart gateway outside systemd (use 'systemctl --user restart hermes-gateway'))z\bnohup\b.*gateway\s+run\brR   )z1\b(pkill|killall)\b.*\b(hermes|gateway|cli\.py)\bz.kill hermes/gateway process (self-termination))z \bkill\b.*\$\(\s*(pgrep|pidof)\bz9kill process via pgrep/pidof expansion (self-termination))z\bkill\b.*`\s*(pgrep|pidof)\bzBkill process via backtick pgrep/pidof expansion (self-termination))zv\A(?=[\s\S]*\blaunchctl\s+(?:stop|kickstart|bootout|unload|kill|disable|remove)\b)(?=[\s\S]*\b(?:hermes|ai\.hermes)\b)z:stop/restart hermes launchd service (kills running agents)z\b(cp|mv|install)\b.*\sz&copy/move file into system config pathz\b(cp|mv|install)\b.*\s["\']?z!overwrite project env/config filez[^\s"\']*["\']?z:copy/move file into sensitive credential/SSH/shell-rc pathz\bsed\s+-[^\s]*i.*(?:z
)[^\s"\']*z7in-place edit of sensitive credential/SSH/shell-rc pathz\bsed\s+--in-place\b.*(?:zCin-place edit of sensitive credential/SSH/shell-rc path (long flag)z*\b(?:perl|ruby)\b.*(?:^|\s)-[^\s]*i\b.*(?:zCin-place edit of sensitive credential/SSH/shell-rc path (perl/ruby)z\bsed\s+-[^\s]*i.*\szin-place edit of system configz\bsed\s+--in-place\b.*\sz*in-place edit of system config (long flag)z"in-place edit of Hermes config/envz.in-place edit of Hermes config/env (long flag)z.in-place edit of Hermes config/env (perl/ruby)z)\s+<<zshell execution via heredoc)z'\bgit\s+reset\s+--h(?:a(?:r(?:d)?)?)?\bz/git reset --hard (destroys uncommitted changes))z\bgit\s+push\b.*--forc[a-z]*\bz(git force push (rewrites remote history))z\bgit\s+push\b.*-f\bz3git force push short flag (rewrites remote history))z\bgit\s+clean\s+-[^\s]*fz.git clean with force (deletes untracked files))z\bgit\s+branch\s+(?-i:-D)\búgit branch force delete)zI\bgit\s+branch\b[^;|&\n]*?(?:-d\b|--delete\b)[^;|&\n]*?(?:-f\b|--force\b)z$git branch force delete (long flags))zI\bgit\s+branch\b[^;|&\n]*?(?:-f\b|--force\b)[^;|&\n]*?(?:-d\b|--delete\b)z1git branch force delete (long flags, force-first))z\bchmod\s+\+x\b.*[;&|]+\s*\./z(chmod +x followed by immediate execution)z;\bsudo\b[^;|&\n]*?\s+(?:-s\b|--st[a-z]*\b|-a\b|--a[a-z]*\b)z3sudo with privilege flag (stdin/askpass/shell/list))z(\bsudo\b[^;|&\n]*?\s+-[a-z]*[sa][a-z]*\bz,sudo with combined-flag privilege escalationznpm\s+z%(?:uninstall|unlink|remove|rm|r|un)\bzpackage manager uninstallzpnpm\s+z(?:uninstall|remove|rm|un)\bzyarn\s+z$(?:global\s+)?(?:uninstall|remove)\bzpip(?:3)?\s+zuninstall\bzbrew\s+z(?:uninstall|remove|rm)\brQ   z'(python[23]?|perl|ruby|node)\s+-[ec]\s+z!(python[23]?|perl|ruby|node)\s+<<)úscript execution via -e/-c flagúscript execution via heredocÚ_PATTERN_KEY_ALIASESz\bé   é   zgit\s+branch\s+-DrS   Úpattern_keyc                 ó0   — t         j                  | | h«      S )zŒAll approval keys for this pattern: the description plus the historical regex-derived key
    older allowlist/session entries may still use.)rV   Úget)rY   s    r
   Ú_approval_key_aliasesr\   â  s   € ô  ×#Ñ# K°+°Ó?Ð?r   c                 óJ  — ddl m} t        j                  d || «      j	                  dd«      «      } t        j                  dd| «      } t        | «      } t        | «      } t        j                  dd| «      } t        j                  d	d| «      } t        j                  d
d| «      S )z˜Normalize a command before pattern matching so ANSI escapes, null bytes, Unicode fullwidth
    forms, and shell splicing tricks cannot bypass detection.r   )Ú
strip_ansiÚNFKCú r+   z\\\r?\nz	\\([^\n])z\1z''|\"\"z\$\{IFS\b[^}]*\}|\$IFS\br/   )	Útools.ansi_stripr^   ÚunicodedataÚ	normalizeÚreplaceÚreÚsubÚ_rewrite_resolved_hermes_homeÚ_rewrite_resolved_user_home)r   r^   s     r
   r?   r?   é  s�   € õ ,Ü×#Ñ# F©J°wÓ,?×,GÑ,GÈÐPRÓ,SÓT€Gô �f‰f�Z  WÓ-€Gô
 ,¨GÓ4€GÜ)¨'Ó2€Gä�f‰f�\ 5¨'Ó2€GÜ�f‰f�Z  WÓ-€Gô �6‰6Ð-¨s°GÓ<Ð<r   c                 óZ   — dj                  d„ t        j                  d| «      D «       «      S )aÉ  Lowercase a detection variant for the pattern pass while keeping dash-prefixed tokens
    byte-for-byte, so case-dependent flags keep their distinction. All dangerous patterns are
    compiled case-insensitively, so preserved flag case is invisible to them except where a
    pattern explicitly scopes a case-sensitive group. Non-flag tokens (command words, quoted
    prose, paths) are lowercased exactly as before; separators and whitespace are untouched.r+   c              3   ób   K  — | ]'  }|j                  d «      r|n|j                  «       –— Œ) y­w©Ú-N)Ú
startswithr    )r"   Úts     r
   r%   z*_lower_preserving_flags.<locals>.<genexpr>  s&   è ø€ Ò^¸Q˜Ÿ™ SÔ)‘1¨q¯w©w«yÓ8Ñ^ùs   ‚-/z(\s+))r6   re   Úsplitr(   s    r
   Ú_lower_preserving_flagsrp      s%   € ð �7‰7Ñ^Ä"Ç(Á(È8ÐU\ÓB]Ô^Ó^Ð^r   z\s'"`;|&<>()z(?P<tail>(?:[/\\][^/\\z]*)+)é@   )Úmaxsizer   c                 óê   — | r't        j                  d| «      D �cg c]  }|sŒ|‘Œ	 c}ng }t        |«      dk  ryt        j                  ddj	                  d„ |D «       «      z   t
        z   «      S c c}w )a½  Compile a regex matching *path* as an absolute directory prefix.
    Components match with either separator so native Windows, forward-slash, and mixed forms all
    fold; the caller normalizes the tail's backslashes to ``/``. A non-empty tail is required, so a
    bare home is never folded. Returns ``None`` for an unset/degenerate path (fewer than two
    components: ``/``, ``C:\``, ``""``) so a stray HOME cannot rewrite unrelated prefixes.z[/\\]+é   Nz[/\\]*c              3   óF   K  — | ]  }t        j                  |«      –— Œ y ­wr   )re   Úescape)r"   Úcs     r
   r%   z*_home_prefix_fold_regex.<locals>.<genexpr>  s   è ø€ Ò0RÀ!´·±¸1·Ñ0Rùs   ‚!)re   ro   ÚlenÚcompiler6   Ú
_PATH_TAIL)r   rw   Ú
componentss      r
   Ú_home_prefix_fold_regexr|     sd   € ñ AEœRŸX™X i°Ó6Ö<˜º!’!Ó<È"€JÜ
ˆ:ƒ˜ÒØä�:‰:�i )§.¡.Ñ0RÀzÔ0RÓ"RÑRÔU_Ñ_Ó`Ð`ùò	 =s
   ›A0£A0Úreplacementc                 ó°   ‡— t         j                  t        d„ |D «       t        d¬«      «      D ]%  }t	        |«      }|€Œ|j                  ˆfd„| «      } Œ' | S )zÌFold each resolved home prefix in *command* to *replacement* (no trailing separator; the tail
    supplies it). Longest first so a deeper home folds before a shorter overlapping one that would clobber it.c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wr   r	   )r"   Úps     r
   r%   z&_fold_home_prefixes.<locals>.<genexpr>  s   è ø€ Ò%<¨Aº!¤aÑ%<ùs   ‚ŠT)ÚkeyÚreversec                 óL   •— ‰| j                  d«      j                  dd«      z   S )Nr   ú\ú/)Úgrouprd   )Úmr}   s    €r
   ú<lambda>z%_fold_home_prefixes.<locals>.<lambda>"  s#   ø€ ¨K¸!¿'¹'À&»/×:QÑ:QÐRVÐX[Ó:\Ñ,\€ r   )ÚdictÚfromkeysÚsortedrx   r|   rf   )r   Úpathsr}   r   Úpatterns     `  r
   Ú_fold_home_prefixesrŽ     sW   ø€ ô —‘œfÑ%<°Ô%<Ä#ÈtÔTÓUò gˆÜ)¨$Ó/ˆØÑØ—k‘kÓ"\Ð^eÓf‰Gðgð €Nr   c                 óþ   — 	 t         j                  j                  d«      }|t         j                  j                  |«      t         j                  j                  dd«      g}t        | |d«      S # t        $ r | cY S w xY w)zcUser home (expanduser / realpath / $HOME) -> ``~/``; no-op when unset, degenerate, or unresolvable.Ú~ÚHOMEr+   )r   r   Ú
expanduserÚrealpathr<   r[   Ú	ExceptionrŽ   )r   ÚhomerŒ   s      r
   rh   rh   &  sl   € ðä�w‰w×!Ñ! #Ó&ˆØ”r—w‘w×'Ñ'¨Ó-¬r¯z©z¯~©~¸fÀbÓ/IÐJˆô ˜w¨¨sÓ3Ð3øô ò ØŠðús   ‚AA. Á.A<Á;A<c                 óÂ   — 	 ddl m}  |«       j                  «       }t        |«      t        |j	                  d¬«      «      g}t        | |d«      S # t
        $ r | cY S w xY w)z°Resolved HERMES_HOME (and its realpath) -> ``~/.hermes/`` so the _HERMES_CONFIG_PATH /
    _HERMES_ENV_PATH rules match Docker/gateway deployments that spell the absolute path.r   )Úget_hermes_homeF)Ústrictz	~/.hermes)Úhermes_constantsr—   r’   ÚstrÚresolver”   rŽ   )r   r—   r•   rŒ   s       r
   rg   rg   1  s`   € ðÝ4ÙÓ ×+Ñ+Ó-ˆÜ�T“œC §¡°E Ó :Ó;Ð<ˆô ˜w¨¨{Ó;Ð;øô ò ØŠðús   ‚AA ÁAÁAz,\$\{[^}/\s]+/[^}/]*/(?P<replacement>[^}]*)\}z#\$\{[^}:}\s]+:-(?P<default>[^}]*)\}z^[A-Za-z0-9_./:@%+=,-]+$z[A-Za-z_][A-Za-z0-9_]*=.*>   ÚenvÚchrtÚexecÚniceÚsudoÚtimeÚnohupÚchrootÚioniceÚsetsidÚstdbufÚbuiltinr   ÚtasksetÚtimeout>
   ú-gú-hú--hostú--userú--groupú--close-fromú-cú-pú-uú--promptz--groupsz
--userspec>   ú--argv0ú--chdirú--unsetú-Cú-Sú-ar²   ú--split-stringr¹   ú-nz--adjustment>   ú--formatú-fú-oú--output>   ú-kú-sú--signalú--kill-after>   ú-iú--errorú--inputú-er¾   r¿   >   ú--classú--classdatar°   r»   )	r£   r    rœ   rž   rŸ   r¡   r©   r¦   r¤   z-vz-Vr±   ú--pid>   ú--uidú--pgidr±   rÊ   )r   r�   r¤   r¨   )r£   r�   r¨   r©   >   ÚdoÚifÚelifÚelseÚthenÚuntilÚwhileú!z&(?:[0-9]+)?(?:>>|<<|<>|>&|<&|>\||[<>])c              #   óP   K  — | ]  \  }}|t        j                  |«      f–— Œ  y ­wr   )re   ry   )r"   Úfamilyr�   s      r
   r%   r%   X  s&   è ø€ ò ÁÀÈ˜v¤r§z¡z°'Ó':Ô;ñ ùs   ‚$&))Úpythonz,py(?:\.exe)?|python[23]?(?:\.\d+)*(?:\.exe)?)Únodeznode(?:js)?(?:\.exe)?)Úperlzperl[0-9]*(?:\.\d+)*(?:\.exe)?)Úrubyzruby[0-9.]*(?:\.exe)?)Úphpzphp(?:\.exe)?)Ú
powershellz#powershell(?:\.exe)?|pwsh(?:\.exe)?)Úbunzbun(?:\.exe)?)Údenozdeno(?:\.exe)?r°   >   ú--printrÇ   r±   ú--evalrÇ   rà   ú-r>   ú-fileú-commandr°   r½   >   r   rÇ   rà   )r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   >   ú-Wú-Xú--check-hash-based-pycs>
   ú--titleú--importú--loaderú--conditionsú--cpu-prof-dirú--icu-data-dirú--diagnostic-dirú--openssl-configr·   ú	--require>   ú-0ú-Mú-mú-xú-Fú-I>   ú-Eú-Kr·   rô   rõ   rá   >   ú-dú-zr°   >	   ú-versionú-inputformatú-windowstyleú-outputformatú-settingsfileú-custompipenameú-executionpolicyú-workingdirectoryú-configurationname>   ú--cwdú--configú	--preloadú
--env-filerï   z-Lz--log-levelú--compress-programú--preú--hostname-binú--pager>   ú--htmlú-Hú-Pr
  )ÚsortÚrgÚagÚman>#   ú--globú--typeú--colorú--iglobú--sortrú--colorsú--engineú	--replaceú	--threadsú
--generateú
--pre-globú
--type-addú
--type-notú--max-depthú--type-clearú--ignore-fileú--max-columnsú--max-filesizeú--dfa-size-limitú--path-separatorú--hyperlink-formatú--regex-size-limitú--context-separatorú--field-match-separatorú--field-context-separatorr  ú--fileú--sortú--regexpú	--contextú
--encodingú--max-countr	  ú--after-contextú--before-context>   ú--keyú
--parallelú--batch-sizeú--buffer-sizeú--files0-fromú--random-sourceú--field-separatorú--temporary-directoryr,  r¿   r  >   ú--localeú--recodeú	--manpathú	--systemsú
--sectionsú--extensionú--config-fileú--preprocessorr
  r³   r/  >   ú--depthú--widthú--ignoreú	--workersú--color-pathú--ignore-dirú--color-matchú--path-to-ignoreú--filename-patternú--color-line-numberú--file-search-regexú--ackmate-dir-filterr
  r0  )r  r  r  r  ÚefEmjgdtTABCMrÚkoStTÚCRLmMSserEPpÚgGmpW>   ú--labelú	--devicesú	--excludeú	--includeú--directoriesú--exclude-dirú--binary-filesú--exclude-fromr+  r-  r.  r0  r1  r2  >   ÚAÚBÚCÚDÚdÚeÚfr‡   >   ú+Oú+oú-Oú--rcfileú--init-filer¾   ÚilrsDcabefhkmnptuvxBCEHPTOo)i ô i   i¨a  zcommand parser limit exceededz4command parser limit or malformed executable payloadzIstop/restart hermes gateway via shell-spliced verb (kills running agents)c                 ó®   ‡ — t        ‰ «      t        kD  ryt        ‰ «      t        kD  rt        ˆ fd„dD «       «      syt	        ˆ fd„dD «       «      t
        k\  S )zèBound all parser work before normalization/tokenization. Separator counting is deliberately
    conservative: quoted separators over-count, but crossing the ceiling fails closed rather than
    letting an uninspected suffix execute.Tc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr   r	   ©r"   Úcharr   s     €r
   r%   z1_command_parser_limit_exceeded.<locals>.<genexpr>¥  s   øè ø€ ÒChÐX\ÀDÈGÄOÑChùs   ƒú;&|
c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )Úcountrj  s     €r
   r%   z1_command_parser_limit_exceeded.<locals>.<genexpr>§  s   øè ø€ Ò7 tˆw�}‰}˜T×"Ñ7ùó   ƒ)rx   Ú_MAX_DETECTION_COMMAND_CHARSÚ!_MAX_SEPARATOR_FREE_COMMAND_CHARSr&   ÚsumÚ_MAX_DETECTION_SEGMENTSr(   s   `r
   rB   rB   ž  sJ   ø€ ô ˆ7ƒ|Ô2Ò2Øä
ˆ7ƒ|Ô7Ò7ÄÓChÐ`gÔChÔ@hØÜÓ7¨wÔ7Ó7Ô;RÑRÐRr   Úsegmentr1   c                 óª   — | j                  d|dz   «      }|dk7  r1| |dz
     dk(  r&| j                  d|dz   «      }|dk7  r| |dz
     dk(  rŒ&|dk(  rdS |S )zQIndex of the backtick closing the one opened at ``i``, or None when none follows.ú`rW   éÿÿÿÿr„   N)Úfind)rt  r1   r2   s      r
   Ú_backtick_end_fromry  ª  si   € à�‰�S˜!˜a™%Ó €AØ
ˆrŠ'�g˜a !™e‘n¨Ò,Ø�L‰L˜˜a !™eÓ$ˆð ˆrŠ'�g˜a !™e‘n¨Ó,à˜’7ˆ4Ð! Ð!r   Ústartc                 óF  ‡ ‡‡‡— g g ddf\  ŠŠŠ}d}d}dt         ddfˆ ˆˆˆfd„}t        ‰ «      }t        ‰ |«      D ]Õ  \  }}}	}	‰ |   }
|dk(  r}|s{|
j                  «       r|
dk7  r‰� ||«       g dcŠŠŒ9‰ j	                  d	|«      r|d
z  }n>|
dk(  r|rd}n4|dk(  rt        ‰ |«      €|} nhd}n|
dk(  r|dk(  r|} nW|d
z  }n|
dv r|} nI‰€|Š|dk(  r|rdn|
}ŒŸ|dk(  r‰j                  ‰ |d
z      «       Œ¼|
dk(  r|s y‰j                  |
«       Œ× |ry‰� ||«       ‰S )u3  Return shell words as ``(value, start, end, quoted)`` or ``None`` on malformed quoting.
    Deliberately small lexer that never expands shell syntax; it exists to keep source spans (which
    ``shlex`` does not expose) for deciding which quoted grep operand is data, not another command.

    Lexing stops at the end of the simple command that begins at *start*: an unquoted ``;``, ``|``,
    ``&`` or newline, or the ``)`` / backtick that closes the substitution the command sits inside.
    Without that, a grep nested as ``"$(grep â€¦ | cut â€¦)"`` was lexed together with the enclosing
    command's closing quote, read as unbalanced quoting, and reported as a hardline block (546
    blocked turns in one run, every one a false positive; ``sed -n "$(grep -n X f | cut -d: -f1),+3p" f``
    is the canonical shape).Nr   FÚendr   c                 óÒ   •— ‰‰|  }|j                  d«      xr |j                  d«      xs d|v xr |j                  d«      }‰j                  dj                  ‰«      ‰| |f«       y )Nú'z='r+   )rm   ÚendswithÚappendr6   )r|  ÚrawÚinertrt  Útoken_startÚtokensÚvalues      €€€€r
   Úflushz'_shell_tokens_with_spans.<locals>.flushÃ  se   ø€ Ø�k #Ð&ˆð —‘ Ó$Ò:¨¯©°cÓ):ÒbÀÈÀÒ@aÐPS×P\ÑP\Ð]`ÓPaˆØ�‰�r—w‘w˜u“~ {°C¸Ð?Õ@r   rk  Ú
ú$(rW   rv  Tr   z;|&
r-   Úescr„   )Úintrx   r7   Úisspacerm   ry  r€  )rt  rz  r-   ÚdepthÚin_backtickr†  Úend_atr0   r1   r#   Úchrƒ  r„  r…  s   `          @@@r
   Ú_shell_tokens_with_spansr�  ²  s‹  û€ ð )+¨B°°dÐ(:Ñ%€FˆE�; Ø€Eð €KðA”3ð A˜4÷ Að Aô �‹\€FÜ$ W¨eÓ4ò #‰ˆˆa��AØ�Q‰ZˆØ�6Š>¡%Ø�z‰zŒ|  d¢
ØÐ*Ù˜!”HØ)+¨TÐ&�E˜;ØØ×!Ñ! $¨Ô*Ø˜‘
‘Ø�s’ÙØ"'‘KØ˜a’ZÔ$6°wÀÓ$BÐ$JØ�FÙà"&‘KØ�s’Ø˜A’:Ø�FÙØ˜‘
‘Ø�w‘Ø�ÙØÐØˆKØ�7Š?Ù!‘D r‰EØ�UŠ]Ø�L‰L˜  Q¡™Õ(Ø�4ŠZ¡Ùà�L‰L˜ÕðG#ñH ØØÐÙˆfŒØ€Mr   c           	      óÈ  ‡— g }d}t        | «      D �]K  }| j                  ||«      Š‰t        |«      z   }t        |«      D �]  \  }}}t        j
                  j                  t        |«      «      j                  «       dvrŒAt        ||«      }|€g dfc c S |dd g }	}dx}
}d\  }}}|t        |«      k  �rT||   d   }|r	|dk(  rd}�n,|r†|j                  d«      ru|j                  d	«      \  }}}|
xs |d
k(  }
|xs |dv }|t        v xr | }|r|dz   t        |«      k\  rg dfc c S |dk(  r|	j                  |r|dz   n|«       ||rdndz  }n¤|rž|j                  d«      r�|dk7  rˆ|dd }t        |«      D ]t  \  }}|
xs |dk(  }
|xs |dv }|t        v sŒ |dz   t        |«      k  }|s|dz   t        |«      k\  r
g dfc c c S |dk(  r|	j                  |r|n|dz   «       ||rdndz  } n n|€|}|dz  }|t        |«      k  r�ŒT|s|€g |
fc c S |	j                  |«       |
s�Œì|j!                  ˆfd„t#        |j$                  |	«      D «       «       �Œ �ŒN |dfS )zÏStructurally locate quoted grep PCRE operands -> (spans, malformed). On an ambiguous or
    malformed grep parse callers fail closed and use the original command: no text is hidden on
    an uncertain parse.r   >   ÚgrepÚegrepNTrW   F)Nr   Tú--Ú=z--perl-regexp>   r+  r-  r-  rl   ÚP>   r`  ra  r`  c              3   ó@   •K  — | ]  \  }}}}|r‰|z   ‰|z   f–— Œ y ­wr   r	   )r"   r#   rƒ  Ú	token_endÚquotedÚ
segment_ats        €r
   r%   z-_quoted_grep_pattern_spans.<locals>.<genexpr>-  s3   øè ø€ ò á9˜˜;¨	°6Ñgmð   +Ñ-¨z¸IÑ/EÔFñùro  )Ú_iter_top_level_shell_segmentsrx  rx   r'   r   r   r   r   r    r�  rm   Ú	partitionÚ_GREP_OPTIONS_WITH_ARGr€  Ú	enumerateÚ_GREP_SHORT_OPTIONS_WITH_ARGÚextendÚmapÚ__getitem__)r   ÚspansÚoffsetrt  rz  r#   r$   r„  ÚargsÚpattern_indexesÚpcreÚexplicit_patternsÚoperand_indexr1   ÚoptionsÚtokenÚoptionÚequalsÚ
takes_nextÚcharsr2   rk  Úattachedrš  s                          @r
   Ú_quoted_grep_pattern_spansr±  ö  sÄ  ø€ ð $&€EØ€FÜ1°'Ó:ó 4ˆØ—\‘\ '¨6Ó2ˆ
Øœc '›lÑ*ˆÜ<¸WÓEó 1	‰NˆE�1�dÜ�w‰w×ÑÔ EÀdÓ KÓL×RÑRÓTÐ\mÑmØÜ-¨g°uÓ=ˆFØˆ~Ø˜4�x”Ø$*¨1¨2 J°�/ˆDØ',Ð,ˆDÐ$Ø(5Ñ%ˆM˜1˜gØ”c˜$“i“-Ø˜Q™ ™
�Ù˜u¨š}Ø#’GÙ ×!1Ñ!1°$Ô!7Ø(-¯©¸Ó(<Ñ%�F˜F AØÒ< 6¨_Ñ#<�DØ(9Ò(]¸VÐG]Ð=]Ð%Ø!'Ô+AÐ!AÒ!PÈ&Àj�JÙ! a¨!¡e¬s°4«yÒ&8Ø! 4˜xœØ Ò+Ø'×.Ñ.¹
¨q°1ªuÈÔJØ™j™¨aÑ/‘AÙ ×!1Ñ!1°#Ô!6¸5ÀCº<Ø! ! "˜I�EÜ#,¨UÓ#3ò "™˜˜4Ø#Ò2 t¨s¡{˜Ø,=Ò,SÀÈÐASÐ)ØÔ#?Ò?ð ()¨1¡u¬s°5«zÑ'9˜HÙ#+°°A±¼¸T»Ò0BØ')¨4 x¦Ø# sš{Ø /× 6Ñ 6¹H±qÈ!ÈaÉ%Ô PØ¡h¡°AÑ5˜AÙ!ñ"ð #Ð*Ø$%�MØ�Q‘�ð? ”c˜$“i”-ñ@ %Ø Ð(Ø˜t˜8”OØ×&Ñ& }Ô5ÛØ—‘ó ä=@À×AQÑAQÐSbÓ=côö ò]1	ð4ðj �%ˆ<Ðr   c                 ó~   — g d}}|D ]  \  }}}|j                  | || |f«       |}Œ  dj                  |«      | |d z   S )zŒApply sorted, non-overlapping ``(start, end, text)`` edits to *command* in one pass
    (re-slicing per edit is quadratic on 10k+ segments).r   r+   N)r   r6   )r   ÚeditsÚpartsÚpreviousrz  r|  Útexts          r
   Ú_splicer·  4  s\   € ð ˜!ˆ8€EØ!ò Ñˆˆs�DØ�‰�g˜h uÐ-¨tÐ4Ô5Ø‰ðð �7‰7�5‹>˜G H IÐ.Ñ.Ð.r   c                 óŽ   — t        | «      \  }}|s|s| |fS t        | |D ��cg c]  \  }}||d||z
  z  f‘Œ c}}«      dfS c c}}w )Nr/   F)r±  r·  )r   r£  Ú	malformedrz  r|  s        r
   rD   rD   >  sW   € Ü1°'Ó:Ñ€Eˆ9Ù™Ø˜	Ð!Ð!Ü�7ÐQV×WÁ:À5È#˜e S¨#°°u±Ñ*=Ò>ÓWÓXÐZ_Ð_Ð_ùÓWs   ¢AÚ
executablec                 ó�   ‡— t         j                  j                  | «      j                  «       Št	        ˆfd„t
        D «       d «      S )Nc              3   óL   •K  — | ]  \  }}|j                  ‰«      sŒ|–— Œ y ­wr   )Ú	fullmatch)r"   rÖ   Úname_reÚnames      €r
   r%   z&_interpreter_family.<locals>.<genexpr>G  s#   øè ø€ Ò`™O˜F GÈ×HYÑHYÐZ^ÕH_”Ñ`ùs   ƒ$�$)r   r   r   r    ÚnextÚ_INTERPRETER_NAME_RES)rº  r¿  s    @r
   Ú_interpreter_familyrÂ  E  s5   ø€ Ü�7‰7×Ñ˜JÓ'×-Ñ-Ó/€DÜÓ`Ô/DÔ`ÐbfÓgÐgr   c                 óŒ   — 	 t        j                   | |d dd¬«      }d\  |_        |_        t        |«      S # t        $ r Y yw xY w)zÉTokenize an already-bounded command segment. ``None`` distinguishes malformed quoting from
    an empty segment so callers can fail closed for a program-bearing option rather than silently
    skip it.NTz<>)ÚposixÚpunctuation_chars)Tr+   )ÚshlexÚwhitespace_splitÚ
commentersÚlistÚ
ValueError)rt  rz  Úlexers      r
   Ú_shell_segment_tokensrÌ  J  sK   € ðÜ—‘˜G E F˜O°4È4ÔPˆØ3;Ñ0ˆÔ Ô 0Ü�E‹{ÐøÜò Ùðús   ‚47 ·	AÁAc              #   ó²   K  — d}t        | d¬«      D ]+  \  }}}}|dk(  s|dk(  sŒ|�Œ| |   dv sŒ||k  r| || –— |}Œ- |t        | «      k  r| |d –— yy­w)z;Yield top-level command segments in one left-to-right pass.r   T)ÚcommentsÚcommentrk  Nrl  )r7   rx   )r   rz  r0   r1   r2   r-   s         r
   r›  r›  V  s€   è ø€ à€EÜ(¨¸4Ô@ò Ñˆˆa��EØ�9Ò ¨£°E±MÀgÈaÁjÐT[ÒF[Ø�qŠyØ˜e AÐ&Ò&Ø‰Eð	ð
 Œs�7‹|ÒØ�e�fˆoÓð ùs   ‚"A¥A¨A°'ArÖ   r¥  c                 óÚ  ‡‡— t         |    t        |    cŠ}| dk(  }d}|D ]Ê  }|rd}Œ|dk(  s|s-|j                  d«      s| dk(  r|j                  «       dk(  r y y|j	                  d«      \  Š}}|r‰j                  «       n‰}|‰v r|c S t        ˆfd„|D «       «      }	|s?‰j                  d«      s.t        ‰«      d	kD  r |	st        ˆfd
„‰dd D «       d«      }
|
r|
c S ||v xr | }ŒÌ y)z;Return an execution-bearing interpreter option, if present.rÜ   Fr”  rl   rÞ   r   r•  c              3   ó¶   •K  — | ]P  }|j                  d «      r=|j                  d«      s,‰j                  |«      xr t        ‰«      t        |«      kD  –— ŒR y­w)rl   r”  N)rm   rx   )r"   Úshortr¬  s     €r
   r%   z)_interpreter_exec_flag.<locals>.<genexpr>x  sT   øè ø€ ò (
à U×%5Ñ%5°cÔ%:À5×CSÑCSÐTXÔCYð ×Ñ˜eÓ$ÒA¬¨V«´s¸5³zÑ)AÓAñ(
ùs   ƒAArt   c              3   ó8   •K  — | ]  }d |› �‰v sŒd |› �–— Œ y­wrk   r	   )r"   rk  Úflagss     €r
   r%   z)_interpreter_exec_flag.<locals>.<genexpr>}  s$   øè ø€ ÒU¨4À1ÀTÀFÀÈuÒAT˜a ˜vœJÑUùs   ƒ�
rW   N)Ú_INTERPRETER_EXEC_FLAGSÚ_INTERPRETER_WITH_ARGrm   r    rœ  r&   rx   rÀ  )rÖ   r¥  Úwith_argrÜ   Ú
skip_valuer«  r­  r#   Ú
comparableÚhas_attached_option_valueÚbundledrÔ  r¬  s              @@r
   Ú_interpreter_exec_flagrÜ  b  s  ù€ ä-¨fÑ5Ô7LÈVÑ7T€O€Eˆ8Ø˜<Ñ'€JØ€JØò ;ˆÙØˆJØØ�DŠ=¡°E×4DÑ4DÀSÔ4Ið ˜Ò E§K¡K£M°VÒ$;ÙØð  ð "ŸO™O¨CÓ0Ñˆ�˜Ù'1�V—\‘\”^°vˆ
Ø˜ÑØÒô %(ó (
à!ô(
ó %
Ð!ñ  &×"3Ñ"3°DÔ"9¼cÀ&»kÈAºoÑVoÜÓU°6¸!¸"°:ÔUÐW[Ó\ˆGÙØ’Ø 8Ð+Ò:°F°
‰
ð3;ð4 r   c                 ór  — d}|t        | «      k  r§| |   }|dk(  s|j                  d«      s	 y|t        v r|dz  }Œ9|dd }|j                  d«      st        |«      t        k  s|dz  }Œgt        d|v xs d|v «      }d	|v r |dz   |z   }d
|t        | «      k  r| |   fS dfS |d|z   z  }|t        | «      k  rŒ§y)aH  Return whether Bash ``-c`` occurs and the command string it owns.
    Bash's O/o options consume the following argument even when they precede a later ``-c`` or
    share its short-option bundle; the two startup-file long options own their next token.
    Parsing those first prevents both missed payloads and false ``-c`` hits.r   r”  )rl   ú+rt   rW   NÚOÚorw   Tr;   )rx   rm   Ú_BASH_OPTIONS_WITH_ARGÚsetÚ_BASH_SHORT_OPTION_LETTERSrŠ  )r¥  Úindexr«  r¯  Úconsumed_option_argÚpayload_indexs         r
   Ú_bash_exec_payloadrç  „  sù   € ð
 €EØ
”#�d“)Ò
Ø�U‘ˆØ�DŠ= × 0Ñ 0°Ô <Øð ð Ô*Ñ*Ø�Q‰JˆEØØ�a�b�	ˆð ×Ñ˜DÔ!¬¨U«Ô7QÒ)QØ�Q‰JˆEØÜ! #¨ ,Ò">°#¸°,Ó?ÐØ�%‰<Ø! A™IÐ(;Ñ;ˆMØ°ÄÀTÃÒ1J˜$˜}Ñ-ÐUÐUÐPTÐUÐUØ�Ð(Ñ(Ñ(ˆð# ”#�d“)Ó
ð$ r   Útoolc                 ó�  ‡
— t         |    }d}|t        |«      k  �r+||   }|dk(  r	 y|j                  d«      \  }}}|r|nd}||v r|nd}| dk(  r)|j                  d«      rt        |«      dkD  r
|dd |dd }}|r/|€|dz   t        |«      k  r||dz      }|r||fS ||�d|vrdndz  }n�|t        |    v r|€|dz  }nz|j                  d	«      rd|j                  d«      sSt        |«      dkD  rEt
        |    Š
t        ˆ
fd
„t        |dd d¬«      D «       d«      }	||	t        |«      dz
  k(  rdndz  }n|dz  }|t        |«      k  r�Œ+y)zEReturn (option, program) for a read-only tool's program-running flag.r   r”  r•  Nr  )r  r  rt   rW   rl   c              3   ó2   •K  — | ]  \  }}|‰v sŒ|–— Œ y ­wr   r	   )r"   Úkrk  Úshortss      €r
   r%   z'_read_tool_exec_flag.<locals>.<genexpr>º  s   øè ø€ Ò[¡  4ÈDÐTZÊNœ!Ñ[ùs   ƒ�)rz  )Ú_READ_TOOL_EXEC_FLAGSrx   rœ  rm   Ú _READ_TOOL_LONG_OPTIONS_WITH_ARGÚ!_READ_TOOL_SHORT_OPTIONS_WITH_ARGrÀ  rž  )rè  r¥  rÔ  rä  r«  r¬  r­  ÚpayloadÚmatchedÚownerrì  s             @r
   Ú_read_tool_exec_flagró  Ÿ  s†  ø€ ä! $Ñ'€EØ€EØ
”#�d“)Ó
Ø�U‘ˆØ�DŠ=Øð0 ð/ #(§/¡/°#Ó"6Ñˆ�˜Ù#‘'¨ˆØ" e™O‘&°ˆØ�5Š=˜U×-Ñ-¨lÔ;ÄÀEÃ
ÈQÂØ$ R a˜y¨%°°¨)�WˆGÙØˆ 5¨1¡9¬s°4«yÒ#8Ø˜u q™y™/�ñ Ø Ð'Ð'Ø˜'Ð-°#¸UÑ2B‘QÈÑI‰EØÔ7¸Ñ=Ñ=À'À/Ø�Q‰J‰EØ×Ñ˜cÔ"¨5×+;Ñ+;¸DÔ+AÄcÈ%ÃjÐSTÂnô 7°tÑ<ˆFÜÓ[¬9°U¸1¸2°YÀaÔ+HÔ[Ð]aÓbˆEØ˜%¤3 u£:°¡>Ò1‘Q°qÑ8‰Eà�Q‰JˆEð5 ”#�d“)Ô
ð6 r   c              #   ó  K  — t        | «      D ]ø  }t        |«      D ]è  \  }}}t        |«      }t        ||«      }t        j
                  j                  |«      j                  «       }t        |«      }|€|€|t        v r
t        df–— Œm|sŒp|dd }	|rt        ||	«      rd–— Œˆ|rt        d„ |	D «       «      rd–— Œ¡|t        v rt        |	«      \  }
}|
rd|f–— |t        v sŒÈt        ||	«      }|sŒ×d|› d|d	   › �|d   f–— Œê Œú y­w)
z>Yield scoped execution mechanisms and any executable payloads.NrW   )rT   Nc              3   ó>   K  — | ]  }|j                  d «      –— Œ y­w)z<<N)rm   )r"   r«  s     r
   r%   z+_execution_flag_findings.<locals>.<genexpr>Ò  s   è ø€ ÒI¸5 × 0Ñ 0°× 6ÑIùs   ‚)rU   Nzshell command via -c/-lc flagz arbitrary program execution via r/   r   )r›  r'   r   rÌ  r   r   r   r    rÂ  rí  rF   rÜ  r&   Ú_SHELL_NAMESrç  ró  )r   rt  rz  r#   r$   rº  r„  Úexecutable_namerÖ   r¥  Úfoundrð  Úfindings                r
   Ú_execution_flag_findingsrú  Á  s5  è ø€ ä1°'Ó:ò nˆÜ<¸WÓEò 	n‰NˆE�1�dÜ>¸tÓDˆJÜ*¨7°EÓ:ˆFÜ Ÿg™g×.Ñ.¨zÓ:×@Ñ@ÓBˆOÜ(¨Ó4ˆFØˆ~ØÐ%¨Ô<QÑ)QÜ6¸Ð=Ò=ØÙØØ˜!˜"�:ˆDÙÔ0°¸Ô>Ø?Ó?ÙœCÑIÀDÔIÔIØ<Ó<à"¤lÑ2Ü%7¸Ó%=‘N�E˜7ÙØ>ÀÐHÒHØ"Ô&;Ò;Ü2°?ÀDÓI�GÚØ!AÀ/ÐARÐRSÐT[Ð\]ÑT^ÐS_Ð`ÐbiÐjkÑblÐmÓmñ1	nñnùs   ‚C!D
Ã$D
Ã3D
Úposc                 ó–   — |t        | «      k  r:| |   j                  «       r'|dz  }|t        | «      k  r| |   j                  «       rŒ'|S )NrW   )rx   r‹  )r   rû  s     r
   Ú_skip_shell_whitespacerý  ß  sH   € Ø
”�G“Ò
 ¨¡×!5Ñ!5Ô!7Øˆq‰ˆð ”�G“Ò
 ¨¡×!5Ñ!5Õ!7à€Jr   r+   F)r.   ÚbraceÚstop_unterminatedr4   rÎ  r¶  r|  r.   rþ  rÿ  r4   rÎ  c             #   óš  K  — |€t        | «      n|}d}	|}
|
|k  �r.| |
   }d|
dz   }}|r+|	€)t        | |
«      rd| j                  d|
|«      }}|dk  rÛ|}nØ|	dk7  r|dk(  r|
dz   |k  rd	|
d
z   }}n¾||	k(  s|	€|dv rd}n°|	dk7  r«|	rdnd|v r£|dk(  s(| j                  d|
«      s|rŠ|	sˆ| j                  d|
«      rv|dk(  r+|r| j                  d|
dz   «      dz   xs dnt	        | |
«      }n4| |
dz      dk(  rt        | |
«      }n| j                  d|
d
z   «      dz   xs d}|�d|}}n|r	d|
d|	f–— y||
||	f–— |dk(  r|	rdn|}	|}
|
|k  r�Œ-yy­w)aù  Yield ``(kind, i, j, quote)`` lexical steps over ``text[start:end]`` without expanding.

    The single quote/escape state machine behind every detection scanner. ``kind`` is ``"char"``
    (one char), ``"esc"`` (backslash + the char it escapes; never inside single quotes), ``"quote"``
    (an opening/closing quote char) or ``"subst"`` (a ``$(...)`` / backtick / ``${...}`` span);
    With *comments*, ``"comment"`` spans are skipped without interpreting their quote syntax.
    ``quote`` is the state the step was read in (``None``, ``'`` or ``"``). Substitutions are
    recognized unquoted when ``"u"`` is in *subst*, inside double quotes when ``"q"`` is; *brace*
    adds unquoted ``${...}``. An unterminated substitution falls through as plain chars unless
    *stop_unterminated*, which yields ``("subst", i, None, quote)`` and ends the scan (the caller
    descends to *end* itself). *naive_backtick* closes a backtick at the next backtick even if
    escaped (the quoted-prose masker's historical behavior).Nrk  rW   rÏ  r‡  r   r~  r„   r‰  rt   z'"r-   r3   Úurv  rˆ  z${ú(ú}r.   )rx   Ú_is_shell_comment_startrx  rm   Ú_scan_backtick_endÚ_scan_dollar_paren_end)r¶  rz  r|  r.   rþ  rÿ  r4   rÎ  Únr-   r1   r�  r0   r2   Úcloses                  r
   r7   r7   å  s¢  è ø€ ð �[ŒˆDŒ	 c€AØ€EØ€AØ
ˆa‹%Ø�!‰WˆØ˜!˜a™%ˆaˆÙ˜˜Ô*AÀ$ÈÔ*JØ §¡¨4°°AÓ!6�!ˆDØ�1ŠuØ‘Ø�cŠ\˜b Dšj¨Q°©U°QªYØ˜Q ™U�!‰DØ�5Š[˜U˜]¨r°U©{Ø‰DØ�cŠ\¡e™s°¸Ñ>Ø�#ŠI˜Ÿ™¨¨qÔ1±eÁEÈdÏoÉoÐ^bÐdeÔNfà�SŠyÙ=K˜Ÿ	™	 # q¨1¡uÓ-°Ñ1Ò9±TÔQcÐdhÐjkÓQl‘Ø�a˜!‘e‘ Ò#Ü.¨t°QÓ7‘àŸ	™	 # q¨1¡uÓ-°Ñ1Ò9°T�ØÐ Ø! 5�a‘Ù"Ø  4¨Ð/Ò/ØØ�Q˜˜5Ð!Ò!Ø�7Š?Ù!‘D rˆEØˆð9 ˆaŽ%ùs   ‚EEÅ	Ec                 ó    — d}t        | |dz   «      D ]:  \  }}}}|dk(  sŒ|rŒ|| j                  d|«      | |   dk(  z
  z  }|dk(  sŒ5|dz   c S  y)zCReturn the offset after a balanced ``$(...)`` command substitution.rW   rt   rk  rˆ  r   r   N)r7   rm   )r   rz  rŒ  r0   r1   r#   r-   s          r
   r  r    sm   € à€EÜ(¨°%¸!±)Ó<ò Ñˆˆa��EØ�6‹>¢%Ø�W×'Ñ'¨¨aÓ0°G¸A±JÀ#Ñ4EÑFÑFˆEØ˜‹zØ˜1‘u’ð	ð
 r   c                 ó˜   — t        j                  dt         j                  «      j                  | |dz   «      }|r|j	                  «       S d S )Nz(?:\\.|[^`\\])*`rW   )re   ry   ÚDOTALLÚmatchr|  )r   rz  r  s      r
   r  r  !  s;   € ä�J‰JÐ*¬B¯I©IÓ6×<Ñ<¸WÀeÈaÁiÓP€EÙˆ5�9‰9‹;Ð) TÐ)r   c                 óª   — t        | |«      x}}t        | |dd¬«      D ],  \  }}}}|dk(  r|€| |   j                  «       s| |   dv r n|}Œ. ||| || fS )z1Read one shell word without executing expansions.r  T)r.   rþ  rk  z;&|<>())rý  r7   r‹  )r   rû  rz  r|  r0   r1   r2   r-   s           r
   Ú_read_shell_wordr  '  s{   € ä(¨°#Ó6Ð6€EˆCÜ(¨°%¸sÈ$ÔOò Ñˆˆa��EØ�6Š>˜e˜m°¸±×1CÑ1CÔ1EÈÐQRÉÐW`ÑI`ÙØ‰ðð �3˜  cÐ*Ð+Ð+r   Úscriptc                 óâ  — 	 t        j                  | d¬«      }|sy|d   j                  «       |dd }}|dk(  r=|rAt	        j
                  d|d   «      r(|dd }|r!t	        j
                  d|d   «      rŒ!n|dk7  ryt        |«      dk(  rt        j                  |d   «      r|d   S |dk(  r3t        |«      d	k(  r%|d   d
k(  rt        j                  |d   «      r|d   S y# t        $ r g }Y ŒÔw xY w)zEResolve tiny literal command substitutions without executing a shell.T©rÄ  Nr   rW   Úechoz-[nEe]+Úprintfrt   z%s)rÆ  ro   rÊ  r    re   r½  rx   Ú_SIMPLE_SHELL_LITERAL_RE)r  r„  r   r¥  s       r
   Ú$_literal_command_substitution_outputr  1  sú   € ðÜ—‘˜V¨4Ô0ˆñ ØØ˜1‘I—O‘OÓ% v¨a¨b zˆT€GØ�&ÒÙ”r—|‘| J°°Q±Ô8Ø˜˜�8ˆDñ ”r—|‘| J°°Q±Ö8à	�HÒ	ØÜ
ˆ4ƒy�A‚~Ô2×<Ñ<¸TÀ!¹WÔEØ�A‰wˆØ�(Òœs 4›y¨Aš~°$°q±'¸T²/ÔF^×FhÑFhÐimÐnoÑipÔFqØ�A‰wˆØøô ò ØŠðús   ‚C  Ã C.Ã-C.r$   c                 óL  — g }d}|t        | «      k  r‚| j                  d|«      rdn| |   dk(  rdnd}|r |dk(  rt        nt        | |«      nd }|�t	        | ||z   |dz
   «      nd }|€
| |   |dz   }}|j                  |«       |}|t        | «      k  rŒ‚dj                  |«      S )Nr   rˆ  rt   rv  rW   r+   )rx   rm   r  r  r  r€  r6   )r$   r¯  r1   Úopenerr|  r}   s         r
   Ú%_replace_simple_command_substitutionsr  F  s¾   € Ø€EØ	€AØ
Œc�$‹iŠ-Ø—o‘o d¨AÔ.‘¸¸a¹ÀCº±AÈQˆÙZ`ÐL¨°1ªÕ%Ô:LÈdÐTUÔVÐfjˆØX[ÐXgÔ:¸4ÀÀFÁ
È3ÐQRÉ7Ð;SÔTÐmqˆØÐØ# A™w¨¨A©˜ˆKØ�‰�[Ô!Øˆð Œc�$‹i‹-ð �7‰7�5‹>Ðr   c                 ót   — t        | «      } t        j                  d„ | «      } t        j                  d„ | «      S )Nc                 ó$   — | j                  d«      S )Nr}   ©r†   ©r  s    r
   rˆ   z2_replace_simple_shell_expansions.<locals>.<lambda>V  s   € °5·;±;¸}Ó3M€ r   c                 ó$   — | j                  d«      S )NÚdefaultr  r  s    r
   rˆ   z2_replace_simple_shell_expansions.<locals>.<lambda>W  s   € ¨u¯{©{¸9Ó/E€ r   )r  Ú_PARAM_REPLACEMENT_RErf   Ú_PARAM_DEFAULT_RE©r$   s    r
   Ú _replace_simple_shell_expansionsr"  T  s3   € Ü0°Ó6€DÜ ×$Ñ$Ñ%MÈtÓT€DÜ× Ñ Ñ!EÀtÓLÐLr   c                 óJ   ‡ — dj                  ˆ fd„t        ‰ «      D «       «      S )Nr+   c              3   óV   •K  — | ]   \  }}}}|d k7  r|dk(  r‰|dz      n‰|   –— Œ" y­w)r-   r‰  rW   Nr	   )r"   r0   r1   r#   r$   s       €r
   r%   z+_strip_shell_word_syntax.<locals>.<genexpr>[  s>   øè ø€ ò áˆD�!�Q˜°$¸'²/ð ˜u’}ˆˆQ�‰UŠ¨$¨q©'Ó1ñùs   ƒ&)r5   r!  s   `r
   Ú_strip_shell_word_syntaxr%  Z  s&   ø€ Ø�7‰7ó ä(¨Ó.ôó ð r   c                 ób   — t        d«      D ]   }| }t        t        | «      «      } | |k(  sŒ | S  | S )z»Approximate how shell syntax can spell a command word: collapses quoting/escaping plus
    simple literal command substitutions in the word itself. Intentionally narrow and non-executing.rt   )Úranger%  r"  )r$   r#   rµ  s      r
   r   r   a  sC   € ô �1‹Xò ˆØˆÜ'Ô(HÈÓ(NÓOˆØ�8ÓØØ€Kðð
 €Kr   rä  c                 óh   — | |   dk(  xr) |dk(  xs" | |dz
     j                  «       xs
 | |dz
     dv S )Nú#r   rW   z;&|()<>)r‹  )r   rä  s     r
   r  r  l  sQ   € Ø�5‰>˜SÑ ò J e¨q¡jò 'I°G¸EÀA¹IÑ4F×4NÑ4NÓ4Pò 'IØ)0°¸±Ñ);¸yÐ)HðJr   c              #   ó^  ‡ ‡‡K  — dgŠdt         dt         dd fˆ ˆˆfd„Š ‰dt        ‰ «      «       t        «       }‰D ]l  }t        ‰ |«      }|t        ‰ «      k\  s||v st	        ‰ |«      rŒ.|j                  |«       |–— t        ‰ |«      \  }}}|t        v sŒ\‰j                  |«       Œn y ­w)Nr   rz  r|  r   c                 óÜ  •— d}t        ‰	| |ddd¬«      D ]Õ  \  }}}}|dk(  r1|‰	|   dk(  rdndz   }‰j                  |«        ‰
||€|n|dz
  «       Œ>|d	k(  sŒD|�ŒG||k7  sŒM‰	|   d
v s-‰	|   dk(  r:|dk(  s ‰	|dz
     j                  «       s
‰	|dz
     dv r‰j                  |dz   «       Œ–‰	|   dv sŒž|dz   |k  xr ‰	|dz      ‰	|   k(  }|r|dz   n|}‰j                  |dz   |z   «       Œ× y )Nrw  ÚuqT)r.   rÿ  rÎ  r.   rv  rW   rt   rk  z(;
ú{r   z(;&|)z&|)r7   r€  r‹  )rz  r|  Úskipr0   r1   r2   r-   ÚinnerÚrepeatedr   ÚscanÚstartss            €€€r
   r1  z(_iter_shell_command_starts.<locals>.scant  s*  ø€ ØˆÜ!,¨W°e¸SÈÐ`dØ59ô";ò 	4ÑˆD�!�Q˜à�wŠà '¨!¡*°Ò"3™Q¸Ñ;�Ø—‘˜eÔ$Ù�U 1 9™C°!°a±%Õ8Ø˜“ E¡M°a¸4³ið ˜1‘: Ñ'¨G°A©J¸#Ò,=À1ÈÂ6ÈWÐUVÐYZÑUZÉ^×McÑMcÔMeØFMÈaÐRSÉeÁnÐX_ÑF_Ø—M‘M ! a¡%Õ(Ø˜Q‘Z 4Ò'Ø  1™u s™{ÒK¨w°q¸1±u©~ÀÈÁÑ/K�HÙ$,˜1˜qš5°$�DØ—M‘M ! a¡%¨(Ñ"2Õ3ñ#	4r   )	rŠ  rx   râ  rý  r  Úaddr  Ú_SHELL_COMMAND_TRANSITIONSr€  )r   Úseenrz  r#   r|  r$   r1  r2  s   `     @@r
   Ú_iter_shell_command_startsr6  q  s±   úè ø€ ØˆS€Fð4”Cð 4œcð 4 d÷ 4ñ* 	ˆŒC�‹LÔÜ‹5€DØò ˆÜ& w°Ó6ˆØ”C˜“LÒ  E¨T¡MÔ5LÈWÐV[Ô5\ØØ�‰�ŒØŠÜ'¨°Ó7‰ˆˆ3�ØÔ-Ò-Ø�M‰M˜#Õñùs   …BB-ÂB-Úmarkerc           	      ó„   — t        d„ t        | «      D «       «      }|rt        | |D �cg c]  }|||f‘Œ	 c}«      S | S c c}w )uÇ  Insert *marker* (a newline) before each real (quote-aware) command start.
    ``\n`` is already a ``_CMDPOS`` separator, so this exposes subshell ``(cmd)`` and brace-group
    ``{ cmd; }`` openers â€” which the flat pattern class omits â€” to the anchored patterns WITHOUT the
    quoted-prose false positives that adding ``(`` / ``{`` to ``_CMDPOS`` would cause: starts inside
    quotes are never produced, so ``--title "block (reboot)"`` is left as-is.c              3   ó,   K  — | ]  }|d kD  sŒ	|–— Œ y­w©r   Nr	   )r"   rà  s     r
   r%   z'_mark_command_starts.<locals>.<genexpr>œ  s   è ø€ ÒM˜1ÀqÈ1Ãu”QÑMùs   ‚
�)r‹   r6  r·  )r   r7  Úoffsetsrà  s       r
   Ú_mark_command_startsr<  –  sB   € ô ÑMÔ :¸7Ó CÔMÓM€GÙBIŒ7�7°WÖ=°˜a  Fš^Ò=Ó>ÐVÈwÐVùÒ=s   ¨=
c                 ó:   — d| vr| S t        | dt        | «      «      S )a‚  Replace raw newlines inside single/double quotes with a space (detection-only).
    A quoted newline is DATA to the shell, yet the flat ``_CMDPOS`` class treats every raw ``\n``
    as a command start, so multi-line quoted arguments (commit messages, heredoc text) tripped the
    hardline blocklist when a data line began with e.g. ``sudo reboot``. Quote tracking mirrors
    ``_iter_shell_command_starts``. Unquoted newlines pass through and ``_mark_command_starts``
    still re-inserts newlines at genuine starts; an unclosed quote absorbs following newlines
    exactly as the shell would, so masking them cannot hide a runnable command.r‡  r   )Ú_mask_quoted_newlines_spanrx   r(   s    r
   rE   rE      s$   € ð �7ÑØˆÜ% g¨q´#°g³,Ó?Ð?r   c                 ó”  — g }t        | ||d¬«      D ]¤  \  }}}}|dk(  rc|| j                  d|«      rdndz   }|dz
  }	|j                  | || «       |j                  t        | ||	«      «       |j                  | |	| «       Œp|r|dk(  r| |   dk(  r|j                  d	«       Œ‘|j                  | || «       Œ¦ d
j	                  |«      S )aè  ``_mask_quoted_newlines`` over ``command[start:end]``. A ``$(...)`` / backtick substitution
    inside double quotes is EXECUTABLE, not data: its body is re-scanned with a fresh quote state so a
    newline that separates commands inside it survives as a command boundary. Masking it as quoted
    data turned ``"$(grep x f
reboot)"`` into ``... f reboot)``, which no later stage can tell from an
    operand; the pre-fix scanner only caught it by refusing the whole command as malformed.r3   )r.   r.   rˆ  rt   rW   rk  r‡  r/   r+   )r7   rm   r€  r>  r6   )
r   rz  r|  Úoutr0   r1   r2   r-   Ú
body_startÚbody_ends
             r
   r>  r>  ­  sÔ   € ð €CÜ(¨°%¸ÀCÔHò %Ñˆˆa��EØ�7Š?à 7×#5Ñ#5°d¸AÔ#>™aÀAÑFˆJØ˜1‘uˆHØ�J‰J�w˜q Ð,Ô-Ø�J‰JÔ1°'¸:ÀxÓPÔQØ�J‰J�w˜x¨Ð*Õ+Ù�t˜v’~¨'°!©*¸Ò*<Ø�J‰J�s�Oà�J‰J�w˜q �|Õ$ð%ð �7‰7�3‹<Ðr   c              #   óÔ  K  — t        | «      D �]Õ  }d\  }}d\  }}|t        | «      k  sŒt        j                  | t	        | |«      «      }|rt        | |j                  «       «      \  }}}ŒPt        | |«      \  }}	}
||	k(  rŒt|	}t        |
«      }t        j                  j                  |«      j                  «       }|rd}Œ¥|r
|r|dk(  rd}Œ±|rº|r¸|j                  d«      r§|j                  dd«      d   }|d	k(  r|d
k(  s|j                  d«      r�Œt        j                  |t!        «       «      }||v s)|dk(  r&|j                  d«      st!        |dd «      ddhz  r�ŒSd|vxr  |t"        j                  |t!        «       «      v }�Œm|r|dz  }�Œvt$        j'                  |
«      r�Œ�||	|
f–— |t(        vr�Œ¬|d}}t*        j                  |d«      }|t        | «      k  r�Œ¹�ŒØ y­w)z:Yield command-position words that may be executable names.)Nr   )TFFr”  rl   r•  rW   r   rœ   rº   r¸   r   NÚvÚVT)r6  rx   Ú_SHELL_REDIRECTION_REr  rý  r  r|  r   r   r   r   r    rm   ro   Ú&_COMMAND_WRAPPER_NON_EXECUTING_OPTIONSr[   râ  Ú!_COMMAND_WRAPPER_OPTIONS_WITH_ARGÚ_ENV_ASSIGNMENT_REr½  Ú_COMMAND_WRAPPER_WORDSÚ _COMMAND_WRAPPER_POSITIONAL_ARGS)r   rû  ÚwrapperÚpositionalsrª  Úskip_argÚredirectr#   Ú
word_startÚword_endr$   Údeobfuscatedr¿  r¬  Úqueriess                  r
   r'   r'   Ã  s  è ø€ ä)¨'Ó2ó )HˆØ&Ñˆ�Ø'Ñˆ�Ø”C˜“LÓ Ü,×2Ñ2°7Ô<RÐSZÐ\_Ó<`ÓaˆHÙÜ,¨W°h·l±l³nÓE‘	��3˜ØÜ)9¸'À3Ó)GÑ&ˆJ˜ $Ø˜XÒ%ØØˆCÜ@ÀÓFˆLÜ—7‘7×#Ñ# LÓ1×7Ñ7Ó9ˆDÙØ �ØÙ™7 |°tÒ';Ø�ØÙ™7 |×'>Ñ'>¸sÔ'CØ%×+Ñ+¨C°Ó3°AÑ6�Ø˜eÒ#¨Ð3CÒ)CÀ|×G^ÑG^Ð_cÔGdñ Ü@×DÑDÀWÌcËeÓT�Ø˜WÑ$¨°IÒ)=Àf×FWÑFWÐX\ÔF]Ü-0°¸¸°«_ÀÀS¸zÒ-IÙØ lÐ2Òv°vÔAb×AfÑAfÐgnÔpsÓpuÓAvÐ7v�ÙÙØ˜qÑ �ÙÜ!×+Ñ+¨DÔ1ÙØ˜x¨Ð.Ò.ØÔ1Ñ1ÙØ# T�WˆGÜ:×>Ñ>¸tÀQÓGˆKðM ”C˜“LÖ ñ)Hùs   ‚(G(«F7G(Ç$G(c                 ó¤   — t        | «      }t        | |ddd¬«      D ]   \  }}}}|dk(  s|dk(  sŒ|�Œ| |   dv sŒ|} n | || j                  «       S )zCBound a candidate to its command, preserving quoted argument bytes.r,  T)r.   rþ  rÎ  rÏ  rk  z;&|
)`)rx   r7   Ústrip)r   rz  r|  r0   r1   r#   r-   s          r
   Ú_shell_command_segmentrV  ñ  so   € ä
ˆg‹,€CÜ(¨°%¸tÈ4ÐZ^Ô_ò Ñˆˆa��EØ�9Ò ¨£°E±MÀgÈaÁjÐT]ÒF]ØˆCÙðð �5˜Ð×#Ñ#Ó%Ð%r   rð  c                 óÖ  — ddddddddd	d
dœ
}g g }}d\  }}}|t        | «      k  �r| |   }|dz  }|d
k(  r•|t        | «      k(  ry| |   }|d	k(  r|dvr|j                  |«       d}ŒO|dz  }|dk(  r|rynÏ|dk(  r)|€'|r |j                  dj                  |«      «       g d}}Œ‹||vr|dk7  ry|j                  |dk(  rdn||   «       d}Œ³|dv r|�||k(  r	|€|nd}d}ŒÇ|€+|dv r'|r |j                  dj                  |«      «       g d}}Œô|€|dk(  r|sn.|dk(  r|d	k7  ry|j                  |«       d}|t        | «      k  r�Œ|ry|r |j                  dj                  |«      «       |S )zÊProject GNU env -S literal argv, not POSIX shell words.

    Dynamic ${NAME} expansion is deliberately not evaluated: the execution
    backend's environment need not be this process's environment.
    úr‡  úú	úr)  ú$ú"r~  r„   )
ra  r  Úrrn   rD  r)  r\  r]  r~  r„   )NFr   rW   N)r~  r„   Trw   r#   r+   Fr/   )r~  r]  z 	
)rx   r€  r6   )	rð  Úescapesr¥  r$   r-   Ústartedrä  rk  Úescapeds	            r
   Ú_split_env_stringrb  û  sÈ  € ð ˜t¨$°TÀØ˜c¨°C¸tñE€Gà�Rˆ$€DØ*Ñ€Eˆ7�EØ
”#�g“,Ó
Ø�u‰~ˆØ�‰
ˆØ�4Š<Øœ˜G›Ò$ØØ˜e‘nˆGØ˜Š| ¨{Ñ :Ø—‘˜DÔ!Ø�ØØ�Q‰JˆEØ˜#Š~ÙØØØ˜#Š~ % -ÙØ—K‘K §¡¨£Ô.Ø " E�g�ØØ˜gÑ%¨'°Sª.ØØ�K‰K˜w¨#š~™°7¸7Ñ3CÔDØˆGØØ�:Ñ 5 =°D¸E²MØ!˜M‘D¨tˆEØˆGØØˆ=˜T ]Ñ2ÙØ—‘˜BŸG™G D›MÔ*Ø �'ˆDØØˆ=˜T Sš[±ØØ�3Š;˜5 Cš<ØØ�‰�DÔØˆðQ ”#�g“,Ô
ñR ØÙØ�‰�B—G‘G˜D“MÔ"Ø€Kr   r„  c                 óÐ  — d}|t        | «      k  rÖ| |   }|dk(  s|j                  d«      sy |j                  d«      \  }}}|dk(  s|j                  d«      rl|dk(  r|nt        |«      dkD  }|s|dz  }|r|dk(  r|n|dd  n|t        | «      k  r| |   nd}t        |«      }|�t	        j
                  || |dz   d  z   «      S d S ||s|t        d	   v rdndz  }|t        | «      k  rŒÖy )
NrW   r”  rl   r•  rº   r¸   rt   r+   rœ   )rx   rm   rœ  rb  rÆ  r6   rH  )	r„  rä  r«  r¬  r­  r…  r°  rð  r¥  s	            r
   Ú_env_split_payloadrd  5  s  € Ø€EØ
”#�f“+Ò
Ø�u‘ˆØ�DŠ= × 0Ñ 0°Ô 5ØØ %§¡°Ó 4Ñˆ�˜ØÐ%Ò%¨×)9Ñ)9¸$Ô)?Ø!'Ð+;Ò!;‘vÄÀUÃÈaÁˆHÙØ˜‘
�ÙNV Ð*:Ò :‘uÀÀaÀbÁ	Ø!&¬¨V«Ò!4��u’¸"ð ä$ WÓ-ˆDð =AÐ<L”5—:‘:˜d V¨E°A©I¨JÐ%7Ñ7Ó8ÐVÐRVÐVØ™& VÔ/PÐQVÑ/WÑ%W‘Ð]^Ñ^ˆð ”#�f“+Ó
ð  r   c              #   ó’  K  — t        | «      E d{  –—†  | gt        «       }}|�r�|j                  «       }||v rŒ|j                  |«       t	        |«      D �]<  \  }}}t        ||«      }t        |«      }|||z
  d }	g }
t        |	«      D ]R  \  }}}}|dk(  r2|€0|	|   j                  «       r|
r	|
d   dk7  sŒ-|
j                  d«       Œ?|
j                  |	|| «       ŒT dj                  |
«      }	t        j                  |t        j                  j                  |«      f«      D ]  }||	z   }|–— t!        |«      –— Œ t        j                  j                  |«      dk(  s�Œt#        |d«      }|s�Œt%        |«      }|s�Œ,|j                  |«       �Œ? t'        |«      D ]  \  }}|sŒ	|j                  |«       Œ |r�Œœyy7 �Œ³­w)a#  Add executable projections without reparsing normalized argument data.

    Whole-input matching is retained for existing globs. New projections parse
    the original quote state, preserve path-specific rules, and fold only the
    executable basename (never arbitrary argument paths).
    Nrk  rw  r/   r+   rœ   r   )rG   râ  Úpopr3  r'   rV  r   r7   r‹  r€  r6   r‰   rŠ   r   r   r   r?   rÌ  rd  rú  )r   Úpendingr5  r   rz  r|  r$   rt  rº  r   r´  r0   r1   r2   r-   r¿  Ú	candidater„  rð  r#   s                       r
   Ú_deny_command_variantsri  J  sº  è ø€ ô +¨7Ó3×3Ð3Ø�Iœs›uˆT€GÚ
Ø—‘“ˆØ�T‰>ØØ�‰�ÔÜ >¸vÓ Fó 	0ÑˆE�3˜Ü,¨V°UÓ;ˆGÜ>¸tÓDˆJØ˜3 ™;˜<Ð(ˆDàˆEÜ%0°Ó%6ò ,Ñ!��a˜˜EØ˜6’> e m¸¸Q¹¿¹Ô8IÙ  E¨"¡I°Ó$4ØŸ™ SÕ)à—L‘L  a¨ Õ+ð,ð —7‘7˜5“>ˆDÜŸ™ z´2·7±7×3CÑ3CÀJÓ3OÐ&PÓQò B�Ø  4™K�	Ø’ô 7°yÓAÓAðBô �w‰w×Ñ 
Ó+¨uÔ4Ü.¨w¸Ó:�ÛÜ0°Ó8�GÛØŸ™ wÖ/ð1	0ô2 3°6Ó:ò 	(‰JˆAˆwÚØ—‘˜wÕ'ð	(õ= ð 4ûs5   ‚G‘G’B%GÂ8B*GÅ$GÅ4GÆ'GÆ+GÇGc              #   óŒ  ‡‡K  — t        t        | «      «      }t        |«      \  }}|hŠ|–— dt        dt        fˆfd„}t        j                  d| «      st        j                  d| «      r0t        t        | j                  dd«      «      «      } ||«      r|–— |g}|r^t        |j                  «       «      D ]?  \  }} ||«      sŒ|–— t        |«      }||k7  r ||«      r|–— |j                  |«       ŒA |rŒ^t        |«      }	|	|k7  r ||	«      r|	–— t        t        t        | «      d¬	«      «      }
 ||
«      r|
–— t        ˆfd
„t        |«      D «       d„ ¬«      }|r[g g d}}}|D ]2  }|d   |k  r|j                  |«       Œ|j                  |«       |d   }Œ4 t        ||«      } ||«      r|–— |}|rŒZy y ­w)NÚvariantr   c                 ó6   •— | r| ‰v ry‰j                  | «       y)NFT)r3  )rk  r5  s    €r
   Úfreshz*_command_detection_variants.<locals>.fresh�  s   ø€ Ù˜' T™/ØØ�‰�ÔØr   z(?:[A-Za-z]:|\\\\)[\\\\]z[A-Za-z]:\\r„   r…   z 
)r7  c              3   óT   •K  — | ]  \  }}}t        |«      xŠr‰|k7  r||‰f–— Œ! y ­wr   )r   )r"   rP  rQ  r$   rR  s       €r
   r%   z._command_detection_variants.<locals>.<genexpr>´  s@   øè ø€ ò 	dÑ2L°*¸hÈÜBÀ4ÓHÐHˆ\ÐHÈlÐ^bÒNbð �h Ô	-ñ 	dùs   ƒ%(c                 ó   — | d d S )Nrt   r	   )Úspans    r
   rˆ   z-_command_detection_variants.<locals>.<lambda>¶  s   € ˜˜b˜q˜€ r   )r�   r   rW   )r?   rE   rD   rš   Úboolre   r>   rd   rú  rf  r<  r€  r‹   r'   r·  )r   Ú
normalizedÚ	grep_safer#   rm  Úwin_variantrg  rð  Úmarked_payloadÚmarkedÚfaithfulÚappliedÚcarryÚcursorrp  rk  rR  r5  s                   @@r
   rG   rG   v  s×  ùè ø€ ô 2Ô2GÈÓ2PÓQ€Jô 0°
Ó;�L€IˆqØˆ;€DØ
‚Oð”sð œtõ ô 
‡y�yÐ,¨gÔ6¼"¿)¹)ÀNÐT[Ô:\Ü6Ô7LÈWÏ_É_Ð]aÐcfÓMgÓ7hÓiˆÙ�ÔØÒð ˆl€GÙ
Ü2°7·;±;³=ÓAò 	(‰JˆAˆwÙ�W�~Ø’ô "6°gÓ!>�Ø! WÒ,±°~Ô1FØ(Ò(Ø—‘˜wÕ'ð	(ò ô " )Ó,€FØ�Ò™u Vœ}ØŠô 0Ô0DÔEZÐ[bÓEcÐlqÔ0rÓs€HÙˆX„ØŠô ó	dÔPnÐoyÓPzô 	dá!ô€Gñ
 Ø!# R¨˜�ˆØò 	!ˆDØ�A‰w˜ÒØ—‘˜TÕ"à—‘˜tÔ$Ø˜a™‘ð	!ô ˜* gÓ.ˆÙ�Œ>ØŠMØˆô ùs   „CGÃ	5GÃ?CGÇGc                 ó4  — 	 t        j                  | d¬«      }t        |«      dk7  s|d   dk7  s|d   dk7  ry|d	   }t        j
                  j                  t        j                  «       «      }t        j
                  j                  |«      }|t        j
                  j                  ||«      k(  xrY t        j
                  j                  t        j
                  j                  |«      «      |k(  xr t        j                  d
|«      duS # t        $ r Y yw xY w)zDReturn whether *command* only removes one Hermes ad-hoc temp script.Tr  Fé   r   ÚrmrW   r½   rt   z(hermes-(?:verify|ad-hoc)-[A-Za-z0-9_.-]+N)rÆ  ro   rÊ  rx   r   r   r“   ÚtempfileÚ
gettempdirr   r6   Údirnamere   r½  )r   ÚargvÚoperandÚtemp_dirr   s        r
   Ú!_is_verification_artifact_cleanupr„  Æ  sê   € ðÜ�{‰{˜7¨$Ô/ˆô ˆ4ƒy�A‚~˜˜a™ Dš¨D°©G°tªOØØ�1‰g€GÜ�w‰w×Ñ¤× 3Ñ 3Ó 5Ó6€HÜ�w‰w×Ñ Ó(€Hà”2—7‘7—<‘< ¨(Ó3Ñ3ò 	\Ü�G‰G�O‰OœBŸG™G×,Ñ,¨WÓ5Ó6¸(ÑBò	\ä�L‰LÐDÀhÓOÐW[Ð[ðøô ò Ùðús   ‚D Ä	DÄDc                 ó>   — 	 ddl m}  || «      S # t        $ r Y yw xY w)ug  Catch gateway-lifecycle verbs spelled with quote splicing.
    Backslash splicing (``kick\start``) is undone by normalization, but quote splicing is not:
    ``_deobfuscate_shell_word_for_detection`` is deliberately scoped to command-position words
    (widening it would let quoted prose like ``git commit -m "rm -rf /"`` match), and the spliced
    verb is an ARGUMENT, so ``launchctl kick"start" -k gui/501/ai.hermes.gateway`` auto-approved.
    Delegates to ``cron.lifecycle_guard`` (shlex-tokenized, anchored on a hermes-gateway
    identifier). Runs last so an ordinary pattern match keeps its more specific reason; this layer
    only prompts â€” the non-bypassable block still lives in ``cron.lifecycle_guard``.

    ``_normalize_command_for_detection`` strips backslash escapes, so ``kick\start`` already reaches the
    launchctl pattern above. See #80269.
    r   )Ú"contains_gateway_lifecycle_commandF)Úcron.lifecycle_guardr†  r”   )r   r†  s     r
   Ú)_is_shell_token_spliced_gateway_lifecyclerˆ  Ø  s+   € ðÝKñ .¨gÓ6Ð6øô ò Ùðús   ‚ �	›c                 óÀ  — t        | «      rdt        t        fS t        | «      ryt        | «      D ]p  }t	        |«      }d}t
        D ]X  \  }}|t        v r1|€t	        t        |«      «      }|j                  |«      sŒ6d||fc c S |j                  |«      sŒQd||fc c S  Œr t        | «      }t        |«      D ]  \  }}d||fc S  t        | «      rdt        t        fS y)zECheck dangerous patterns -> (is_dangerous, pattern_key, description).T)FNNN)rB   rC   r„  rG   rp   ÚDANGEROUS_PATTERNS_COMPILEDÚ$_QUOTE_MASKED_DANGEROUS_DESCRIPTIONSr8   r>   r?   rú  rˆ  Ú%_GATEWAY_LIFECYCLE_SPLICE_DESCRIPTION)r   rJ   Úcommand_lowerrL   rM   rN   rr  r#   s           r
   Údetect_dangerous_commandrŽ  ì  sÿ   € ä% gÔ.ØÔ/Ô1JÐKÐKÜ(¨Ô1Ø"Ü6°wÓ?ò 8ˆÜ/°Ó@ˆØ#'ˆÜ'Bò 		8Ñ#ˆJ˜ØÔBÑBØÐ'Ü#:Ü*¨?Ó;ó$�Lð ×$Ñ$ \Õ2Ø  +¨{Ð;Ô;Ø×"Ñ" =Õ1Ø˜k¨;Ð7Ô7ñ		8ð8ô 2°'Ó:€JÜ2°:Ó>ò 0‰ˆ�QØ�k ;Ð/Ò/ð0ä0°Ô9ØÔ;Ô=bÐcÐcØr   )z(?:\s|$|[)`;|&])r:  )r‡  )�Ú__doc__Ú	functoolsÚloggingr   re   rÆ  r~  rb   Ú	getLoggerÚloggerÚ_SSH_SENSITIVE_PATHÚ_HERMES_ENV_PATHÚ_HERMES_CONFIG_PATHÚ_PROJECT_ENV_PATHÚ_PROJECT_CONFIG_PATHÚ_SHELL_RC_FILESÚ_CREDENTIAL_FILESÚ_MACOS_PRIVATE_SYSTEM_PATHÚ_SYSTEM_CONFIG_PATHÚ_SENSITIVE_WRITE_TARGETÚ_USER_SENSITIVE_WRITE_TARGETÚ_PROJECT_SENSITIVE_WRITE_TARGETÚ_COMMAND_TAILÚ_WRITE_TARGET_BOUNDARYÚ_CMDPOSrš   r   Ú_HARDLINE_SYSTEM_DIRSÚ_RM_FLAG_PREFIXÚ	_PKG_OPTSÚHARDLINE_PATTERNSÚ
IGNORECASEr  Ú	_RE_FLAGSÚ	frozensetÚ#_QUOTE_MASKED_HARDLINE_DESCRIPTIONSry   rH   r!   rö  r6   Ú_SHELL_NAMES_RErq  r)   r8   r=   Útupler@   rP   ÚDANGEROUS_PATTERNSrŠ  r‹  Ú_REMOVED_PATTERN_KEY_ALIASESrV   r‰   râ  Ú__annotations__ro   rÉ  ÚitemsÚ_canonical_keyÚ_legacy_keyÚ
setdefaultÚupdateÚ_old_branch_keyr3  r\   r?   rp   Ú_PATH_TOKEN_STOPrz   Ú	lru_cacher|   rŽ   rh   rg   r  r   r  rI  rJ  Ú_SUDO_OPTIONS_WITH_ARGrH  rG  rK  r4  rF  rÁ  rÕ  rÖ  rí  rî  rï  r�  rŸ  rá  rã  rp  rq  rs  rC   rF   rŒ  rB   rŠ  ry  r�  r±  r·  rD   rÂ  rÌ  r›  rÜ  rç  ró  rú  rý  r7   r  r  r  r  r  r"  r%  r   r  r6  r<  rE   r>  r'   rV  rb  rd  ri  rG   r„  rˆ  rŽ  )r€   r_  s   00r
   ú<module>r¹     s  ðòó Û Û 	Û 	Û Û Û à	ˆ×	Ñ	Ð+Ó	,€ð
 >Ð àgð ð oð ð SÐ ØJÐ Øc€ØTÐ ð ?Ð Ø"Ð#=Ð">¸aÐ@Ð à
ÐÐ
˜yÐ)<Ð(=¸QÐ?OÐ>PÐPQÐReÐQfÐfgØÐ˜Ð+Ð,¨Að/ð ð #&Ð&9Ð%:¸!¸OÐ;LÈAÐN_ÐM`Ð`aÐbÐ Ø%(Ð):Ð(;¸1Ð=QÐ<RÐRSÐ"TÐ ð ,€ð /Ð ð1ð òA ð A¨3ð AÈó Að
aÐ ð Ð1Ñ1€à2€	ð Ñ(Ð)OÓPÑPÐRwÐxØÑ(Ð)>Ó?Ñ?ÐAgÐhØÑ(Ð)IÓJÑJÐLpÐqð Ð&Ñ&Ð(BÐCð ÐIÑIÐKcÐdð XØ>ð Ð*Ñ*Ð,@ÐAØÐ3Ñ3Ð5MÐNØÐÑÐ!=Ð>ØÐ<Ñ<Ð>YÐZØÐ"Ñ"Ð$CÐDðA!Ð ðJ �M‰M˜BŸI™IÑ%€	á&/Ð1OÐQ\Ð0]Ó&^Ð #àXi÷ÙPTÐPQÐST€Z€R‡Z�Z��9Ó˜q !Ð'JÐ"JÒKóÐ ñ
 !Ò!\Ó]Ð ð
 4€Ø—(‘(˜<Ó(€ð Sð ¨Tó ð ð ¨ó ð$ �—‘ÐHÈ"Ï-É-ÓX€ð Sð ¨Uó ð Sð ¨Uó ð:qØ5ðqà,ðqð >ðqð0ðqð  eð!qð& ið'qð( rð)qð6 gð7qð: qð;qð> ^ð?qð@ NðAqðD HðEqðF XðGqðJ @ðKqðL 2ðMqðN 6ðOqðP BðQqðR 8ðSqðV DðWqðX NðYqð\ Zð]qð^ Að_qð` Oðaqðd Dðeqðf gðgqðj Vðkqðl Hðmqðp Pðqqðr lðsqðv fðwqðx pðyqðz Að{qð| Pð}qðB ˆyÑÐ-Ð.ðCqðD ˆ}Ñ˜kÐ*ðEqðF .ðGqðH 1ðIqðN JðOqðP 4ðQqðR 	Ð Ð!Ð"Ð$=Ð>ðSqðT aðUqðV 2ðWqðX 0ðYqð^ ^ð_qð` dðaqðb Oðcqðd ?ðeqðj 	.¨oÐ->¸lÐKÐMkÐlðkqðl 	ˆoÐÐ=Ð>Ð@pÐqðmqðp yðqqðD>ðEqðP 	DÀOÐCTÐTWÐXð  [Yð  ZðQqðT 	! Ð 1°Ð5Ð7yÐzðUqðX 	0°Ð/@ÀÐDð  GKð  LðYqðZ 	FÀoÐEVÐVYÐZØKðMð[qð^ 	Ð/Ð0Ð1Ð3RÐSð_qð` 	Ð,Ð-Ð.Ð0WÐXðaqðb 	Ð7Ð8¸Ð?UÐ>VÐWÐYð  Aðcqðd 	Ð4Ð5°VÐ<RÐ;SÐTð  WEð  Fðeqðf -ðgqðj Jðkqðx ÐzÑzØ=ð?ðyqð| -ð}qðBJðCqðJ AðKqðL WðMqðX {ðYqðZ Ið[qð\ hð]qð^ cð_qð` yðaqðb `ðcqðj cðkqðl zðmqðp Oðqqðr uðsqðv mðwqð| gð}qð~ mðqðL ~ðMqðN 	 Ð 3Ð4Ð5Ð7_Ð`ðOqðP 	&Ð&EÐ%FÀfÈ]ÈOÐ\ð  _Bð  CðQqðf 	&Ð&=Ð%>¸oÈmÈ_Ð]ð  `\ð  ]ðgqðl 	Ð:Ð;¸:ÐFð  IBð  Cðmqðn 	"Ð">Ð!?¸zÐJð  MRð  Sðoqðp 	3Ð3OÐ2PÐPZÐ[ð  ^cð  dðqqðr 	Ð0Ð1Ð2Ð4TÐUðsqðt 	!Ð!4Ð 5Ð6Ð8dÐeðuqð~ 	Ð1Ð2°!Ð4DÐ3EÀQÐGÐImÐnðqð@ 	"Ð"5Ð!6°aÐ8HÐ7IÈÐKÐM}Ð~ðAqðL 	3Ð3FÐ2GÀqÐIYÐHZÐZ[Ð\ð  _Oð  PðMqðR 	ˆoÐ˜fÐ%Ð'DÐEðSqðZ dð[qð\ Tð]qð^ Uð_qð` Tðaqðl @ðmqðr {ðsqðt Hðuqðx SðyqðF |ðGqðJ bðKqðX ˆyÑ˜9Ñ$Ð'OÑOÐQlÐmðYqðZ ˆzÑ˜IÑ%Ð(GÑGÐIdÐeð[qð\ ˆzÑ˜IÑ%Ð(OÑOÐQlÐmð]qð^ ˆÑ Ñ*¨^Ñ;Ð=XÐYð_qð` ˆzÑ˜IÑ%Ð(DÑDÐFaÐbðaqÐ ðh J\×\ÁÀÀA 
 §
¡
¨1¨iÓ 8¸!Ò<Ó\Ð ñ (1Ø<ØGð2ó (Ð $ð (SØ$Hñ Ð ð -/Ð �d˜3  C¡˜=Ñ)Ó .àAS÷$Ù9=¸¸A€Q˜U a™Zˆ�‰�‹�qÒ¨Q¨s°¨VÒ4ó$áÐ	%×	+Ñ	+Ó	-Ó.ñ$/ò ^Ñ€N�Kð ×#Ñ# N±C³EÓ:×AÑAÀ>ÐS^ÐB_Ô`Ø×#Ñ# K±³Ó7×>Ñ>ÀÈ^Ð?\Õ]ð	^ð '€Ø × Ñ Ð 9¹3»5Ó A× EÑ EÀoÔ VØ × Ñ  ±³Ó 7× ;Ñ ;Ð<UÔ Vð@ sð @¨s°3©xó @ð=¨cð =°có =ð._ Sð _¨Só _ð 'Ð Ø&Ð)9Ñ9¸HÑD€
ð €×Ñ˜RÔ ð
a #ò 
aó !ð
að ð ¸#ð À#ó ð4¨ð 4°ó 4ð	<¨3ð 	<°3ó 	<ð #˜Ÿ
™
Ð#RÓSÐ Ø�B—J‘JÐEÓFÐ Ø%˜2Ÿ:™:Ð&AÓBÐ Ø�R—Z‘ZÐ <Ó=Ð ò^Ð ârÐ ð ˜<Ð(Ø"ÚVØˆF˜T >Ð2Ú0Ú7ÚBÚ4ñ	%Ð !ð �dˆ| d¨G _Ú0¸dÀG¸_ñ*Ð &ð /0¸ÀqÐUVÑ#WÐ  ÚXÐ Ø"˜Ÿ
™
Ð#LÓMÐ áñ ð Tô ó Ð ð ˆfÒ?È$ÐPXÐIYÐdhÐciØˆ6Ò!BØ�(ÐÒ%=òÐ ó 6ó9ã0Ó:^ÛóUó
 IÑSWÑYfÐRgòÐ ñ "Ð"©7Ñ4DÐ*EÉiÈ[Û,òÐ óóóóò#$Ð  ñ0 Ñ$Ó
%©y¹Ó/AÉ)ÑTbÓJcÙ
‘GÓ
ò%Ð !óÐ ó  HÐ ÛLÐ Ù&Ñ'DÓEÐ Ù[qÑ XÐ Ð?ÐAXÙ;Ð ÙTÐ Ù(sÐ %ð	S¨Cð 	S°Dô 	Sñ" ñ "¨ð "°°d±
ô "ñA cñ A°#ô AðH;¨ð ;°°d¸5ÀÀcÀ¹?Ñ6KÈTÐ6QÑ0Rô ;ð|/�Sð / Cô /ð`¨#ð `°%¸¸T¸	Ñ2Bô `ñh Cð h¨C°$©Jô hñ
	 3ñ 	¨sð 	°t¸C±yÀ4Ñ7Gô 	ð	¨Cô 	ñ 3ñ ¨d°3©ið ¸CÀ$¹Jô ñD˜T #™Yð ¨5°°s¸T±zÐ1AÑ+Bô ñ6˜sñ ¨$¨s©)ð ¸¸cÀ3¸h¹È$Ñ8Nô ðDn cô nð< Cñ ¨cð °cô ñ.ÑSUÙ#¹uÑ]bÙ!&ô.�cñ . #ñ .°°d±
ñ .ÈSñ .Øñ.Ø8<ñ.ØVZñ.àô.ðb Cñ °ð ¸¸d¹
ô ð* ñ *¨Cð *°C¸$±Jô *ð,˜cñ ,¨ð ,°°c¸3À°mÑ0Dô ,ñ°ð ¸¸t¹ô ñ*°ð ¸ô ñM¨3ð M°3ô Mñ 3ð ¨3ô ñ°ð ¸ô ðJ Sñ J°ð J¸ô Jð
"¨ô "òJW #ñ W¨sð W¸cô Wð
@ 3ð 
@¨3ô 
@ð¨ñ °Cñ ¸cð Àcô ð,+H¨Cô +Hð\& Cñ &°ð &¸ô &ñ7˜sð 7 t¨C¡y°4Ñ'7ô 7ñt˜t C™yð ¨S°4©Zô ð*)( Cô )(ðXM¨ô Mð`¨sð °tô ð$7°sð 7¸tô 7ð( cð ¨eõ ùóY+ùóJ
 ]ùó $s   Ä"`Ì?`Î)`"