§
    ¬	Êji¢  ã                  ó  — U d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZmZmZmZ g d¢ZdZdZd	Zd
ZdddddgdœZded<    G d„ de¦  «        ZdddœdXd„ZdYd„ZdZd[d„Zd\d „Zd]d^d$„Zd%Zd_d)„Zd`d,„Z dZdad-„Z!d.Z"d/Z#dbd1„Z$dcd2„Z%ddd5„Z&ded7„Z'd8Z(dfd;„Z)dgd?„Z*e
ee+         ege,f         Z-	 dZdddddd@œdhdG„Z.didN„Z/dOZ0djdQ„Z1dkdR„Z2dldS„Z3dZddTœdmdU„Z4e5dVk    r! e6 e.ej7        dWd…         ¦  «        ¦  «        ‚dS )naÉ  The pre-push policy, once, for every repository that pins this package.

Written for three repositories - `invisible_core`, `invisible_playwright` and
`invisible_firefox`. The last was deleted on 2026-08-18; the design and the
history below are unchanged by that, because the module was already indifferent
to how many repositories use it - see WHY HERE below.

WHY. The three `.githooks/pre-push` files were 743 lines of shell between them,
and 207 of 211 comparable lines were byte-identical between two of them.
Measured 2026-07-27: eleven behavioural differences separated the three, and
nine were accidental - the signature of copy-paste, where each fix lands in
whichever file happened to be open:

  * `invisible_core` ran no pytest at all, so the one repository the other two
    depend on was the only one where "never push red" was not enforced. It is
    also the repository that pushed red (56b2af2, fourteen tests red on main for
    two hours). CLAUDE.md hard rule 3 names this hook as the thing that stops
    exactly that;
  * `NAME_SKIPPED` was assigned in three places in the core's hook and read in
    none, because the closing summary that reads it only exists in the other two;
  * the core resolved an interpreter into `$python_bin` and then the pasted
    name-scan block called bare `python` anyway;
  * three different ways of locating the same two workbench scripts;
  * the core asked PyPI over curl whether a version existed, which answers a
    weaker question than the gate's own `--verify-index` (present on the index
    versus present AND byte-identical) and answers it with a second source of
    truth.

Two differences were real and are preserved as configuration - whether pytest
runs is NOT one of them, see below - and the rest are now one implementation.

WHY HERE. Same reason `invisible_core.release` lives here: every consumer pins
this package exactly, so a module in it is reachable from all of them, whereas a
script in one repository is reachable from one. That asymmetry is what left the
consumers with no publish gate when 0.4.4 went out built from the wrong tree.

WHAT EACH REPOSITORY DECLARES, in its own pyproject under
`[tool.invisible.hooks]`:

    pytest       = true|false     run the suite before pushing
    pin          = true|false     compare the invisible-core pin (consumers)
    english      = true|false     refuse Italian prose in a public repository
    identity     = true|false     refuse author/committer/tagger addresses that
                                  are not GitHub noreply ones (default true)
    release_tags = ["v"]          tag prefixes that mean "this is a release"

The block is REQUIRED. A missing one is a refusal rather than a default,
because a default here is a policy nobody chose: the wrong one silently skips a
gate, and a skipped gate reads exactly like a passed gate.

THE ONE DELIBERATE BEHAVIOUR CHANGE. `pytest = true` in the core, which
previously ran none. Everything else below preserves what the three hooks
already did, including the two decisions that look inconsistent and are not:

  * a missing PIN checker REFUSES, while a missing NAME word list carries on
    with a warning. The pin checker is a maintainer tool that must be beside
    this checkout and its absence means the workbench moved; the word list
    deliberately lives outside every public repo, so demanding it would leave
    every clone red by default, which is how gates get switched off.

STDIN. git feeds the refs being pushed on stdin, one line per ref, and it can be
read exactly once. Two gates need it, and a `while read` in the first of them
starved the second silently for a day - the scan reported "no commit messages
scanned" on every push, correctly, and with no coverage. It is read once, here.
é    )ÚannotationsN)ÚPath)ÚCallableÚDictÚListÚOptionalÚSequenceÚTuple)	ÚmainÚhook_configÚrelease_tag_inÚ
push_rangeÚforeign_identitiesÚoutside_the_hookÚHOOK_LOCATION_VARIABLESÚGATE_NOTHING_TO_DOÚHookConfigErroré   zsync_core_pin.pyzcheck_forbidden_names.pyzcheck_internal_disclosure.pyTÚv)ÚpytestÚpinÚenglishÚidentityÚrelease_tagsúDict[str, object]Ú	_DEFAULTSc                  ó   — e Zd ZdZdS )r   zEThe repository did not declare a hook policy, so none can be applied.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úDC:\Projects\Muse2API\.venv\Lib\site-packages\invisible_core/hooks.pyr   r   u   s   € € € € € ØOÐOÐOÐOr#   r   F)ÚerrÚoutÚmsgÚstrr%   ÚboolÚreturnÚNonec               ól   — |�|n|rt           j        nt           j        }t          d| › �|d¬¦  «         d S )Nz[pre-push] T)ÚfileÚflush)ÚsysÚstderrÚstdoutÚprint)r'   r%   r&   Ústreams       r$   Ú_sayr4   y   s@   € Ø�OˆSˆS¸Ð*K­#¬*¨*ÅÄ€FÝ	Ð
˜Ð
Ð
 F°$Ð7Ñ7Ô7Ð7Ð7Ð7r#   Úrootr   c           
     ó\  — t          | ¦  «        dz  }	 |                     d¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   nL# t          $ r}t          d|› �¦  «        |‚d}~wt          j        $ r}t          |› d|› �¦  «        |‚d}~ww xY w|                     di ¦  «                             di ¦  «                             d¦  «        }|€t          |› d	�¦  «        ‚t          d
„ |D ¦   «         ¦  «        }|rNt          dd 	                    |¦  «        › dd 	                    t          t          ¦  «        ¦  «        › d�¦  «        ‚t          t          ¦  «        }|                     |¦  «         t          |d         t          ¦  «        r|d         g|d<   |S )a  `[tool.invisible.hooks]` from the repo's pyproject.

    Raises rather than defaulting when the block is missing: see the module
    docstring. Individual keys DO default, so adding a gate later does not
    require touching every repo's pyproject before the first push can happen.
    zpyproject.tomlÚrbNzno pyproject.toml at z does not parse: ÚtoolÚ	invisibleÚhooksa-   has no [tool.invisible.hooks] block, so this hook does not know which gates this repository wants. Declare it - pytest / pin / english / identity / release_tags - rather than letting a default decide, because the wrong default silently skips a gate and a skipped gate reads exactly like a passed one.c              3  ó,   K  — | ]}|t           v¯|V — Œd S ©N)r   )Ú.0Úks     r$   ú	<genexpr>zhook_config.<locals>.<genexpr>—   s,   è è € Ð?Ð?˜1¨AµYÐ,>Ð,>�QÐ,>Ð,>Ð,>Ð,>Ð?Ð?r#   z [tool.invisible.hooks] declares ú, z#, which nothing reads. Known keys: zB. A misspelt key is a gate whose author believes it is configured.r   )r   ÚopenÚtomllibÚloadÚFileNotFoundErrorr   ÚTOMLDecodeErrorÚgetÚsortedÚjoinr   ÚdictÚupdateÚ
isinstancer(   )r5   Ú	pyprojectÚfhÚdataÚexcÚdeclaredÚunknownÚcfgs           r$   r   r   ~   s6  € õ �T‘
”
Ð-Ñ-€IðMØ�^Š^˜DÑ!Ô!ð 	$ RÝ”< Ñ#Ô#ˆDð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$øøåð Lð Lð LÝÐA°iÐAÐAÑBÔBÈÐKøøøøÝÔ"ð Mð Mð MÝ ÐBÐB¸SÐBÐBÑCÔCÈÐLøøøøðMøøøð �xŠx˜ Ñ#Ô#×'Ò'¨°RÑ8Ô8×<Ò<¸WÑEÔE€HØÐÝØð =ð =ð =ñ>ô >ð 	>õ Ð?Ð? Ð?Ñ?Ô?Ñ?Ô?€GØð 	Oõ ðN¨t¯yªy¸Ñ/AÔ/Að Nð NØ*.¯)ª)µF½9Ñ4EÔ4EÑ*FÔ*FðNð Nð NñOô Oð 	Oõ
 �y‰/Œ/€CØ‡J‚JˆxÑÔÐÝ�#�nÔ%¥sÑ+Ô+ð 4Ø" >Ô2Ð3ˆˆNÑØ€JsE   ”A ©A
¾A Á
AÁA ÁAÁA Á
BÁ A3Á3BÂBÂBc                óž   — | �| nt           j        }	 |�|                     ¦   «         rdS |                     ¦   «         S # t          $ r Y dS w xY w)z¢The refs git is pushing, or "" when the hook is run by hand.

    Guarded on a tty so invoking it manually does not hang on input that will
    never arrive.
    NÚ )r/   ÚstdinÚisattyÚreadÚ	Exception)rU   r3   s     r$   Úread_push_refsrY   ª   s_   € ð Ð'ˆUˆU­S¬Y€FðØˆ>˜VŸ]š]™_œ_ˆ>Ø�2Ø�{Š{‰}Œ}ÐøÝð ð ð Øˆrˆrðøøøs   ’> ª> ¾
AÁAÚ	push_refsc              #  óâ   K  — |                       ¦   «         D ]W}|                     ¦   «         }t          |¦  «        dk     rŒ*|dd…         \  }}}}|rt          |¦  «        dhk    rŒP|||fV — ŒXdS )zÑ(local_sha, remote_ref, remote_sha) per pushed ref, deletions dropped.

    An all-zero LOCAL sha is a branch or tag deletion: it pushes no content, so
    there is nothing to scan and nothing to publish.
    é   NÚ0)Ú
splitlinesÚsplitÚlenÚset)rZ   ÚlineÚpartsÚ
_local_refÚ	local_shaÚ
remote_refÚ
remote_shas          r$   Ú
_ref_linesrh   ¹   s•   è è € ð ×$Ò$Ñ&Ô&ð 0ð 0ˆØ—
’
‘”ˆÝˆu‰:Œ:˜Š>ˆ>ØØ8=¸b¸q¸b¼	Ñ5ˆ
�I˜z¨:Øð 	�˜Y™œ¨C¨5Ò0Ð0ØØ˜ ZÐ/Ð/Ð/Ð/Ð/ð0ð 0r#   ©r   ÚprefixesúSequence[str]c                óx   — t          | ¦  «        D ])\  }}}|D ] }|                     d|› �¦  «        r|c c S Œ!Œ*dS )z*The first release tag being pushed, or "".ú
refs/tags/rT   )rh   Ú
startswith)rZ   rj   Ú
_local_sharf   Ú_remote_shaÚprefixs         r$   r   r   É   sq   € å/9¸)Ñ/DÔ/Dð "ð "Ñ+ˆ
�J Øð 	"ð 	"ˆFØ×$Ò$Ð%:°&Ð%:Ð%:Ñ;Ô;ð "Ø!Ð!Ð!Ð!Ð!Ð!ð"ð	"ð ˆ2r#   Ú(4b825dc642cb6eb9a060e54bf8d69288fbee4904ÚrevÚrepoúOptional[Path]c           	     óž   — |€dS 	 t          j        ddt          |¦  «        ddd| gddd¬¦  «        }n# t          $ r Y dS w xY w|j        d	k    S )
NFÚgitú-Cú	rev-parsez--verifyz--quietT©Úcapture_outputÚtextÚcheckr   )Ú
subprocessÚrunr(   rD   Ú
returncode)rs   rt   r&   s      r$   Ú_revision_existsr�   Ø   sy   € Ø€|ØˆuðÝŒnØ�D�#˜d™)œ) [°*¸iÈÐMØ d°%ð9ñ 9ô 9ˆˆøõ ð ð ð ØˆuˆuðøøøàŒ>˜QÒÐs   †,3 ³
AÁ Are   Úlistc           	     óâ   — |€g S 	 t          j        ddt          |¦  «        d| ddgddd¬	¦  «        }n# t          $ r g cY S w xY w|j        rg S d
„ |j                             ¦   «         D ¦   «         S )z>The commits reachable from `local_sha` that no remote has yet.Nrw   rx   úrev-listz--notz	--remotesTFrz   c                ó   — g | ]}|¯|‘ŒS r"   r"   )r=   Úrs     r$   ú
<listcomp>z,_commits_not_on_a_remote.<locals>.<listcomp>ð   s   € Ð/Ð/Ð/�!¨QÐ/ˆAÐ/Ð/Ð/r#   )r~   r   r(   rD   r€   r1   r_   )re   rt   r&   s      r$   Ú_commits_not_on_a_remoterˆ   ä   sŸ   € à€|Øˆ	ðÝŒnØ�D�#˜d™)œ) Z°¸GÀ[ÐQØ d°%ð9ñ 9ô 9ˆˆøõ ð ð ð Øˆ	ˆ	ˆ	ðøøøà
„~ð Øˆ	Ø/Ð/�s”z×'Ò'Ñ)Ô)Ð/Ñ/Ô/Ð/s   †,3 ³AÁAc                óü   — t          | ¦  «        D ]k\  }}}|r[t          |¦  «        dhk    rGt          ||¦  «        }|s dS |d         }t          |› d�|¦  «        r	|› d|› �c S t          › d|› �c S |› d|› �c S dS )a¢  UN intervallo di revisioni valido per `git diff` e `git rev-list`, o "".

    The return value is always ONE token, and that is the point.

    It used to return `f"{local_sha} --not --remotes"` when the remote had never
    seen the ref: three tokens in a single string. Whoever received it had to
    guess whether to split it, and the two consumers guessed differently - the
    name scanner survived, while the disclosure gate handed it to `git diff` as a
    single revision and got `fatal: bad revision`. The hook then REFUSED the
    push, correctly but for a fault of its own: measured 2026-08-11 pushing the
    tag v18.14.0, and the consequence was that a release could not start.

    The case that triggered it is the ordinary one for a tag: the ref is new on
    the remote (remote sha all zeroes) while the COMMITS are already published.
    The right answer there is not a strange range, it is "there is nothing new to
    read", and that is said with "".

    `repo` is there so this can ask git instead of deducing. Without it the
    function behaves as it did for the ordinary case and invents nothing: a range
    it cannot verify is a range it does not return.
    r]   rT   éÿÿÿÿú^z^..ú..)rh   ra   rˆ   r�   Ú_EMPTY_TREE)rZ   rt   re   Ú_remote_refrg   ÚnuoviÚpiu_vecchios          r$   r   r   ó   sÓ   € õ, /9¸Ñ.CÔ.Cð ,ð ,Ñ*ˆ	�; 
Øð 	1�#˜j™/œ/¨c¨UÒ2Ð2Ý,¨Y¸Ñ=Ô=ˆEØð Ø�r�rØ œ)ˆKÝ ;Ð 1Ð 1Ð 1°4Ñ8Ô8ð 6Ø%Ð5Ð5¨)Ð5Ð5Ð5Ð5Ð5õ "Ð0Ð0 YÐ0Ð0Ð0Ð0Ð0ØÐ+Ð+ 	Ð+Ð+Ð+Ð+Ð+Øˆ2r#   z@users.noreply.github.comznoreply@github.comÚemailc                óL   — |                       t          ¦  «        p
| t          k    S r<   )ÚendswithÚ_PUBLIC_EMAIL_SUFFIXÚ_GITHUB_WEB_FLOW)r‘   s    r$   Ú
_is_publicr–   +  s    € Ø�>Š>Õ.Ñ/Ô/ÐL°5Õ<LÒ3LÐLr#   c                óF   — |                       d¦  «        \  }}}|rd|z   ndS )zFThe address with its local part hidden, so a refusal is safe to paste.ú@z***@z***)Ú	partition)r‘   Ú_localÚatÚdomains       r$   Ú_maskedr�   /  s-   € àŸš¨Ñ-Ô-Ñ€FˆB�Ø "Ð-ˆF�V‰OˆO¨Ð-r#   ÚargsúOptional[str]c                ó¤   — 	 t          j        ddt          | ¦  «        g|¢ddd¬¦  «        }n# t          $ r Y d S w xY w|j        dk    r|j        nd S )Nrw   rx   TFrz   r   )r~   r   r(   rD   r€   r1   )rt   rž   r&   s      r$   Ú_git_outr¡   5  sw   € ðÝŒn˜e T­3¨t©9¬9Ð<°tÐ<Ø,0°tÀ5ðJñ Jô Jˆˆøåð ð ð Øˆtˆtðøøøàœ¨1Ò,Ð,ˆ3Œ:ˆ:°$Ð6s   ‚*- ­
;º;úList[Tuple[str, str, str]]c           
     ó6  — g }t          ¦   «         }t          | ¦  «        D �]÷\  }}}|r%t          |¦  «        dhk    rt          ||¦  «        }n,t          |d|› d|› �¦  «        }|pd                     ¦   «         }|D ]­}	|	|v rŒ|                     |	¦  «         t          |ddd|	¦  «        pd}
|
                     ¦   «                              t          d¦  «        ¦  «        \  }}}d	|fd
|ffD ];\  }}|r4t          |¦  «        s%| 
                    |	|t          |¦  «        f¦  «         Œ<Œ®|                     d¦  «        rØt          |dd|¦  «        pd                     ¦   «         dk    r®t          |dd|¦  «        pd}|                     ¦   «         D ]…}|                     d¦  «        sŒ|                     d¦  «        d                              d¦  «        d         }|r7t          |¦  «        s(| 
                    |d|z   t          |¦  «        f¦  «         Œ†�Œù|S )uÕ  Every (sha, role, masked address) in this push that is not a noreply one.

    â›” EVERY PUSHED REF, and each one's whole new range - not `push_range`, which
    answers for the first ref only because the scanners need one range to read.
    One branch clean and a tag behind it carrying a foreign committer is still a
    leak.

    â›” THE COMMITTER TOO, not only the author. Measured 2026-09-24: four commits
    reached a public `main` with a noreply AUTHOR and a private COMMITTER,
    because they were made from a clone outside the directory where the
    maintainer identity is configured; everything that looked at the author saw
    nothing wrong. An annotated tag's TAGGER is the third place an address lives.
    r]   r„   rŒ   rT   Úlogz-1z--format=%ae%x1f%ceé   ÚauthorÚ	committerrm   zcat-filez-tÚtagz-pztagger ú<é   ú>r   z
tagger of )ra   rh   rˆ   r¡   r_   ÚaddÚstripr™   Úchrr–   Úappendr�   rn   r^   )rZ   rt   ÚfoundÚseenre   rf   rg   ÚcommitsÚlistedÚsharb   r¦   Ú_sepr§   Úroler‘   ÚbodyÚtag_lines                     r$   r   r   >  s]  € ð )+€EÝ‘”€DÝ-7¸	Ñ-BÔ-Bð Yñ YÑ)ˆ	�:˜zØð 	-�#˜j™/œ/¨c¨UÒ2Ð2Ý.¨y¸$Ñ?Ô?ˆGˆGå˜d J°:Ð0LÐ0LÀÐ0LÐ0LÑMÔMˆFØ�| ×*Ò*Ñ,Ô,ˆGØð 
	>ð 
	>ˆCØ�dˆ{ˆ{ØØ�HŠH�S‰MŒMˆMÝ˜D %¨Ð/DÀcÑJÔJÐPÈbˆDð '+§j¢j¡l¤l×&<Ò&<½SÀ¹Y¼YÑ&GÔ&GÑ#ˆF�D˜)Ø!)¨6Ð 2°[À)Ð4LÐMð >ð >‘��eØð >¥¨EÑ!2Ô!2ð >Ø—L’L # t­W°U©^¬^Ð!<Ñ=Ô=Ð=øð>ð × Ò  Ñ.Ô.ð 	YÝ˜$ 
¨D°)Ñ<Ô<ÐBÀ×IÒIÑKÔKÈuÒTÐTÝ˜D *¨d°IÑ>Ô>ÐDÀ"ˆDØ ŸOšOÑ-Ô-ð Yð Y�Ø×*Ò*¨9Ñ5Ô5ð ØØ ×*Ò*¨3Ñ/Ô/°Ô2×<Ò<¸SÑAÔAÀ!ÔD�Øð Y¥¨EÑ!2Ô!2ð YØ—L’L )¨\¸JÑ-FÍÐPUÉÌÐ!WÑXÔXÐXøùØ€Lr#   )ÚGIT_DIRÚGIT_WORK_TREEÚGIT_INDEX_FILEÚGIT_COMMON_DIRÚGIT_OBJECT_DIRECTORYÚ GIT_ALTERNATE_OBJECT_DIRECTORIESÚ
GIT_PREFIXÚGIT_NAMESPACEÚenvúDict[str, str]c                ó>   — d„ |                       ¦   «         D ¦   «         S )zß`env` without the variables that tie a process to the hook's repository.

    What a gate the hook launches is given, so that its git calls address the
    repositories IT names and never the one git named to the hook.
    c                ó,   — i | ]\  }}|t           v¯||“ŒS r"   )r   )r=   r>   r   s      r$   ú
<dictcomp>z$outside_the_hook.<locals>.<dictcomp>€  s)   € ÐMÐMÐM‘T�Q˜¨AÕ5LÐ,LÐ,LˆAˆqÐ,LÐ,LÐ,Lr#   )Úitems)rÁ   s    r$   r   r   z  s!   € ð NÐM˜SŸYšY™[œ[ÐMÑMÔMÐMr#   ÚcmdÚcwdÚintc           	     óÚ   — 	 t          j        t          | ¦  «        t          |¦  «        t	          t          t          j        ¦  «        ¦  «        ¬¦  «        j        S # t          $ r Y dS w xY w)N)rÈ   rÁ   é   )
r~   r   r‚   r(   r   rI   ÚosÚenvironr€   rD   )rÇ   rÈ   s     r$   Ú_subprocess_runrÎ   ƒ  sn   € ðÝŒ~�d 3™iœi­S°©X¬XÝ"2µ4½¼
Ñ3CÔ3CÑ"DÔ"DðFñ Fô FÜFPð	Qøåð ð ð Øˆsˆsðøøøs   ‚AA Á
A*Á)A*)r5   rZ   r   rÁ   ÚpythonÚargvúOptional[Sequence[str]]r   úOptional[Runner]úOptional[Dict[str, str]]rÏ   c               óÌ  — t          |�|nt          j        ¦   «         ¦  «                             ¦   «         }t	          |€t          j        n|¦  «        }|pt          }|p |                     d¦  «        pt          j	        }|€t          ¦   «         n|}	 t          |¦  «        }n,# t          $ r}	t          d|	› �d¬¦  «         Y d}	~	dS d}	~	ww xY wg }
g }|j        j        dz  }|d         rjt          d	¦  «          ||d
dddg|¦  «        r5t          dd¬¦  «         t          dd¬¦  «         t          dd¬¦  «         dS |
                     d¦  «         |d         �r |                     d¦  «        }|dk    r%t          d¦  «         |                     d¦  «         nÀ|rt          |¦  «        n	|t           z  }|                     ¦   «         s]t          dd¬¦  «         t          dd¬¦  «         t          d|› �d¬¦  «         t          d|› �d¬¦  «         t          dd¬¦  «         dS t%          |d|||dgdd|› �¬¦  «        }|r|S |
                     d¦  «         |                     d¦  «        }|dk    r&t          d¦  «         |                     d¦  «         �n>|rt          |¦  «        n	|t&          z  }|r]|                     ¦   «         sIt          dd¬¦  «         t          d d¬¦  «         t          d|› �d¬¦  «         t          d!d¬¦  «         dS |                     ¦   «         s4t          d"¦  «         t          d#¦  «         |                     d¦  «         n|t)          ||¦  «        }|rt          d$|› d%�¦  «         nt          d&¦  «         t          d'¦  «         t%          |d(||||rd)d*|gnd)gdd+¬¦  «        }|r|S |
                     d,¦  «         |                     d-¦  «        }|dk    r&t          d.¦  «         |                     d/¦  «         �n
|rt          |¦  «        n	|t*          z  }|r]|                     ¦   «         sIt          dd¬¦  «         t          d0d¬¦  «         t          d|› �d¬¦  «         t          d1d¬¦  «         dS |                     ¦   «         s4t          d2¦  «         t          d#¦  «         |                     d/¦  «         nHt)          ||¦  «        }t%          |d3||||rd)d*|gnd)gdd4¬¦  «        }|r|S |
                     d5¦  «         |                     d6¦  «        }|d7         s|                     d8¦  «         �n|dk    r%t          d9¦  «         |                     d8¦  «         nídd:lm} 	 |                     d;t3          |¦  «        g¦  «        }nu# t4          $ r0}t          dd¬¦  «         t          d<|› �d¬¦  «         Y d}~dS d}~wt6          $ r0}	t          dd¬¦  «         t          d=|	› �d¬¦  «         Y d}	~	dS d}	~	ww xY w|r5t          dd¬¦  «         t          d>d¬¦  «         t          d?d¬¦  «         dS |
                     d8¦  «         |                     d@¦  «        }|dA         s|                     dA¦  «         �n,|dk    r&t          dB¦  «         |                     dA¦  «         �n |                     ¦   «         s%t          dC¦  «         |                     dA¦  «         nÇt;          ||¦  «        }|r t          dd¬¦  «         t          dDd¬¦  «         |ddE…         D ](\  }}}t          dF|ddG…         › dH|› dI|› �d¬¦  «         Œ)t=          |¦  «        dEk    r%t          dJt=          |¦  «        dEz
  › dK�d¬¦  «         t          dLd¬¦  «         dS |
                     dA¦  «         t?          ||dM         ¦  «        }|r²t          |› dN�¦  «          ||d
dOdPt3          |¦  «        dQdRg|¦  «        }|t@          k    r%t          dS¦  «         |
                     dT¦  «         nP|r9t          dd¬¦  «         t          dU|› dV�d¬¦  «         t          dWd¬¦  «         dS |
                     dX¦  «         t          dY|
rdZ !                    |
¦  «        nd[z   |rd\dZ !                    |¦  «        › d]�ndz   ¦  «         d^S )_a-  Run the whole pre-push policy. 0 lets the push through, 1 refuses.

    Every collaborator is injectable so the policy can be exercised without
    spawning a test suite or touching a network - the gates that were only ever
    observed printing PASS are the ones that turned out not to be gates.
    NÚINVISIBLE_GATE_PYTHONú
REFUSED - T©r%   é   Úscriptsr   z%running the test suite before push...z-mz-qz
--tb=shortrT   zTESTS FAILED - push aborted.z{Fix the failure, or `git push --no-verify` if you really know what you are doing (NEVER for a branch that feeds a release).Útestsr   ÚINVISIBLE_PIN_CHECKÚskipzÚWARNING: INVISIBLE_PIN_CHECK=skip. The invisible-core pin was NOT compared against the core. If it is stale, every install of this package resolves a core it was never tested against, and nothing downstream can see it.zpin gatez7REFUSED - the invisible-core pin gate is not reachable.z  looked for: z  from:       zÊThe workbench moved, or this is a clone at another depth. Point INVISIBLE_PIN_CHECK at sync_core_pin.py, or push with INVISIBLE_PIN_CHECK=skip to state on the record that the pin is going out unchecked.ú--checkzDthe invisible-core pin does not match the core. Fix it with: python )rž   Úrequire_testsÚfail_msgÚINVISIBLE_NAME_CHECKzèWARNING: INVISIBLE_NAME_CHECK=skip. Nothing checked this push for vendor or target-site names. If one is in the diff it is public the moment this lands, and a force-push does not remove it - GitHub keeps the object reachable by SHA.z	name scanz<REFUSED - INVISIBLE_NAME_CHECK is set but points at nothing.zlFix the path, or set INVISIBLE_NAME_CHECK=skip to state on the record that this push is going out unscanned.z?no forbidden-name word list here, so nothing scanned this push.z=(that scan is a maintainer gate; it lives outside this repo.)z(scanning files + the commit messages in z ...z+scanning files for names we do not publish.zrNOTE: no push range on stdin, so COMMIT MESSAGES were not scanned. A message cannot be reworded once it is pushed.zname scannerú.z--rangez[see above. The offending files are named; the tokens are not, so this log is safe to paste.ÚnamesÚINVISIBLE_DISCLOSURE_CHECKz}WARNING: INVISIBLE_DISCLOSURE_CHECK=skip. Nothing checked this push for internal symbols, engine source lines or local paths.zdisclosure scanzBREFUSED - INVISIBLE_DISCLOSURE_CHECK is set but points at nothing.zrFix the path, or set INVISIBLE_DISCLOSURE_CHECK=skip to state on the record that this push is going out unscanned.zXno internal-disclosure scanner here, so nothing scanned this push for our own internals.zinternal-disclosurezlsee above. The lines are named and so is what matched, because both are already in the diff you are pushing.Ú	internalsÚINVISIBLE_ENGLISH_CHECKr   ÚlanguagezjWARNING: INVISIBLE_ENGLISH_CHECK=skip. Nothing checked this push for Italian prose in a public repository.)r   z--rootz+REFUSED - the language gate could not run: z5REFUSED - the language gate could not list the tree: zŽREFUSED - see the gate's own verdict above. The public repositories are English-only, names included; the workbench is not, and is not pushed.zZSet INVISIBLE_ENGLISH_CHECK=skip to state on the record that this push goes out unchecked.ÚINVISIBLE_IDENTITY_CHECKr   zòWARNING: INVISIBLE_IDENTITY_CHECK=skip. Nothing checked the author, committer and tagger addresses of this push. An address that goes out is public for good: a force-push leaves the old commits reachable by SHA, in every fork and every clone.zGNOTE: no push refs on stdin, so the commit identities were not checked.zHREFUSED - this push carries addresses that are not a GitHub noreply one:é   z  é   ú z: z
  ... and z morez¥Rewrite them with the noreply identity before pushing, and set that identity in this clone (`git config user.email`), or the next commit will carry the same address.r   z. is a release tag, running the publish gate...zinvisible_core.releasez--project-rootr}   z--verify-indexzuthe index already has this version, byte-identical. Nothing to publish; the publish workflow will no-op the same way.zpublish gate (no-op)zREFUSED (gate exit z‘). The gate printed its own verdict above - read THAT, not this line: it refuses for several unrelated reasons and this hook does not know which.z½  The recurring one is a ledger the index has outrun: the publish workflow opens a `ledger/<version>` PR and cannot merge it itself, so an unmerged one blocks the NEXT release, not its own.zpublish gatezpush proceeding - r@   zNOTHING was checkedz (SKIPPED: ú)r   )"r   rÌ   ÚgetcwdÚresolverI   rÍ   rÎ   rF   r/   Ú
executablerY   r   r   r4   Úparentr¯   Ú_PIN_CHECKERÚis_fileÚ_run_gate_with_its_own_testsÚ_NAME_CHECKERr   Ú_DISCLOSURE_CHECKERrT   r   r   r(   Ú
SystemExitÚRuntimeErrorr­   r   r`   r   r   rH   )rÐ   r5   rZ   r   rÁ   rÏ   ÚpyÚrefsrR   rO   ÚranÚskippedÚ	workbenchÚsettingÚcheckerÚrcÚscannerÚrngr   ÚstopÚforeignr´   r¶   Úmaskedr¨   s                            r$   r   r   Ž  sÓ  € õ ˜Ð(��­b¬i©k¬kÑ:Ô:×BÒBÑDÔD€DÝ
˜S˜[�rŒzˆz¨cÑ
2Ô
2€CØ
Ð
 •€CØ	Ð	E�3—7’7Ð2Ñ3Ô3Ð	Eµs´~€BØ(Ð0�>ÑÔÐ°i€DðÝ˜$ÑÔˆˆøÝð ð ð ÝÐ˜#ÐÐ TÐ*Ñ*Ô*Ð*Øˆqˆqˆqˆqˆqøøøøðøøøð €CØ€GØ”Ô" YÑ.€Ið ˆ8„}ð ÝÐ4Ñ5Ô5Ð5ð ˆ3��D˜( D¨,Ð7¸Ñ>Ô>ð 	Ý�˜ÐÑÔÐÝÐ/°TÐ:Ñ:Ô:Ð:Ýð Qàðñ ô ð ð �1Ø�
Š
�7ÑÔÐð ˆ5„zñ !Ø—'’'Ð/Ñ0Ô0ˆØ�fÒÐÝð 6ñ 7ô 7ð 7ð �NŠN˜:Ñ&Ô&Ð&Ð&à'.ÐL•d˜7‘m”m�m°IÅÑ4LˆGð —?’?Ñ$Ô$ð 	Ý�R˜TÐ"Ñ"Ô"Ð"ÝÐNÐTXÐYÑYÔYÐYÝÐ/ gÐ/Ð/°TÐ:Ñ:Ô:Ð:ÝÐ, dÐ,Ð,°$Ð7Ñ7Ô7Ð7Ýð 3ð 9=ð>ñ >ô >ð >ð �qÝ-Ø˜  D¨#Ø�[Ø"ð3Ø)0ð3ð 3ð	4ñ 4ô 4ˆBð ð Ø�	Ø�JŠJ�uÑÔÐð �gŠgÐ,Ñ-Ô-€GØ�&ÒÐÝð 9ñ 	:ô 	:ð 	:ð 	�Š�{Ñ#Ô#Ð#Ñ#à#*ÐI•$�w‘-”-�-°	½MÑ0IˆØð 	˜7Ÿ?š?Ñ,Ô,ð 	å�˜ÐÑÔÐÝÐOÐUYÐZÑZÔZÐZÝÐ+ 'Ð+Ð+°Ð6Ñ6Ô6Ð6Ýð AØFJðLñ Lô Lð Là�1Ø�ŠÑ Ô ð 	 ÝÐRÑSÔSÐSÝÐPÑQÔQÐQØ�NŠN˜;Ñ'Ô'Ð'Ð'å˜T 4Ñ(Ô(ˆCØð QÝÐIÀÐIÐIÐIÑJÔJÐJÐJåÐBÑCÔCÐCÝð Pñ Qô Qð Qå-Ø˜¨¨T°3Ø.1Ð<�c˜9 cÐ*Ð*¸°uØ"ðBð	Cñ Cô CˆBð ð Ø�	Ø�JŠJ�wÑÔÐð �gŠgÐ2Ñ3Ô3€GØ�&ÒÐÝð Nñ 	Oô 	Oð 	Oà�ŠÐ(Ñ)Ô)Ð)Ñ)à#*ÐO•$�w‘-”-�-°	Õ<OÑ0OˆØð 	˜7Ÿ?š?Ñ,Ô,ð 	Ý�˜ÐÑÔÐÝð Ø!%ð'ñ 'ô 'ð 'åÐ+ 'Ð+Ð+°Ð6Ñ6Ô6Ð6Ýð HØMQðSñ Sô Sð Sà�1Ø�ŠÑ Ô ð 	$Ýð /ñ 0ô 0ð 0åÐPÑQÔQÐQØ�NŠNÐ,Ñ-Ô-Ð-Ð-å˜T 4Ñ(Ô(ˆCÝ-ØÐ.°°DØ°3ÐA˜3 	¨3Ð/Ð/¸S¸EØ"ðQð	Rñ Rô RˆBð ð Ø�	Ø�JŠJ�{Ñ#Ô#Ð#ð �gŠgÐ/Ñ0Ô0€GØˆyŒ>ð %Ø�Š�zÑ"Ô"Ð"Ñ"Ø	�FÒ	Ð	Ýð 9ñ 	:ô 	:ð 	:à�Š�zÑ"Ô"Ð"Ð"ð 	ÐÐÐÐÐð
	Ø—’˜x­¨T©¬Ð3Ñ4Ô4ˆBˆBøÝð 	ð 	ð 	Ý�˜ÐÑÔÐÝÐE¸tÐEÐEÈ4ÐPÑPÔPÐPØ�1�1�1�1�1øøøøÝð 	ð 	ð 	Ý�˜ÐÑÔÐÝÐNÈÐNÐNØðñ ô ð à�1�1�1�1�1øøøøð		øøøð
 ð 	Ý�˜ÐÑÔÐÝð .à37ð9ñ 9ô 9ð 9õ ð 1Ø6:ð<ñ <ô <ð <à�1Ø�
Š
�:ÑÔÐð
 �gŠgÐ0Ñ1Ô1€GØˆzŒ?ð Ø�Š�zÑ"Ô"Ð"Ñ"Ø	�FÒ	Ð	Ýð Hñ 	Iô 	Ið 	Ið 	�Š�zÑ"Ô"Ð"Ñ"Ø�ZŠZ‰\Œ\ð Ýð ñ 	ô 	ð 	à�Š�zÑ"Ô"Ð"Ð"å$ T¨4Ñ0Ô0ˆØð 	Ý�˜ÐÑÔÐÝð  Ø%)ð+ñ +ô +ð +à%,¨S¨b¨S¤\ð Að AÑ!��T˜6ÝÐ5˜#˜c˜r˜cœ(Ð5Ð5 TÐ5Ð5¨VÐ5Ð5¸4Ð@Ñ@Ô@Ð@Ð@Ý�7‰|Œ|˜bÒ Ð ÝÐ:¥# g¡,¤,°Ñ"3Ð:Ð:Ð:ÀÐEÑEÔEÐEÝð CàHLðNñ Nô Nð Nð �1Ø�
Š
�:ÑÔÐõ
 ˜˜s >Ô2Ñ
3Ô
3€CØ
ð "'Ý�ÐCÐCÐCÑDÔDÐDð
 ˆS�"�dÐ4Ð6FÍÈDÉ	Ì	ØÐ+ð-Ø.2ñ4ô 4ˆàÕ#Ò#Ð#Ýð Mñ Nô Nð Nà�JŠJÐ-Ñ.Ô.Ð.Ð.Øð 	'Ý�˜ÐÑÔÐõ ð I rð Ið Ið Ið ðñ ô ð õ ð )ð /3ð4ñ 4ô 4ð 4ð �1à�JŠJ�~Ñ&Ô&Ð&õ 	Ð	°3Ð!Q §¢¨3¡¤ Ð<QÑ	RØ3:ÐBÐ/˜$Ÿ)š) GÑ,Ô,Ð/Ð/Ð/Ð/Àñ
Dñ Eô Eð Eàˆ1s<   ÂB# Â#
CÂ-CÃCÖ$V2 Ö2
X$Ö<%W'×'X$×4%XØX$rý   Úlabelr÷   ÚRunnerrÞ   rß   c               óþ  — |                       d| j        › �¦  «        }|                     ¦   «         s.|r+t          dd¬¦  «         t          d|› d|› d�d¬¦  «         dS nYt          d	|› d
�¦  «          ||t	          |¦  «        g|¦  «        r+t          dd¬¦  «         t          d|› d|› d�d¬¦  «         dS  ||t	          | ¦  «        g|¢|¦  «        r't          dd¬¦  «         t          d|› �d¬¦  «         dS dS )a%  Run a workbench gate, but only after its own known-bad cases pass.

    A gate that has only ever printed PASS is not a gate. Both of these had a
    period of being exactly that: the name scanner was untested until
    2026-07-27 and was returning a clean verdict over three of the four surfaces
    a public repo publishes - commit messages among them, which is where ten of
    our own names went out. Nothing else in any repo that pins this package runs
    these cases, so without this they are a runbook note wearing a gate's
    clothes.
    Útest_rT   Tr×   rÖ   z is missing, so the zy gate is unverified. A gate that has only ever printed PASS is not a gate; do not trust this one until its own cases run.rØ   zrunning the z gate's own known-bad cases...zREFUSED - the zO gate's own cases are RED, so its verdict on this push would mean nothing. Fix z first.r   )Ú	with_nameÚnamerñ   r4   r(   )	rý   r  r÷   r5   r   rž   rÞ   rß   Ú	own_testss	            r$   rò   rò   Ì  sš  € ð* ×!Ò!Ð"8¨'¬,Ð"8Ð"8Ñ9Ô9€IØ×ÒÑÔð Øð 	Ý�˜ÐÑÔÐÝð I˜ið Ið I¸Uð Ið Ið IàNRðTñ Tô Tð Tð �1ð	õ 	ÐA˜EÐAÐAÐAÑBÔBÐBØˆ3�•C˜	‘N”NÐ# TÑ*Ô*ð 	Ý�˜ÐÑÔÐÝð L %ð Lð LØ9BðLð Lð LØQUðWñ Wô Wð Wà�1à
€sˆB•�G‘”Ð$˜tÐ$ dÑ+Ô+ð ÝˆR�TÐÑÔÐÝÐ$˜(Ð$Ð$¨$Ð/Ñ/Ô/Ð/ØˆqØˆ1r#   z	.githooksúsubprocess.CompletedProcessc                óT   — t          j        ddt          | ¦  «        g|¢dd¬¦  «        S )Nrw   rx   T)r{   r|   )r~   r   r(   )r5   rž   s     r$   Ú_gitr    s4   € ÝŒ>˜5 $­¨D©	¬	Ð9°DÐ9Ø)-°Dð:ñ :ô :ð :r#   c                ór   — t          | ddd¦  «        }|j        dk    r|j                             ¦   «         ndS )z?This clone's `core.hooksPath`, or "" if unset / not a checkout.Úconfigz--getúcore.hooksPathr   rT   )r  r€   r1   r­   )r5   Úps     r$   Ú
hooks_pathr    s9   € åˆT�8˜WÐ&6Ñ7Ô7€AØ œ|¨qÒ0Ð0ˆ1Œ8�>Š>ÑÔÐ°bÐ8r#   c                ó  — t          | ¦  «                             dd¦  «                             d¦  «        }t          t	          | ¦  «        t
          z  ¦  «                             dd¦  «        }|t
          dt
          › �|fv S )Nú\ú/z./)r  ÚreplaceÚrstripr(   r   ÚHOOKS_DIR_NAME)r5   ÚcurÚwanteds      r$   Úis_armedr    sp   € Ý
�TÑ
Ô
×
"Ò
" 4¨Ñ
-Ô
-×
4Ò
4°SÑ
9Ô
9€CÝ•�d‘”�nÑ,Ñ-Ô-×5Ò5°d¸CÑ@Ô@€FØ•>Ð#8­Ð#8Ð#8¸&ÐAÐAÐAr#   )r5   c               ól  — ddl }t          |�|nt          j        ¦   «         ¦  «                             ¦   «         }|                     dd¬¦  «        }|                     ddd¬	¦  «         |                     | ¦  «        }|t          z  d
z  }| 	                    ¦   «         s!t          d|› d�t          j        ¬¦  «         dS t          |dd¦  «        j        dk    r!t          d|› d�t          j        ¬¦  «         dS t          |¦  «        }t!          |¦  «        rt          d|› �¦  «         dS |j        r`t          dt          j        ¬¦  «         t          d|pd› dt          › �t          j        ¬¦  «         t          dt          j        ¬¦  «         dS |rDt          d|› �t          j        ¬¦  «         t          dt          › d�t          j        ¬¦  «         dS t          |ddt          ¦  «        }|j        dk    r7t          d|j                             ¦   «         › �t          j        ¬¦  «         dS ddl}	 |                     |                     ¦   «         j        |j        z  |j        z  |j        z  ¦  «         n# t2          $ r Y nw xY wt          dt          › �¦  «         t          d ¦  «         dS )!a  Arm this clone. 0 armed or already armed, 1 --check and not armed, 2 broken.

    Refuses to overwrite a hooksPath somebody else chose: a repo with its own
    hook framework is not ours to hijack, and replacing it would disarm THEIR
    gates to arm ours.
    r   Nzinstall_hooks.pyzarm this clone's pre-push gate)ÚprogÚdescriptionrÝ   Ú
store_truez2report only; exit 1 if the hooks are not installed)ÚactionÚhelpzpre-pushzerror: z does not exist)r-   rª   ry   z	--git-dirz> is not a git checkout, so there are no hooks to install here.z*hooks already installed: core.hooksPath = z6HOOKS NOT INSTALLED: the pre-push gates would not run.z  core.hooksPath = z(unset)z	, wanted z&  fix: python scripts/install_hooks.pyrØ   z'refusing to overwrite core.hooksPath = z.  Another hook framework owns this clone. Add zB/pre-push to it by hand rather than letting this script disarm it.r  r  zerror: git config failed: zcore.hooksPath = z,the pre-push gates are armed for this clone.)Úargparser   rÌ   rì   rí   ÚArgumentParserÚadd_argumentÚ
parse_argsr  Úexistsr2   r/   r0   r  r€   r  r  r}   r­   ÚstatÚchmodÚst_modeÚS_IXUSRÚS_IXGRPÚS_IXOTHÚOSError)	rÐ   r5   r"  r  rž   Úhookr  r†   r'  s	            r$   Úinstall_mainr/    s	  € ð €O€O€Oå˜Ð(��­b¬i©k¬kÑ:Ô:×BÒBÑDÔD€DØ×ÒÐ%7Ø,Lð 	 ñ 	Nô 	N€Aà‡N‚N�9 \ØLð ñ Nô Nð Nà�<Š<˜ÑÔ€Dà•.Ñ  :Ñ-€DØ�;Š;‰=Œ=ð ÝÐ-˜Ð-Ð-Ð-µC´JÐ?Ñ?Ô?Ð?ØˆqÝˆD�+˜{Ñ+Ô+Ô6¸!Ò;Ð;Ýð ˜ð ð ð Ý%(¤Zð	1ñ 	1ô 	1ð 	1àˆqå
�TÑ
Ô
€CÝ��~„~ð ÝÐ@¸3Ð@Ð@ÑAÔAÐAØˆqØ„zð ÝÐFÍSÌZÐXÑXÔXÐXÝÐO CÐ$4¨9ÐOÐO½~ÐOÐOÝ”:ð	ñ 	ô 	ð 	åÐ6½S¼ZÐHÑHÔHÐHØˆqØ
ð ÝÐ=¸Ð=Ð=ÅCÄJÐOÑOÔOÐOÝð #Ýð#ð #ð #å),¬ð	5ñ 	5ô 	5ð 	5ð ˆqåˆT�8Ð-­~Ñ>Ô>€AØ„|�qÒÐÝÐ=¨1¬8¯>ª>Ñ+;Ô+;Ð=Ð=ÅCÄJÐOÑOÔOÐOØˆqð €K€K€KðØ�
Š
�4—9’9‘;”;Ô&¨¬Ñ5¸¼ÑDÀtÄ|ÑSÑTÔTÐTÐTøÝð ð ð Øˆðøøøå	Ð
.�nÐ
.Ð
.Ñ/Ô/Ð/Ý	Ð
8Ñ9Ô9Ð9Øˆ1s   È9AI> É>
JÊ
JÚ__main__rØ   )r'   r(   r%   r)   r*   r+   )r5   r   r*   r   r<   )r*   r(   )rZ   r(   )ri   )rZ   r(   rj   rk   r*   r(   )rs   r(   rt   ru   r*   r)   )re   r(   rt   ru   r*   r‚   )rZ   r(   rt   ru   r*   r(   )r‘   r(   r*   r)   )r‘   r(   r*   r(   )rt   r   rž   r(   r*   rŸ   )rZ   r(   rt   r   r*   r¢   )rÁ   rÂ   r*   rÂ   )rÇ   rk   rÈ   r   r*   rÉ   )rÐ   rÑ   r5   ru   rZ   rŸ   r   rÒ   rÁ   rÓ   rÏ   rŸ   r*   rÉ   )rý   r   r  r(   r÷   r(   r5   r   r   r  rž   rk   rÞ   r)   rß   r(   r*   rÉ   )r5   r   rž   r(   r*   r  )r5   r   r*   r(   )r5   r   r*   r)   )rÐ   rÑ   r5   ru   r*   rÉ   )8r!   Ú
__future__r   rÌ   r~   r/   rB   Úpathlibr   Útypingr   r   r   r   r	   r
   Ú__all__r   rð   ró   rô   r   Ú__annotations__rX   r   r4   r   rY   rh   r   r�   r�   rˆ   r   r”   r•   r–   r�   r¡   r   r   r   rÎ   r(   rÉ   r  r   rò   r  r  r  r  r/  r   rõ   rÐ   r"   r#   r$   ú<module>r6     s£  ðð@ð @ð @ðB #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bð
ð 
ð 
€ð" Ð ð
 "€Ø*€ð 5Ð ð +/°tÈØ,0À3À%ð Ið  I€	ð Ið Ið Iñ IðPð Pð Pð Pð P�iñ Pô Pð Pð #(¨Tð 8ð 8ð 8ð 8ð 8ð 8ð
)ð )ð )ð )ðXð ð ð ð ð0ð 0ð 0ð 0ð ð ð ð ð ð 9€ð	ð 	ð 	ð 	ð0ð 0ð 0ð 0ð%ð %ð %ð %ð %ð\ 3Ð ð (Ð ðMð Mð Mð Mð.ð .ð .ð .ð7ð 7ð 7ð 7ð*ð *ð *ð *ðjÐ ðNð Nð Nð Nðð ð ð ð 
�8˜C”= $Ð'¨Ð,Ô	-€ð %)ð{ð  Ø#Ø Ø$(Ø ð{ð {ð {ð {ð {ð {ð|	)ð )ð )ð )ðp €ð:ð :ð :ð :ð
9ð 9ð 9ð 9ðBð Bð Bð Bð>Ø+/ð>ð >ð >ð >ð >ð >ðB ˆzÒÐØ
ˆ*�T�T˜#œ( 1 2 2œ,Ñ'Ô'Ñ
(Ô
(Ð(ð Ðr#   