§
    øžyj8@  ã            
      ó”  — U d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZmZ ddd	d	d	d
d
dddœ	Zded<   dZdZdZdZdZdZe G d„ d¦  «        ¦   «         Zd9d„Zd:d„Zd:d„Zd:d „Zd;d#„Zd;d$„Zd<d%„Zd9d&„Z d=d'„Z!d:d(„Z"d>d)„Z#dd*œd?d,„Z$d@d/„Z%dAd1„Z&dBd3„Z'dCdDd7„Z(e)d8k    rddl*Z* e*j+         e(¦   «         ¦  «         dS dS )EuÑ  Structural + convention linter for SKILL.md files.

The hard *validator* in ``tools/skill_manager_tool.py::_validate_frontmatter``
guards the non-negotiables (fence present, YAML mapping, ``name`` +
``description`` present, description length, non-empty body, size cap) and is a
create/edit BLOCKER. This module is the softer, broader companion: it encodes
the "Skill authoring standards (HARDLINE)" conventions from ``CONTRIBUTING.md``
that today are only caught by a human reviewer â€” shell-utility references
instead of native tools, a missing author/license/metadata block, a
``name`` that doesn't match its directory, dangling ``references/`` links,
marketing words in the description, ``platforms:`` gating vs POSIX-only
primitives, and forbidden scaffolding files.

Design contract (matches the Hermes "no lazy-reading escape hatches / don't
destroy the feature" posture):

* Findings are **advisory** by default. ``lint_skill`` returns a list of
  :class:`LintFinding`; the caller decides whether any severity blocks. The
  create-path surfaces them as guidance, never as a hard reject (the hard
  rejects already live in the validator).
* Pure functions, no I/O beyond reading the files it is pointed at, so CI, the
  ``skill_manage`` create path, and a contributor running it locally all share
  one implementation.
* Reuses ``agent.skill_utils`` helpers rather than re-parsing frontmatter, so
  BOM handling / platform matching / the 60-char prompt budget stay in one
  place.
é    )ÚannotationsN)Ú	dataclass)ÚPath)ÚAnyÚDictÚListÚOptional)ÚSKILL_PROMPT_DESC_LIMITÚparse_frontmatterÚsearch_filesÚ	read_fileÚpatchzsearch_files (target='files'))	ÚgrepÚrgÚcatÚheadÚtailÚsedÚawkÚfindÚlszDict[str, str]Ú_SHELL_UTIL_TO_TOOL)ÚpowerfulÚcomprehensiveÚseamlessÚadvancedzcutting-edgezstate-of-the-artÚrevolutionaryÚrobust)ÚfcntlÚtermiosz	os.setsidzsignal.SIGKILLÚ	osascriptz/proc/zapt-getÚ	systemctl)z	README.mdzCHANGELOG.mdz
install.shz.envz.env.examplez
.gitignore)zWhen to UsezWhen to useÚerrorÚwarningc                  ó:   — e Zd ZU dZded<   ded<   ded<   d	d„ZdS )
ÚLintFindingzGA single lint result. ``severity`` is advisory metadata for the caller.ÚstrÚseverityÚruleÚmessageÚreturnc                óR   — | j         t          k    rdnd}|› d| j        › d| j        › �S )Nu   âœ—u   âš z [z] )r(   ÚERRORr)   r*   )ÚselfÚbadges     ú8/home/ragecks/.hermes/hermes-agent/tools/skill_linter.pyÚformatzLintFinding.formato   s7   € Øœ­%Ò/Ð/��°UˆØÐ6Ð6˜4œ9Ð6Ð6¨¬Ð6Ð6Ð6ó    N)r+   r'   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r1   © r2   r0   r&   r&   g   sK   € € € € € € àQÐQà€M€M�MØ€I€I�IØ€L€L�Lð7ð 7ð 7ð 7ð 7ð 7r2   r&   ÚfrontmatterúDict[str, Any]Ú	skill_dirúOptional[Path]r+   úList[LintFinding]c           	     óÜ   — |€g S t          |                      dd¦  «        ¦  «                             ¦   «         }|sg S ||j        k    r#t	          t
          dd|› d|j        › d�¦  «        gS g S )NÚnameÚ zname-dir-mismatchzfrontmatter name 'z' does not match directory 'z'; they must be identical.)r'   ÚgetÚstripr?   r&   r-   )r9   r;   r?   s      r0   Ú_check_name_matches_dirrC   w   s™   € ð ÐØˆ	Ýˆ{�Š˜v rÑ*Ô*Ñ+Ô+×1Ò1Ñ3Ô3€DØð Øˆ	ØˆyŒ~ÒÐåÝØ#ð? Tð ?ð ?Ø”Nð?ð ?ð ?ñô ð
ð 	
ð €Ir2   c                óØ   — t          |                      dd¦  «        ¦  «                             ¦   «         }|sg S t          j        d|¦  «        st          t          dd|› d�¦  «        gS g S )Nr?   r@   z[a-z0-9][a-z0-9_-]*zname-formatzname 'zC' must be lowercase letters, digits, hyphens, and underscores only.)r'   rA   rB   ÚreÚ	fullmatchr&   r-   )r9   r?   s     r0   Ú_check_name_formatrG   ‹   s…   € Ýˆ{�Š˜v rÑ*Ô*Ñ+Ô+×1Ò1Ñ3Ô3€DØð Øˆ	ÝŒ<Ð.°Ñ5Ô5ð 
åÝØð)˜ð )ð )ð )ñô ð
ð 	
ð €Ir2   c                ó  ‡— g }t          |                      dd¦  «        ¦  «                             ¦   «                              d¦  «        }|s|S t          |¦  «        t          k    rB|                     t          t          ddt          |¦  «        › dt          › d�¦  «        ¦  «         |                     ¦   «         Šˆfd„t          D ¦   «         }|r-|                     t          t          d	d
|› d�¦  «        ¦  «         |S )NÚdescriptionr@   z'"zdescription-lengthzdescription is z' chars; the skill index truncates past z? chars + '...', losing routing signal. Keep it to one sentence.c                ój   •— g | ]/}t          j        d t          j        |¦  «        › d �‰¦  «        ¯-|‘Œ0S )z\b)rE   ÚsearchÚescape)Ú.0ÚwÚlowers     €r0   ú
<listcomp>z&_check_description.<locals>.<listcomp>®   s>   ø€ ÐTÐTÐT�!­2¬9Ð5K½2¼9ÀQ¹<¼<Ð5KÐ5KÐ5KÈUÑ+SÔ+SÐTˆAÐTÐTÐTr2   zdescription-marketingz%description contains marketing words z'; state the capability, not adjectives.)
r'   rA   rB   Úlenr
   Úappendr&   ÚWARNINGrO   Ú_MARKETING_WORDS)r9   ÚfindingsÚdescÚhitsrO   s       @r0   Ú_check_descriptionrX   ›   s'  ø€ Ø"$€Hõ ˆ{�Š˜}¨bÑ1Ô1Ñ2Ô2×8Ò8Ñ:Ô:×@Ò@ÀÑGÔG€DØð ØˆÝ
ˆ4�y„yÕ*Ò*Ð*Ø�ŠÝÝØ$ð4¥# d¡)¤)ð 4ð 4Ý/ð4ð 4ð 4ñô ñ	
ô 	
ð 	
ð �JŠJ‰LŒL€EØTÐTÐTÐTÕ'ÐTÑTÔT€DØð 
Ø�ŠÝÝØ'ð/¸ð /ð /ð /ñô ñ	
ô 	
ð 	
ð €Or2   c           
     óÐ  — g }dD ]3}|| vr-|                      t          t          dd|› d�¦  «        ¦  «         Œ4|                      d¦  «        }t	          |t
          ¦  «        r|                     d¦  «        nd }t	          |t
          ¦  «        s*|                      t          t          dd¦  «        ¦  «         n-d|vr)|                      t          t          dd	¦  «        ¦  «         t          |                      d
d¦  «        ¦  «        }|r[|                     ¦   «                              ¦   «         dv r3|dk    r-|                      t          t          dd|› d�¦  «        ¦  «         |S )N)ÚversionÚauthorÚlicensezmissing-metadatazfrontmatter is missing 'z'; every peer skill has it.ÚmetadataÚhermesz>frontmatter is missing metadata.hermes.{tags, related_skills}.Útagsz metadata.hermes.tags is missing.r[   r@   )r^   Úagentzhermes agentzHermes Agentzauthor-capszauthor 'zD' should be 'Hermes Agent' (proper caps) or a real contributor name.)	rR   r&   rS   rA   Ú
isinstanceÚdictr'   rB   rO   )r9   rU   ÚkeyÚmetaÚhermes_metar[   s         r0   Ú_check_metadata_blockrf   »   s¢  € Ø"$€HØ/ð ð ˆØ�kÐ!Ð!Ø�OŠOÝÝØ&ØO¨sÐOÐOÐOñô ñô ð øð �?Š?˜:Ñ&Ô&€DÝ(2°4½Ñ(>Ô(>ÐH�$—(’(˜8Ñ$Ô$Ð$ÀD€KÝ�k¥4Ñ(Ô(ð Ø�ŠÝÝØ"ØPñô ñ	
ô 	
ð 	
ð 	
ð ˜Ð$Ð$Ø�OŠOÝÝÐ/Ð1Sñô ñô ð õ
 �—’ ¨2Ñ.Ô.Ñ/Ô/€FØð 

�&—,’,‘.”.×&Ò&Ñ(Ô(Ð,OÐOÐOØ�.Ò Ð à�ŠÝÝØð/˜6ð /ð /ð /ñô ñ	
ô 	
ð 	
ð €Or2   Úbodyr'   c                ó  — g }t          | ¦  «        }t                               ¦   «         D ]`\  }}t          j        dt          j        |¦  «        › d�|¦  «        r0|                     t          t          dd|› d|› d�¦  «        ¦  «         Œa|S )zDFlag banned shell utilities named in PROSE (not fenced code blocks).ú`zshell-utility-referencezprose references `z`; name the native tool `z
` instead.)	Ú_strip_code_blocksr   ÚitemsrE   rK   rL   rR   r&   rS   )rg   rU   ÚproseÚutilÚtools        r0   Ú_check_shell_utilitiesro   æ   s±   € à"$€HÝ˜tÑ$Ô$€EÝ)×/Ò/Ñ1Ô1ð ð ‰
ˆˆdõ Œ9Ð,�"œ) D™/œ/Ð,Ð,Ð,¨eÑ4Ô4ð 	Ø�OŠOÝÝØ-ð)¨ð )ð )Øð)ð )ð )ñô ñô ð øð €Or2   c                óv   ‡ — t          ˆ fd„t          D ¦   «         ¦  «        st          t          dd¦  «        gS g S )Nc              3  ó‚   •K  — | ]9}t          j        d t          j        |¦  «        › �‰t           j        ¦  «        V — Œ:dS )z^#+\s+N)rE   rK   rL   ÚM)rM   Úsrg   s     €r0   ú	<genexpr>z"_check_sections.<locals>.<genexpr>ú   sD   øè è € Ð[Ð[À1�rŒyÐ1¥2¤9¨Q¡<¤<Ð1Ð1°4½¼Ñ>Ô>Ð[Ð[Ð[Ð[Ð[Ð[r2   zmissing-sectionzXno '## When to Use' section found; skills need explicit trigger conditions near the top.)ÚanyÚ_EXPECTED_SECTIONSr&   rS   ©rg   s   `r0   Ú_check_sectionsrx   ù   sR   ø€ ÝÐ[Ð[Ð[Ð[ÕHZÐ[Ñ[Ô[Ñ[Ô[ð 
åÝØ!ð3ñô ð
ð 	
ð €Ir2   c           
     óx  — |€g S g }t          ¦   «         }t          j        d| ¦  «        D ]�}|                     d¦  «        }||v rŒ|                     |¦  «         d|v s|                     d¦  «        rŒK||z                       ¦   «         s-|                     t          t          dd|› d�¦  «        ¦  «         Œ�|S )	z>Flag references/ links in the body that don't resolve on disk.Nz&(references|templates|assets)/[\w./-]+r   Ú*ú/zdangling-referencezbody references 'z6' but that file does not exist in the skill directory.)
ÚsetrE   ÚfinditerÚgroupÚaddÚendswithÚexistsrR   r&   rS   )rg   r;   rU   ÚseenÚmatchÚrels         r0   Ú_check_reference_linksr…     sÞ   € àÐØˆ	Ø"$€HÝ‘U”U€Dõ ”ÐFÈÑMÔMð ð ˆØ�kŠk˜!‰nŒnˆØ�$ˆ;ˆ;ØØ�Š�‰Œˆà�#ˆ:ˆ:˜Ÿš cÑ*Ô*ˆ:ØØ˜C‘×'Ò'Ñ)Ô)ð 	Ø�OŠOÝÝØ(ð/¨ð /ð /ð /ñô ñô ð øð €Or2   c                ó  ‡— |€g S |                       d¦  «        rg S |dz  }|                     ¦   «         sg S i }|                     d¦  «        D ]h}|                     ¦   «         r	|j        dvrŒ 	 |                     dd¬¦  «        Šn# t          $ r Y ŒEw xY wˆfd	„t          D ¦   «         }|r
|||j        <   Œi|rLd
 	                    d„ | 
                    ¦   «         D ¦   «         ¦  «        }t          t          dd|› d�¦  «        gS g S )zAIf bundled scripts use POSIX-only primitives, require platforms:.NÚ	platformsÚscriptsrz   )z.pyz.shz.bashúutf-8Úignore©ÚencodingÚerrorsc                ó   •— g | ]}|‰v ¯|‘Œ	S r8   r8   )rM   ÚpÚtexts     €r0   rP   z+_check_platforms_gating.<locals>.<listcomp>6  s   ø€ Ð9Ð9Ð9�Q¨q°D¨y¨yˆq¨y¨y¨yr2   z; c              3  ó*   K  — | ]\  }}|› d |› �V — ŒdS )z: Nr8   )rM   ÚkÚvs      r0   rt   z*_check_platforms_gating.<locals>.<genexpr>:  s0   è è € ÐEÐE©4¨1¨a˜a˜;˜; 1˜;˜;ÐEÐEÐEÐEÐEÐEr2   zplatforms-gatingz#scripts use POSIX-only primitives (zi) but no 'platforms:' frontmatter is declared. Fix cross-platform or gate with platforms: [linux, macos].)rA   Úis_dirÚrglobÚis_fileÚsuffixÚ	read_textÚOSErrorÚ_POSIX_PRIMITIVESr?   Újoinrk   r&   rS   )r9   r;   Úscripts_dirÚ	offendersÚscriptÚhitÚdetailr�   s          @r0   Ú_check_platforms_gatingr¡   #  sj  ø€ ð ÐØˆ	Ø‡‚�{Ñ#Ô#ð Øˆ	Ø˜iÑ'€KØ×ÒÑÔð Øˆ	Ø&(€IØ×#Ò# CÑ(Ô(ð 	)ð 	)ˆØ�~Š~ÑÔð 	 6¤=Ð8OÐ#OÐ#OØð	Ø×#Ò#¨W¸XÐ#ÑFÔFˆDˆDøÝð 	ð 	ð 	ØˆHð	øøøà9Ð9Ð9Ð9Õ+Ð9Ñ9Ô9ˆØð 	)Ø%(ˆI�f”kÑ"øØð 

Ø—’ÐEÐE°9·?²?Ñ3DÔ3DÐEÑEÔEÑEÔEˆåÝØ"ð8°fð 8ð 8ð 8ñô ð
ð 	
ð €Is   Á0BÂ
BÂBc           
     ó®   — | €g S g }t           D ]F}| |z                       ¦   «         r-|                     t          t          dd|› d�¦  «        ¦  «         ŒG|S )Nzforbidden-filezskill ships 'z6'; skills should not include scaffolding/config files.)Ú_FORBIDDEN_FILESr�   rR   r&   rS   )r;   rU   Úfnames      r0   Ú_check_forbidden_filesr¥   G  s�   € ØÐØˆ	Ø"$€HÝ!ð 	ð 	ˆØ˜Ñ×%Ò%Ñ'Ô'ð 	Ø�OŠOÝÝØ$ð1 Eð 1ð 1ð 1ñô ñô ð øð €Or2   c           
     óì   ‡— |                       d¦  «        }|sg S h d£Št          |t          ¦  «        r|n|g}ˆfd„|D ¦   «         }|r+t          t          dd|› dt          ‰¦  «        › d�¦  «        gS g S )Nr‡   >   ÚlinuxÚmacosÚdarwinÚwindowsc                óZ   •— g | ]'}t          |¦  «                             ¦   «         ‰v¯%|‘Œ(S r8   )r'   rO   )rM   r�   Úvalids     €r0   rP   z._check_platform_list_valid.<locals>.<listcomp>^  s1   ø€ Ð
;Ð
;Ð
;��s 1™vœvŸ|š|™~œ~°UÐ:Ð:ˆ1Ð:Ð:Ð:r2   zplatforms-valuez)platforms contains unrecognized value(s) z; expected a subset of ú.)rA   ra   Úlistr&   rS   Úsorted)r9   r‡   rk   Úbadr¬   s       @r0   Ú_check_platform_list_validr±   X  s´   ø€ Ø—’ Ñ,Ô,€IØð Øˆ	Ø3Ð3Ð3€EÝ# I­tÑ4Ô4ÐEˆIˆI¸9¸+€EØ
;Ð
;Ð
;Ð
;�eÐ
;Ñ
;Ô
;€CØ
ð 
åÝØ!ð.¸Cð .ð .Ý# E™]œ]ð.ð .ð .ñô ð
ð 	
ð €Ir2   c                óF   — t          j        dd| t           j        ¬¦  «        S )zFRemove fenced code blocks so prose-only checks don't fire on examples.z	```.*?```r@   )Úflags)rE   ÚsubÚSrw   s    r0   rj   rj   n  s   € åŒ6�,  Dµ´Ð5Ñ5Ô5Ð5r2   ©r;   Úcontentc               óœ  — t          | ¦  «        \  }}g }|t          |¦  «        z  }|t          ||¦  «        z  }|t          |¦  «        z  }|t	          |¦  «        z  }|t          |¦  «        z  }|t          |¦  «        z  }|t          |¦  «        z  }|t          ||¦  «        z  }|t          ||¦  «        z  }|t          |¦  «        z  }|S )u  Lint raw SKILL.md *content*.

    Pass ``skill_dir`` to enable on-disk checks (name/dir match, dangling
    reference links, POSIX-primitive gating, forbidden files). Without it,
    only content-only checks run â€” useful for the create path, where the file
    is not yet written.
    )r   rG   rC   rX   rf   r±   ro   rx   r…   r¡   r¥   )r·   r;   r9   rg   rU   s        r0   Úlint_contentr¹   v  sã   € õ *¨'Ñ2Ô2Ñ€K�Ø"$€HØÕ" ;Ñ/Ô/Ñ/€HØÕ'¨°YÑ?Ô?Ñ?€HØÕ" ;Ñ/Ô/Ñ/€HØÕ% kÑ2Ô2Ñ2€HØÕ*¨;Ñ7Ô7Ñ7€HØÕ& tÑ,Ô,Ñ,€HØ• Ñ%Ô%Ñ%€HØÕ& t¨YÑ7Ô7Ñ7€HØÕ'¨°YÑ?Ô?Ñ?€HØÕ& yÑ1Ô1Ñ1€HØ€Or2   Úskill_md_pathr   c                óz   — t          | ¦  «        } |                      dd¬¦  «        }t          || j        ¬¦  «        S )z>Lint a SKILL.md file on disk, with all on-disk checks enabled.r‰   rŠ   r‹   r¶   )r   r˜   r¹   Úparent)rº   r·   s     r0   Ú
lint_skillr½   �  s=   € å˜Ñ'Ô'€MØ×%Ò%¨w¸xÐ%ÑHÔH€GÝ˜¨=Ô+?Ð@Ñ@Ô@Ð@r2   rU   c                ó@   — d                      d„ | D ¦   «         ¦  «        S )z9Render findings as a newline-joined human-readable block.Ú
c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)r1   ©rM   Úfs     r0   rt   z"format_findings.<locals>.<genexpr>˜  s*   è è € Ð2Ð2 A�Q—X’X‘Z”ZÐ2Ð2Ð2Ð2Ð2Ð2r2   )r›   ©rU   s    r0   Úformat_findingsrÅ   –  s#   € à�9Š9Ð2Ð2¨Ð2Ñ2Ô2Ñ2Ô2Ð2r2   Úboolc                ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3  ó6   K  — | ]}|j         t          k    V — Œd S rÁ   )r(   r-   rÂ   s     r0   rt   zhas_errors.<locals>.<genexpr>œ  s)   è è € Ð5Ð5 qˆqŒz�UÒ"Ð5Ð5Ð5Ð5Ð5Ð5r2   )ru   rÄ   s    r0   Ú
has_errorsrÉ   ›  s   € ÝÐ5Ð5¨HÐ5Ñ5Ô5Ñ5Ô5Ð5r2   ÚargvúOptional[List[str]]Úintc                ó8  — ddl }| �| n|j        dd…         }|st          d¦  «         dS g }|D ]¢}t          |¦  «        }|                     ¦   «         r6|                     t          |                     d¦  «        ¦  «        ¦  «         Œ[|j        dk    r*| 	                    ¦   «         r| 
                    |¦  «         Œ�t          d|› �¦  «         Œ£d}d}|D ]s}t          |¦  «        }	|	sŒ|t          |	¦  «        z  }t          |	¦  «        rd	}t          d
|j        j        › d|› d�¦  «         t          t          |	¦  «        ¦  «         Œt|dk    r!t          dt          |¦  «        › d�¦  «         n#t          d
|› dt          |¦  «        › d�¦  «         |rdndS )a`  CLI: ``python -m tools.skill_linter <path-to-SKILL.md-or-dir> ...``

    Accepts SKILL.md files or skill directories (recursively linted). Prints
    findings grouped per skill. Exit code 1 if any ERROR-severity finding is
    present (WARNING-only is exit 0), so CI can gate on structural breakage
    without failing on advisory convention nits.
    r   Né   z>usage: python -m tools.skill_linter <SKILL.md | skill-dir> ...é   zSKILL.mdzskip (not a SKILL.md or dir): FTr¿   z (z):zAll z skill(s) clean.z finding(s) across z
 skill(s).)ÚsysrÊ   Úprintr   r”   Úextendr¯   r•   r?   r–   rR   r½   rQ   rÉ   r¼   rÅ   )
rÊ   rÐ   ÚargsÚtargetsÚargr�   Ú	any_errorÚtotalÚskill_mdrU   s
             r0   Ú_mainrÙ   Ÿ  sÛ  € ð €J€J€JàÐ#ˆ4ˆ4¨¬°!°"°"¬€DØð ÝÐNÑOÔOÐOØˆqà€GØð :ð :ˆÝ�‰IŒIˆØ�8Š8‰:Œ:ð 	:Ø�NŠN�6 !§'¢'¨*Ñ"5Ô"5Ñ6Ô6Ñ7Ô7Ð7Ð7ØŒV�zÒ!Ð! a§i¢i¡k¤kÐ!Ø�NŠN˜1ÑÔÐÐåÐ8°3Ð8Ð8Ñ9Ô9Ð9Ð9à€IØ€EØð )ð )ˆÝ˜hÑ'Ô'ˆØð 	ØØ•�X‘”ÑˆÝ�hÑÔð 	ØˆIÝÐ7�8”?Ô'Ð7Ð7¨8Ð7Ð7Ð7Ñ8Ô8Ð8Ý�o˜hÑ'Ô'Ñ(Ô(Ð(Ð(à�‚z€zÝÐ3•S˜‘\”\Ð3Ð3Ð3Ñ4Ô4Ð4Ð4åÐE�5ÐEÐE­S°©\¬\ÐEÐEÐEÑFÔFÐFØÐ ˆ1ˆ1˜qÐ r2   Ú__main__)r9   r:   r;   r<   r+   r=   )r9   r:   r+   r=   )rg   r'   r+   r=   )rg   r'   r;   r<   r+   r=   )r;   r<   r+   r=   )rg   r'   r+   r'   )r·   r'   r;   r<   r+   r=   )rº   r   r+   r=   )rU   r=   r+   r'   )rU   r=   r+   rÆ   rÁ   )rÊ   rË   r+   rÌ   ),r6   Ú
__future__r   rE   Údataclassesr   Úpathlibr   Útypingr   r   r   r	   Úagent.skill_utilsr
   r   r   r7   rT   rš   r£   rv   r-   rS   r&   rC   rG   rX   rf   ro   rx   r…   r¡   r¥   r±   rj   r¹   r½   rÅ   rÉ   rÙ   r3   rÐ   Úexitr8   r2   r0   ú<module>rá      sÕ  ððð ð ð8 #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ðð ð ð ð ð ð ð ð Ø
ØØØØØØ+Ø
)ð
'ð 
'Ð ð 
ð 
ð 
ñ 
ð	Ð ð	Ð ðÐ ð 4Ð à€Ø
€ð ð	7ð 	7ð 	7ð 	7ð 	7ñ 	7ô 	7ñ „ð	7ðð ð ð ð(ð ð ð ð ð ð ð ð@(ð (ð (ð (ðVð ð ð ð&
ð 
ð 
ð 
ðð ð ð ð:!ð !ð !ð !ðHð ð ð ð"ð ð ð ð,6ð 6ð 6ð 6ð 26ðð ð ð ð ð ð2Að Að Að Að3ð 3ð 3ð 3ð
6ð 6ð 6ð 6ð)!ð )!ð )!ð )!ð )!ðX ˆzÒÐØ€J€J€Jà€C„HˆUˆU‰WŒWÑÔÐÐÐð Ðr2   