§
    ÷žyjµi  ã                  óä  — 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ZddlZddl	Z	ddl
Z
ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lmZmZ dd
lmZ ddlmZ dZdZ ej        dej         ¦  «        Z! ej        dej         ¦  «        Z"dZ#dZ$dEd„Z%dFd„Z&dGd„Z'dFd„Z(dHd„Z)dId#„Z*dJd$„Z+	 	 	 dKdLd,„Z,dMd.„Z-dNd3„Z.dOd7„Z/dPd:„Z0dQd>„Z1 G d?„ d@¦  «        Z2 G dA„ dB¦  «        Z3 G dC„ dD¦  «        Z4dS )Rat  OpenAI-compatible shim that forwards Hermes requests to `copilot --acp`.

This adapter lets Hermes treat the GitHub Copilot ACP server as a chat-style
backend. Each request starts a short-lived ACP session, sends the formatted
conversation as a single prompt, collects text chunks, and converts the result
back into the minimal shape Hermes expects from an OpenAI client.
é    )ÚannotationsN)Údeque)ÚPath)ÚSimpleNamespace)ÚAny©ÚChatCompletionMessageToolCallÚFunction)Úget_read_block_errorÚget_write_denied_error)Úredact_sensitive_text)Úhermes_subprocess_envzacp://copilotg      Œ@z&<tool_call>\s*(\{.*?\})\s*</tool_call>zd\{\s*\"id\"\s*:\s*\"[^\"]+\"\s*,\s*\"type\"\s*:\s*\"function\"\s*,\s*\"function\"\s*:\s*\{.*?\}\s*\})z
gh-copilot)zhas been deprecatedzno commands will be executedÚstderr_textÚstrÚreturnÚboolc                ó°   ‡— |                       ¦   «         Št          ˆfd„t          D ¦   «         ¦  «        sdS t          ˆfd„t          D ¦   «         ¦  «        S )zHTrue iff stderr looks like the deprecated gh-copilot extension's banner.c              3  ó    •K  — | ]}|‰v V — Œ	d S ©N© )Ú.0ÚreqÚlowers     €ú>/home/ragecks/.hermes/hermes-agent/agent/copilot_acp_client.pyú	<genexpr>z5_is_gh_copilot_deprecation_message.<locals>.<genexpr>9   s'   øè è € Ð=Ð= ˆs�eˆ|Ð=Ð=Ð=Ð=Ð=Ð=ó    Fc              3  ó    •K  — | ]}|‰v V — Œ	d S r   r   )r   Úmarkerr   s     €r   r   z5_is_gh_copilot_deprecation_message.<locals>.<genexpr>;   s'   øè è € ÐBÐB 6ˆv˜ˆÐBÐBÐBÐBÐBÐBr   )r   ÚanyÚ_DEPRECATION_REQUIREDÚ_DEPRECATION_MARKERS)r   r   s    @r   Ú"_is_gh_copilot_deprecation_messager"   5   se   ø€ ð ×ÒÑÔ€EÝÐ=Ð=Ð=Ð=Õ'<Ð=Ñ=Ô=Ñ=Ô=ð ØˆuÝÐBÐBÐBÐBÕ-AÐBÑBÔBÑBÔBÐBr   c                 ó¢   — t          j        dd¦  «                             ¦   «         p(t          j        dd¦  «                             ¦   «         pdS )NÚHERMES_COPILOT_ACP_COMMANDÚ ÚCOPILOT_CLI_PATHÚcopilot)ÚosÚgetenvÚstripr   r   r   Ú_resolve_commandr+   >   sL   € å
Œ	Ð.°Ñ3Ô3×9Ò9Ñ;Ô;ð 	ÝŒ9Ð'¨Ñ,Ô,×2Ò2Ñ4Ô4ð	àðr   ú	list[str]c                 ó„   — t          j        dd¦  «                             ¦   «         } | sddgS t          j        | ¦  «        S )NÚHERMES_COPILOT_ACP_ARGSr%   z--acpz--stdio)r(   r)   r*   ÚshlexÚsplit)Úraws    r   Ú_resolve_argsr2   F   sC   € Ý
Œ)Ð-¨rÑ
2Ô
2×
8Ò
8Ñ
:Ô
:€CØð $Ø˜Ð#Ð#ÝŒ;�sÑÔÐr   c                 ór  — t           j                             dd¦  «                             ¦   «         } | r| S t           j                             d¦  «        }|r|dk    r|S 	 ddl}|                     t          j        ¦   «         ¦  «        j	                             ¦   «         }|r|S n# t          $ r Y nw xY wdS )z-Return a stable HOME for child ACP processes.ÚHOMEr%   Ú~r   Nz/tmp)r(   ÚenvironÚgetr*   ÚpathÚ
expanduserÚpwdÚgetpwuidÚgetuidÚpw_dirÚ	Exception)ÚhomeÚexpandedr:   Úresolveds       r   Ú_resolve_home_dirrB   M   sÇ   € åŒ:�>Š>˜& "Ñ%Ô%×+Ò+Ñ-Ô-€DØð ØˆåŒw×!Ò! #Ñ&Ô&€HØð �H ’O�OØˆðØˆ
ˆ
ˆ
à—<’<¥¤	¡¤Ñ,Ô,Ô3×9Ò9Ñ;Ô;ˆØð 	ØˆOð	øåð ð ð Øˆðøøøð ˆ6s   Á!AB' Â'
B4Â3B4údict[str, str]c                 ón   — t          d¬¦  «        } t          ¦   «         }|| d<   ddlm}  || ¦  «         | S )NT)Úinherit_credentialsr4   r   )Úapply_subprocess_home_env)r   rB   Úhermes_constantsrF   )Úenvr?   rF   s      r   Ú_build_subprocess_envrI   f   sP   € õ  °DÐ
9Ñ
9Ô
9€CÝÑÔ€DØ€Cˆ�KØ:Ð:Ð:Ð:Ð:Ð:ØÐ˜cÑ"Ô"Ð"Ø€Jr   Ú
message_idr   ÚcodeÚintÚmessageúdict[str, Any]c                ó   — d| ||dœdœS )Nú2.0)rK   rM   )ÚjsonrpcÚidÚerrorr   )rJ   rK   rM   s      r   Ú_jsonrpc_errorrT   r   s'   € àØàØð
ð 
ðð ð r   c                ó   — d| dddiidœS )NrP   ÚoutcomeÚ	cancelled©rQ   rR   Úresultr   )rJ   s    r   Ú_permission_deniedrZ   }   s)   € àØàØ˜;ðð
ðð ð r   Úmessagesúlist[dict[str, Any]]Úmodelú
str | NoneÚtoolsúlist[dict[str, Any]] | NoneÚtool_choicec           	     óh  — g d¢}|r|                      d|› �¦  «         t          |t          ¦  «        �r|�r
g }|D ]×}t          |t          ¦  «        sŒ|                     d¦  «        pi }t          |t          ¦  «        sŒE|                     d¦  «        }t          |t
          ¦  «        r|                     ¦   «         sŒ„|                      |                     ¦   «         |                     dd¦  «        |                     di ¦  «        dœ¦  «         ŒØ|r,|                      d	t          j        |d
¬¦  «        z   ¦  «         |�,|                      dt          j        |d
¬¦  «        › �¦  «         g }	| D ]Þ}
t          |
t          ¦  «        sŒt          |
                     d¦  «        pd¦  «                             ¦   «          	                    ¦   «         }|dk    rd}n|dvrd}|
                     d¦  «        }t          |¦  «        }|sŒ–ddddddœ                     ||                     ¦   «         ¦  «        }|	                      |› d|› �¦  «         Œß|	r+|                      dd                     |	¦  «        z   ¦  «         |                      d¦  «         d                     d„ |D ¦   «         ¦  «        S )N)z>You are being used as the active ACP agent backend for Hermes.z'Use ACP capabilities to complete tasks.z£IMPORTANT: If you take an action with a tool, you MUST output tool calls using <tool_call>{...}</tool_call> blocks with JSON exactly in OpenAI function-call shape.z&If no tool is needed, answer normally.zHermes requested model hint: ÚfunctionÚnameÚdescriptionr%   Ú
parameters)rd   re   rf   zÇAvailable tools (OpenAI function schema). When using a tool, emit ONLY <tool_call>{...}</tool_call> with one JSON object containing id/type/function{name,arguments}. arguments must be a JSON string.
F©Úensure_asciizTool choice hint: ÚroleÚunknownÚtool>   ÚuserÚsystemÚ	assistantÚcontextÚcontentÚSystemÚUserÚ	AssistantÚToolÚContext)rm   rl   rn   rk   ro   z:
zConversation transcript:

z

z7Continue the conversation from the latest user request.c              3  ój   K  — | ].}|¯|                      ¦   «         ¯|                      ¦   «         V — Œ/d S r   ©r*   )r   Úsections     r   r   z-_format_messages_as_prompt.<locals>.<genexpr>Ñ   s<   è è € Ð^Ð^¨7À'Ð^ÈgÏmÊmÉoÌoÐ^�w—}’}‘”Ð^Ð^Ð^Ð^Ð^Ð^r   )ÚappendÚ
isinstanceÚlistÚdictr7   r   r*   ÚjsonÚdumpsr   Ú_render_message_contentÚtitleÚjoin)r[   r]   r_   ra   ÚsectionsÚ
tool_specsÚtÚfnrd   Ú
transcriptrM   ri   rp   ÚrenderedÚlabels                  r   Ú_format_messages_as_promptr‰   ‰   s	  € ðð ð €Hð ð AØ�ŠÐ?¸Ð?Ð?Ñ@Ô@Ð@å�%�ÑÔñ  5ñ Ø+-ˆ
Øð 	ð 	ˆAÝ˜a¥Ñ&Ô&ð ØØ—’�zÑ"Ô"Ð( bˆBÝ˜b¥$Ñ'Ô'ð ØØ—6’6˜&‘>”>ˆDÝ˜d¥CÑ(Ô(ð °·
²
±´ð ØØ×Òà ŸJšJ™LœLØ#%§6¢6¨-¸Ñ#<Ô#<Ø"$§&¢&¨°rÑ":Ô":ðð ñô ð ð ð ð 	Ø�OŠOðbõ ”*˜Z°eÐ<Ñ<Ô<ñ=ñô ð ð ÐØ�ŠÐZ­T¬Z¸ÐRWÐ-XÑ-XÔ-XÐZÐZÑ[Ô[Ð[à€JØð 3ð 3ˆÝ˜'¥4Ñ(Ô(ð 	ØÝ�7—;’;˜vÑ&Ô&Ð3¨)Ñ4Ô4×:Ò:Ñ<Ô<×BÒBÑDÔDˆØ�6Š>ˆ>ØˆDˆDØÐ8Ð8Ð8ØˆDà—+’+˜iÑ(Ô(ˆÝ*¨7Ñ3Ô3ˆØð 	Øð ØØ$ØØ ð
ð 
÷ Š#ˆd�D—J’J‘L”LÑ
!Ô
!ð 	ð 	×Ò˜UÐ1Ð1 xÐ1Ð1Ñ2Ô2Ð2Ð2àð RØ�ŠÐ6¸¿ºÀZÑ9PÔ9PÑPÑQÔQÐQà‡O‚OÐMÑNÔNÐNØ�;Š;Ð^Ð^°hÐ^Ñ^Ô^Ñ^Ô^Ð^r   rp   c                óü  — | €dS t          | t          ¦  «        r|                      ¦   «         S t          | t          ¦  «        r²d| v r6t          |                      d¦  «        pd¦  «                             ¦   «         S d| v r^t          |                      d¦  «        t          ¦  «        r6t          |                      d¦  «        pd¦  «                             ¦   «         S t          j        | d¬¦  «        S t          | t          ¦  «        rÓg }| D ]§}t          |t          ¦  «        r|                     |¦  «         Œ-t          |t          ¦  «        re|                     d¦  «        }t          |t          ¦  «        r;|                     ¦   «         r'|                     |                     ¦   «         ¦  «         Œ¨d 	                    |¦  «                             ¦   «         S t          | ¦  «                             ¦   «         S )Nr%   Útextrp   Trg   Ú
)
rz   r   r*   r|   r7   r}   r~   r{   ry   r�   )rp   ÚpartsÚitemr‹   s       r   r   r   Ô   s¼  € Ø€ØˆrÝ�'�3ÑÔð Ø�}Š}‰ŒÐÝ�'�4Ñ Ô ð 6Ø�WÐÐÝ�w—{’{ 6Ñ*Ô*Ð0¨bÑ1Ô1×7Ò7Ñ9Ô9Ð9Ø˜ÐÐ¥J¨w¯{ª{¸9Ñ/EÔ/EÅsÑ$KÔ$KÐÝ�w—{’{ 9Ñ-Ô-Ð3°Ñ4Ô4×:Ò:Ñ<Ô<Ð<ÝŒz˜'°Ð5Ñ5Ô5Ð5Ý�'�4Ñ Ô ð 	(ØˆØð 	/ð 	/ˆDÝ˜$¥Ñ$Ô$ð /Ø—’˜TÑ"Ô"Ð"Ð"Ý˜D¥$Ñ'Ô'ð /Ø—x’x Ñ'Ô'�Ý˜d¥CÑ(Ô(ð /¨T¯ZªZ©\¬\ð /Ø—L’L §¢¡¤Ñ.Ô.Ð.øØ�yŠy˜ÑÔ×%Ò%Ñ'Ô'Ð'Ýˆw‰<Œ<×ÒÑÔÐr   Úcall_idrd   Ú	argumentsr	   c           
     óH   — t          | | ddt          ||¬¦  «        ¬¦  «        S )zDBuild an OpenAI-compatible tool-call object for downstream handling.Nrc   ©rd   r�   )rR   r�   Úresponse_item_idÚtyperc   r   ©r�   rd   r�   s      r   Ú_build_openai_tool_callr–   ì   s7   € õ )ØØØØÝ˜t¨yÐ9Ñ9Ô9ðñ ô ð r   Ú
completionr   úlist[SimpleNamespace]c                óN  — | j         d         }|j        }d}|j        r—g }t          |j        ¦  «        D ]€\  }}|                     t          |t          |dd¦  «        t          |dd¦  «        t          t          |j        dd¦  «        t          |j        dd¦  «        ¬¦  «        ¬	¦  «        ¦  «         Œ�t          d
|j        pd||j	        |j
        ¬¦  «        }t          t          d||j        ¬¦  «        g| j        d¬¦  «        }t          g | j        | j        ¬¦  «        }||gS )z@Convert a one-shot ACP response into OpenAI-style stream chunks.r   NrR   r”   rc   rd   r�   r’   )ÚindexrR   r”   rc   rn   )ri   rp   Ú
tool_callsÚreasoning_contentÚ	reasoning)rš   ÚdeltaÚfinish_reason)Úchoicesr]   Úusage)r    rM   r›   Ú	enumeratery   r   Úgetattrrc   rp   rœ   r�   rŸ   r]   r¡   )	r—   ÚchoicerM   Útool_call_deltasrš   Ú	tool_callrž   Ú
data_chunkÚusage_chunks	            r   Ú_completion_to_stream_chunksr©   ü   sz  € àÔ Ô"€FØŒn€GØÐØÔð ØÐÝ )¨'Ô*<Ñ =Ô =ð 	ð 	ÑˆE�9Ø×#Ò#ÝØÝ˜y¨$°Ñ5Ô5Ý  ¨F°JÑ?Ô?Ý,Ý$ YÔ%7¸ÀÑFÔFÝ")¨)Ô*<¸kÈ4Ñ"PÔ"Pðñ ô ð	ñ ô ñ
ô 
ð 
ð 
õ ØØ”Ð' 4Ø#Ø!Ô3ØÔ#ðñ ô €Eõ !åØØØ$Ô2ðñ ô ð
ð ÔØð
ñ 
ô 
€Jõ "ØØÔØÔðñ ô €Kð
 ˜Ð$Ð$r   r‹   ú/tuple[list[ChatCompletionMessageToolCall], str]c                ó¼  ‡— t          | t          ¦  «        r|                      ¦   «         sg dfS g Šg }dˆfd„}t                               | ¦  «        D ]]}|                     d¦  «        } ||¦  «         |                     |                     ¦   «         |                     ¦   «         f¦  «         Œ^‰sxt                               | ¦  «        D ]]}|                     d¦  «        } ||¦  «         |                     |                     ¦   «         |                     ¦   «         f¦  «         Œ^|s‰|                      ¦   «         fS | 
                    ¦   «          g }|D ]^\  }}|r||d	         d         k    r|                     ||f¦  «         Œ1|d	         d         t          |d	         d         |¦  «        f|d	<   Œ_g }d}	|D ]8\  }}|	|k     r|                     | |	|…         ¦  «         t          |	|¦  «        }	Œ9|	t          | ¦  «        k     r|                     | |	d …         ¦  «         d
                     d„ |D ¦   «         ¦  «                             ¦   «         }
‰|
fS )Nr%   Úraw_jsonr   r   ÚNonec                óò  •— 	 t          j        | ¦  «        }n# t          $ r Y d S w xY wt          |t          ¦  «        sd S |                     d¦  «        }t          |t          ¦  «        sd S |                     d¦  «        }t          |t          ¦  «        r|                     ¦   «         sd S |                     dd¦  «        }t          |t          ¦  «        st          j        |d¬¦  «        }|                     d¦  «        }t          |t          ¦  «        r|                     ¦   «         sdt          ‰¦  «        d	z   › �}‰ 
                    t          ||                     ¦   «         |¬
¦  «        ¦  «         d S )Nrc   rd   r�   z{}Frg   rR   Ú	acp_call_é   r•   )r}   Úloadsr>   rz   r|   r7   r   r*   r~   Úlenry   r–   )r¬   Úobjr…   Úfn_nameÚfn_argsr�   Ú	extracteds         €r   Ú_try_add_tool_callz9_extract_tool_calls_from_text.<locals>._try_add_tool_call1  su  ø€ ð	Ý”*˜XÑ&Ô&ˆCˆCøÝð 	ð 	ð 	ØˆFˆFð	øøøå˜#�tÑ$Ô$ð 	ØˆFØ�WŠW�ZÑ Ô ˆÝ˜"�dÑ#Ô#ð 	ØˆFØ—&’&˜‘.”.ˆÝ˜'¥3Ñ'Ô'ð 	¨w¯}ª}©¬ð 	ØˆFØ—&’&˜ dÑ+Ô+ˆÝ˜'¥3Ñ'Ô'ð 	>Ý”j °uÐ=Ñ=Ô=ˆGØ—'’'˜$‘-”-ˆÝ˜'¥3Ñ'Ô'ð 	5¨w¯}ª}©¬ð 	5Ø4¥# i¡.¤.°Ñ"2Ð4Ð4ˆGà×ÒÝ#ØØ—]’]‘_”_Ø!ðñ ô ñ	
ô 	
ð 	
ð 	
ð 	
s   ƒ ˜
&¥&r°   r   éÿÿÿÿrŒ   c              3  ój   K  — | ].}|¯|                      ¦   «         ¯|                      ¦   «         V — Œ/d S r   rw   )r   Úps     r   r   z0_extract_tool_calls_from_text.<locals>.<genexpr>m  s<   è è € ÐDÐD a°AÐD¸!¿'º'¹)¼)ÐD˜Ÿš™	œ	ÐDÐDÐDÐDÐDÐDr   )r¬   r   r   r­   )rz   r   r*   Ú_TOOL_CALL_BLOCK_REÚfinditerÚgroupry   ÚstartÚendÚ_TOOL_CALL_JSON_REÚsortÚmaxr²   r�   )r‹   Úconsumed_spansr·   Úmr1   Úmergedr¾   r¿   r�   ÚcursorÚcleanedr¶   s              @r   Ú_extract_tool_calls_from_textrÈ   *  sŒ  ø€ Ý�d�CÑ Ô ð ¨¯
ª
©¬ð Ø�2ˆvˆà57€IØ,.€Nð
ð 
ð 
ð 
ð 
ð 
õ8 !×)Ò)¨$Ñ/Ô/ð 4ð 4ˆØ�gŠg�a‰jŒjˆØÐ˜3ÑÔÐØ×Ò˜qŸwšw™yœy¨!¯%ª%©'¬'Ð2Ñ3Ô3Ð3Ð3ð ð 8Ý#×,Ò,¨TÑ2Ô2ð 	8ð 	8ˆAØ—'’'˜!‘*”*ˆCØÐ˜sÑ#Ô#Ð#Ø×!Ò! 1§7¢7¡9¤9¨a¯eªe©g¬gÐ"6Ñ7Ô7Ð7Ð7àð 'Ø˜$Ÿ*š*™,œ,Ð&Ð&à×ÒÑÔÐØ$&€FØ$ð Bð B‰
ˆˆsØð 	B˜ ¨¤¨A¤Ò.Ð.Ø�MŠM˜5 #˜,Ñ'Ô'Ð'Ð'à  œ* Qœ-­¨V°B¬Z¸¬]¸CÑ)@Ô)@ÐAˆF�2‰JˆJà€EØ€FØð "ð "‰
ˆˆsØ�EŠ>ˆ>Ø�LŠL˜˜f U˜lÔ+Ñ,Ô,Ð,Ý�V˜SÑ!Ô!ˆˆØ•�D‘	”	ÒÐØ�Š�T˜&˜'˜'”]Ñ#Ô#Ð#à�iŠiÐDÐD¨5ÐDÑDÔDÑDÔD×JÒJÑLÔL€GØ�gÐÐr   Ú	path_textÚcwdr   c                óT  — t          | ¦  «        }|                     ¦   «         st          d¦  «        ‚|                     ¦   «         }t          |¦  «                             ¦   «         }	 |                     |¦  «         n)# t
          $ r}t          d|› d|› d�¦  «        |‚d }~ww xY w|S )Nz'ACP file-system paths must be absolute.zPath 'z' is outside the session cwd 'z'.)r   Úis_absoluteÚPermissionErrorÚresolveÚrelative_toÚ
ValueError)rÉ   rÊ   Ú	candidaterA   ÚrootÚexcs         r   Ú_ensure_path_within_cwdrÔ   r  sÃ   € Ý�Y‘”€IØ× Ò Ñ"Ô"ð IÝÐGÑHÔHÐHØ× Ò Ñ"Ô"€HÝ�‰9Œ9×ÒÑÔ€DðbØ×Ò˜TÑ"Ô"Ð"Ð"øÝð bð bð bÝÐW xÐWÐWÈtÐWÐWÐWÑXÔXÐ^aÐaøøøøðbøøøà€Os   Á)A? Á?
B%Â	B Â B%c                  ó   — e Zd Zd	d„Zd
d„ZdS )Ú_ACPChatCompletionsÚclientú'CopilotACPClient'c                ó   — || _         d S r   )Ú_client©Úselfr×   s     r   Ú__init__z_ACPChatCompletions.__init__€  s   € ØˆŒˆˆr   Úkwargsr   r   c                ó&   —  | j         j        di |¤ŽS )Nr   )rÚ   Ú_create_chat_completion)rÜ   rÞ   s     r   Úcreatez_ACPChatCompletions.createƒ  s   € Ø3ˆtŒ|Ô3Ð=Ð=°fÐ=Ð=Ð=r   N©r×   rØ   )rÞ   r   r   r   )Ú__name__Ú
__module__Ú__qualname__rÝ   rá   r   r   r   rÖ   rÖ     s<   € € € € € ðð ð ð ð>ð >ð >ð >ð >ð >r   rÖ   c                  ó   — e Zd Zdd„ZdS )Ú_ACPChatNamespacer×   rØ   c                ó.   — t          |¦  «        | _        d S r   )rÖ   ÚcompletionsrÛ   s     r   rÝ   z_ACPChatNamespace.__init__ˆ  s   € Ý.¨vÑ6Ô6ˆÔÐÐr   Nrâ   )rã   rä   rå   rÝ   r   r   r   rç   rç   ‡  s(   € € € € € ð7ð 7ð 7ð 7ð 7ð 7r   rç   c            	      ó^   — e Zd ZdZdddddddddœd/d„Zd0d„Zdddddddœd1d „Zd2d&„Zd3d.„ZdS )4ÚCopilotACPClientz8Minimal OpenAI-client-compatible facade for Copilot ACP.N)Úapi_keyÚbase_urlÚdefault_headersÚacp_commandÚacp_argsÚacp_cwdÚcommandÚargsrì   r^   rí   rî   údict[str, str] | Nonerï   rð   úlist[str] | Nonerñ   rò   ró   Ú_r   c               óÖ  — |pd| _         |pt          | _        t          |pi ¦  «        | _        |p|pt          ¦   «         | _        t          |p|pt          ¦   «         ¦  «        | _	        t          t          |pt          j        ¦   «         ¦  «                             ¦   «         ¦  «        | _        t!          | ¦  «        | _        d| _        d | _        t)          j        ¦   «         | _        d S )Núcopilot-acpF)rì   ÚACP_MARKER_BASE_URLrí   r|   Ú_default_headersr+   Ú_acp_commandr{   r2   Ú	_acp_argsr   r   r(   ÚgetcwdrÎ   Ú_acp_cwdrç   ÚchatÚ	is_closedÚ_active_processÚ	threadingÚLockÚ_active_process_lock)
rÜ   rì   rí   rî   rï   rð   rñ   rò   ró   rö   s
             r   rÝ   zCopilotACPClient.__init__�  sÊ   € ð Ð/ -ˆŒØ Ð7Õ$7ˆŒÝ $ _Ð%:¸Ñ ;Ô ;ˆÔØ'ÐH¨7ÐHÕ6FÑ6HÔ6HˆÔÝ˜hÐA¨$ÐAµ-±/´/ÑBÔBˆŒÝ�D Ð!7­B¬I©K¬KÑ8Ô8×@Ò@ÑBÔBÑCÔCˆŒÝ% dÑ+Ô+ˆŒ	ØˆŒØ=AˆÔÝ$-¤NÑ$4Ô$4ˆÔ!Ð!Ð!r   r   r­   c                ó<  — | j         5  | j        }d | _        d d d ¦  «         n# 1 swxY w Y   d| _        |€d S 	 |                     ¦   «          |                     d¬¦  «         d S # t
          $ r+ 	 |                     ¦   «          Y d S # t
          $ r Y Y d S w xY ww xY w)NTé   ©Útimeout)r  r  r   Ú	terminateÚwaitr>   Úkill)rÜ   Úprocs     r   ÚclosezCopilotACPClient.close§  s	  € àÔ&ð 	(ð 	(ØÔ'ˆDØ#'ˆDÔ ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð ˆŒØˆ<ØˆFð	Ø�NŠNÑÔÐØ�IŠI˜aˆIÑ Ô Ð Ð Ð øÝð 	ð 	ð 	ðØ—	’	‘”����øÝð ð ð Ø���ðøøøð	øøøs5   ˆ#£'ª'º*A& Á&
BÁ1BÂ
BÂBÂBÂBF)r]   r[   r  r_   ra   Ústreamr]   r[   r`   r  úfloat | Noner_   ra   r  r   c               óF  ‡— t          |pg |||¬¦  «        }‰€t          }	n^t          ‰t          t          f¦  «        rt	          ‰¦  «        }	n2ˆfd„dD ¦   «         }
d„ |
D ¦   «         }|rt          |¦  «        nt          }	|                      ||	¬¦  «        \  }}t          |¦  «        \  }}t          dddt          d¬¦  «        ¬¦  «        }t          |||pd |pd d ¬	¦  «        }|rd
nd}t          ||¬¦  «        }t          |g||pd¬¦  «        }|rt          |¦  «        S |S )N)r]   r_   ra   c                ó2   •— g | ]}t          ‰|d ¦  «        ‘ŒS r   )r£   )r   Úattrr  s     €r   ú
<listcomp>z<CopilotACPClient._create_chat_completion.<locals>.<listcomp>Ò  s5   ø€ ð ð ð àõ ˜  tÑ,Ô,ðð ð r   )ÚreadÚwriteÚconnectÚpoolr  c                ód   — g | ]-}t          |t          t          f¦  «        ¯t          |¦  «        ‘Œ.S r   )rz   rL   Úfloat)r   Úvs     r   r  z<CopilotACPClient._create_chat_completion.<locals>.<listcomp>Ö  s1   € ÐUÐUÐU Q½ÀAÍÍUÀ|Ñ9TÔ9TÐU�˜a™œÐUÐUÐUr   )Útimeout_secondsr   )Úcached_tokens)Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚprompt_tokens_details)rp   r›   r�   rœ   Úreasoning_detailsr›   Ústop)rM   rŸ   rø   )r    r¡   r]   )
r‰   Ú_DEFAULT_TIMEOUT_SECONDSrz   rL   r  rÂ   Ú_run_promptrÈ   r   r©   )rÜ   r]   r[   r  r_   ra   r  rö   Úprompt_textÚ_effective_timeoutÚ_candidatesÚ_numericÚresponse_textÚreasoning_textr›   Úcleaned_textr¡   Úassistant_messagerŸ   r¤   r—   s      `                 r   rà   z(CopilotACPClient._create_chat_completion¸  s­  ø€ õ 1ØˆN˜ØØØ#ð	
ñ 
ô 
ˆð ˆ?Ý!9ÐÐÝ˜¥#¥u Ñ.Ô.ð 
	YÝ!& w¡¤ÐÐðð ð ð àKðñ ô ˆKð VÐU¨+ÐUÑUÔUˆHØ2:Ð!X¥ X¡¤ Õ@XÐà(,×(8Ò(8ØØ.ð )9ñ )
ô )
Ñ%ˆ�~õ
 $AÀÑ#OÔ#OÑ ˆ
�LåØØØÝ"1ÀÐ"BÑ"BÔ"Bð	
ñ 
ô 
ˆõ ,Ø Ø!Ø$Ð,¨Ø,Ð4°Ø"ð
ñ 
ô 
Ðð )3Ð>˜˜¸ˆÝ Ð):È-ÐXÑXÔXˆÝ$Ø�HØØÐ(˜=ð
ñ 
ô 
ˆ
ð
 ð 	<Ý/°
Ñ;Ô;Ð;ØÐr   r%  r   r  r  útuple[str, str]c               óô  ‡ ‡‡‡‡‡— 	 ddl m} t          j        ‰ j        g‰ j        z   t          j        t          j        t          j        dddd‰ j        t          ¦   «          |¦   «         ¬¦  «        Šn+# t          $ r}t          d‰ j        › d	�¦  «        |‚d }~ww xY w‰j        �‰j        €#‰                     ¦   «          t          d
¦  «        ‚d‰ _        ‰ j        5  ‰‰ _        d d d ¦  «         n# 1 swxY w Y   t#          j        ¦   «         Št'          d¬¦  «        Šd.ˆˆfd„}d.ˆˆfd„}t)          j        |d¬¦  «        }t)          j        |d¬¦  «        }|                     ¦   «          |                     ¦   «          dŠd d dœd/ˆˆˆˆ ˆˆfd„}		  |	ddddddœid d!d"d#œd$œ¦  «          |	d%‰ j        g d&œ¦  «        pi }
t/          |
                     d'¦  «        pd(¦  «                             ¦   «         }|st          d)¦  «        ‚g }g } |	d*|d+|d,œgd-œ||¬¦  «         d(                     |¦  «        d(                     |¦  «        f‰                      ¦   «          S # ‰                      ¦   «          w xY w)0Nr   )Úwindows_hide_flagsTúutf-8Úreplacer°   )
ÚstdinÚstdoutÚstderrr‹   ÚencodingÚerrorsÚbufsizerÊ   rH   Úcreationflagsz%Could not start Copilot ACP command 'zQ'. Install GitHub Copilot CLI or set HERMES_COPILOT_ACP_COMMAND/COPILOT_CLI_PATH.z6Copilot ACP process did not expose stdin/stdout pipes.Fé(   )Úmaxlenr   r­   c                 óò   •— ‰j         €d S ‰j         D ]d} 	 ‰                     t          j        | ¦  «        ¦  «         Œ+# t          $ r- ‰                     d|                      d¦  «        i¦  «         Y Œaw xY wd S )Nr1   rŒ   )r3  Úputr}   r±   r>   Úrstrip)ÚlineÚinboxr  s    €€r   Ú_stdout_readerz4CopilotACPClient._run_prompt.<locals>._stdout_reader  s“   ø€ ØŒ{Ð"Ø�Øœð :ð :�ð:Ø—I’I�dœj¨Ñ.Ô.Ñ/Ô/Ð/Ð/øÝ ð :ð :ð :Ø—I’I˜u d§k¢k°$Ñ&7Ô&7Ð8Ñ9Ô9Ð9Ð9Ð9ð:øøøð:ð :s   •'=½4A4Á3A4c                 ó~   •— ‰j         €d S ‰j         D ]*} ‰                     |                      d¦  «        ¦  «         Œ+d S )NrŒ   )r4  ry   r=  )r>  r  Ústderr_tails    €€r   Ú_stderr_readerz4CopilotACPClient._run_prompt.<locals>._stderr_reader#  sN   ø€ ØŒ{Ð"Ø�Øœð 6ð 6�Ø×"Ò" 4§;¢;¨tÑ#4Ô#4Ñ5Ô5Ð5Ð5ð6ð 6r   )ÚtargetÚdaemon)Ú
text_partsÚreasoning_partsÚmethodr   ÚparamsrN   rF  rõ   rG  r   c               ó¼  •— ‰dz  Š‰}d|| |dœ}‰j                              t          j        |¦  «        dz   ¦  «         ‰j                              ¦   «          t          j        ¦   «         ‰z   }t          j        ¦   «         |k     rÖ‰                     ¦   «         �nÁ	 ‰
                     d¬¦  «        }n# t          j
        $ r Y ŒUw xY w‰                     |‰‰j        ||¬¦  «        rŒy|                     d¦  «        |k    rŒ“d	|v rA|                     d	¦  «        pi }t          d
| › d|                     d¦  «        p|› �¦  «        ‚|                     d¦  «        S d                     ‰¦  «                             ¦   «         }	‰                     ¦   «         �5|	r3t!          |	¦  «        rt          d|	› �¦  «        ‚t          d|	› �¦  «        ‚t#          d| › d�¦  «        ‚)Nr°   rP   )rQ   rR   rH  rI  rŒ   gš™™™™™¹?r  )ÚprocessrÊ   rF  rG  rR   rS   zCopilot ACP z	 failed: rM   rY   a0  Hermes ACP mode requires the NEW GitHub Copilot CLI (github.com/github/copilot-cli), but the binary it just spawned is the deprecated `gh copilot` extension.

Install the new CLI:
  npm install -g @github/copilot
  # then verify with: copilot --help

If `copilot` already resolves to the new CLI but you still see this,
point Hermes at it explicitly:
  export HERMES_COPILOT_ACP_COMMAND=/path/to/new/copilot

Alternative: use the `copilot` provider (no ACP, hits the Copilot API
directly with a Copilot subscription token) via `hermes setup`.

Original error:
z"Copilot ACP process exited early: z.Timed out waiting for Copilot ACP response to ú.)r2  r  r}   r~   ÚflushÚtimeÚ	monotonicÚpollr7   ÚqueueÚEmptyÚ_handle_server_messagerþ   ÚRuntimeErrorr�   r*   r"   ÚTimeoutError)rH  rI  rF  rG  Ú
request_idÚpayloadÚdeadlineÚmsgÚerrr   r?  Únext_idr  rÜ   rB  r  s             €€€€€€r   Ú_requestz.CopilotACPClient._run_prompt.<locals>._request0  s&  ø€ à�q‰LˆGØ ˆJà Ø Ø Ø ð	ð ˆGð ŒJ×Ò�TœZ¨Ñ0Ô0°4Ñ7Ñ8Ô8Ð8ØŒJ×ÒÑÔÐå”~Ñ'Ô'¨/Ñ9ˆHÝ”.Ñ"Ô" XÒ-Ð-Ø—9’9‘;”;Ð*ØðØŸ)š)¨C˜)Ñ0Ô0�C�CøÝ”{ð ð ð Ø�Hðøøøð ×.Ò.ØØ ØœØ)Ø$3ð /ñ ô ð ð à—7’7˜4‘=”= JÒ.Ð.ØØ˜c�>�>ØŸ'š' 'Ñ*Ô*Ð0¨b�CÝ&ØS vÐSÐS¸¿ºÀ	Ñ8JÔ8JÐ8QÈcÐSÐSñô ð ð —w’w˜xÑ(Ô(Ð(àŸ)š) KÑ0Ô0×6Ò6Ñ8Ô8ˆKØ�yŠy‰{Œ{Ð&¨;Ð&Ý5°kÑBÔBð Ý&ð:ð -8ð:ð :ñô ð õ #Ð#UÈÐ#UÐ#UÑVÔVÐVÝÐYÐPVÐYÐYÐYÑZÔZÐZs   ÂB2 Â2CÃCÚ
initializeÚfs)ÚreadTextFileÚwriteTextFilezhermes-agentzHermes Agentz0.0.0)rd   r€   Úversion)ÚprotocolVersionÚclientCapabilitiesÚ
clientInfozsession/new)rÊ   Ú
mcpServersÚ	sessionIdr%   z'Copilot ACP did not return a sessionId.zsession/promptr‹   )r”   r‹   )rf  Úprompt©r   r­   )
rH  r   rI  rN   rF  rõ   rG  rõ   r   r   )Úhermes_cli._subprocess_compatr/  Ú
subprocessÚPopenrû   rü   ÚPIPErþ   rI   ÚFileNotFoundErrorrT  r2  r3  r  r   r  r  rQ  ÚQueuer   r  ÚThreadr¾   r   r7   r*   r�   r  )rÜ   r%  r  r/  rÓ   r@  rC  Ú
out_threadÚ
err_threadr\  ÚsessionÚ
session_idrF  rG  r?  r[  r  rB  s   ` `           @@@@r   r$  zCopilotACPClient._run_promptø  sâ  øøøøøø€ ð	ð IÐHÐHÐHÐHÐHåÔ#ØÔ"Ð# d¤nÑ4Ý ”oÝ!”Ý!”Ø G°IØØ”MÝ)Ñ+Ô+Ø0Ð0Ñ2Ô2ð
ñ 
ô 
ˆDˆDøõ !ð 	ð 	ð 	Ýða¸Ô8Ið að að añô ð ðøøøøð	øøøð Œ:Ð ¤Ð!4Ø�IŠI‰KŒKˆKÝÐWÑXÔXÐXàˆŒØÔ&ð 	(ð 	(Ø#'ˆDÔ ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(õ .3¬[©]¬]ˆÝ"'¨rÐ"2Ñ"2Ô"2ˆð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6õ Ô%¨^ÀDÐIÑIÔIˆ
ÝÔ%¨^ÀDÐIÑIÔIˆ
Ø×ÒÑÔÐØ×ÒÑÔÐàˆà\`ð  GKð :	[ð :	[ð :	[ð :	[ð :	[ð :	[ð :	[ð :	[ð :	[ð :	[ð :	[ð :	[ð :	[ðx/	ØˆHØà'(àØ,0Ø-1ðð ð+ð !/Ø!/Ø#*ð#ð #ðð ñô ð ð" �hØàœ=Ø"$ðð ñô ð ð ð õ ˜WŸ[š[¨Ñ5Ô5Ð;¸Ñ<Ô<×BÒBÑDÔDˆJØð NÝ"Ð#LÑMÔMÐMà$&ˆJØ)+ˆOØˆHØ à!+ð %+Ø$/ðð ððð ð &Ø /ðñ ô ð ð —7’7˜:Ñ&Ô&¨¯ª°Ñ(@Ô(@Ð@à�JŠJ‰LŒLˆLˆLøˆD�JŠJ‰LŒLˆLˆLøøøs7   ˆA*A3 Á3
BÁ=BÂBÃC1Ã1C5Ã8C5ÆB9I! É!I7rY  rN   rK  úsubprocess.Popen[str]rÊ   rF  rG  c               óž  — |                      d¦  «        }t          |t          ¦  «        sdS |dk    r÷|                      d¦  «        pi }|                      d¦  «        pi }t          |                      d¦  «        pd¦  «                             ¦   «         }	|                      d¦  «        pi }
d}t          |
t          ¦  «        r$t          |
                      d	¦  «        pd¦  «        }|	d
k    r|r|�|                     |¦  «         n|	dk    r|r|�|                     |¦  «         dS |j        €dS |                      d¦  «        }|                      d¦  «        pi }|dk    rt          |¦  «        }�n�|dk    �r|	 t          t          |                      d¦  «        pd¦  «        |¦  «        }t          t          |¦  «        ¦  «        }|rt          |¦  «        ‚	 |                     d¬¦  «        }
n# t          $ r d}
Y nw xY w|                      d¦  «        }|                      d¦  «        }t          |t          ¦  «        r`|dk    rZ|
                     d¬¦  «        }|dz
  }t          |t          ¦  «        r|dk    r||z   nd }d                     |||…         ¦  «        }
|
rt!          |
d¬¦  «        }
d|d|
idœ}�nB# t"          $ r)}t%          |dt          |¦  «        ¦  «        }Y d }~�nd }~ww xY w|dk    rñ	 t          t          |                      d¦  «        pd¦  «        |¦  «        }t'          t          |¦  «        ¦  «        }|rt          |¦  «        ‚|j                             dd¬¦  «         |                     t          |                      d¦  «        pd¦  «        d¬¦  «         d|d dœ}nJ# t"          $ r(}t%          |dt          |¦  «        ¦  «        }Y d }~nd }~ww xY wt%          |dd|› d �¦  «        }|j                             t1          j        |¦  «        d!z   ¦  «         |j                             ¦   «          dS )"NrH  Fzsession/updaterI  ÚupdateÚsessionUpdater%   rp   r‹   Úagent_message_chunkÚagent_thought_chunkTrR   zsession/request_permissionzfs/read_text_filer8   r0  )r5  r>  Úlimitr°   )Úkeependsr   )ÚforcerP   rX   i¦€ÿÿzfs/write_text_file)ÚparentsÚexist_oki§€ÿÿzACP client method 'z!' is not supported by Hermes yet.rŒ   )r7   rz   r   r*   r|   ry   r2  rZ   rÔ   r   rÍ   Ú	read_textrm  rL   Ú
splitlinesr�   r   r>   rT   r   ÚparentÚmkdirÚ
write_textr  r}   r~   rM  )rÜ   rY  rK  rÊ   rF  rG  rH  rI  rv  Úkindrp   Ú
chunk_textrJ   Úresponser8   Úblock_errorr>  rz  Úlinesr¾   r¿   rÓ   Údenieds                          r   rS  z'CopilotACPClient._handle_server_message�  s«  € ð —’˜Ñ"Ô"ˆÝ˜&¥#Ñ&Ô&ð 	Ø�5àÐ%Ò%Ð%Ø—W’W˜XÑ&Ô&Ð,¨"ˆFØ—Z’Z Ñ)Ô)Ð/¨RˆFÝ�v—z’z /Ñ2Ô2Ð8°bÑ9Ô9×?Ò?ÑAÔAˆDØ—j’j Ñ+Ô+Ð1¨rˆGØˆJÝ˜'¥4Ñ(Ô(ð <Ý  §¢¨VÑ!4Ô!4Ð!:¸Ñ;Ô;�
ØÐ,Ò,Ð,°Ð,À
Ð@VØ×!Ò! *Ñ-Ô-Ð-Ð-ØÐ.Ò.Ð.°:Ð.À/ÐB]Ø×&Ò& zÑ2Ô2Ð2Ø�4àŒ=Ð Ø�4à—W’W˜T‘]”]ˆ
Ø—’˜Ñ"Ô"Ð( bˆàÐ1Ò1Ð1Ý)¨*Ñ5Ô5ˆH‰HØÐ*Ò*Ñ*ðHÝ.­s°6·:²:¸fÑ3EÔ3EÐ3KÈÑ/LÔ/LÈcÑRÔR�Ý2µ3°t±9´9Ñ=Ô=�Øð 7Ý)¨+Ñ6Ô6Ð6ð!Ø"Ÿnšn°g˜nÑ>Ô>�G�GøÝ(ð !ð !ð !Ø �G�G�Gð!øøøà—z’z &Ñ)Ô)�ØŸ
š
 7Ñ+Ô+�Ý˜d¥CÑ(Ô(ð 8¨T°AªX¨XØ#×.Ò.¸Ð.Ñ=Ô=�EØ  1™H�EÝ+5°e½SÑ+AÔ+AÐYÀeÈaÂiÀi˜% %™-˜-ÐUY�CØ Ÿgšg e¨E°#¨IÔ&6Ñ7Ô7�GØð IÝ3°GÀ4ÐHÑHÔH�Gà$Ø$à! 7ððð �‘øõ ð Hð Hð HÝ)¨*°f½cÀ#¹h¼hÑGÔG�����‘øøøøðHøøøàÐ+Ò+Ð+ðHÝ.­s°6·:²:¸fÑ3EÔ3EÐ3KÈÑ/LÔ/LÈcÑRÔR�Ý/µ°D±	´	Ñ:Ô:�Øð 2Ý)¨&Ñ1Ô1Ð1Ø”×!Ò!¨$¸Ð!Ñ>Ô>Ð>Ø—’¥ F§J¢J¨yÑ$9Ô$9Ð$?¸RÑ @Ô @È7�ÑSÔSÐSà$Ø$Ø"ðð ��øõ
 ð Hð Hð HÝ)¨*°f½cÀ#¹h¼hÑGÔG������øøøøðHøøøõ &ØØØO fÐOÐOÐOñô ˆHð 	Œ×Ò�DœJ xÑ0Ô0°4Ñ7Ñ8Ô8Ð8ØŒ×ÒÑÔÐØˆtsW   Å>AK ÇG5 Ç4K Ç5HÈK ÈHÈB=K Ë
K6ËK1Ë1K6Ì B:N; Î;
O-ÏO(Ï(O-)rì   r^   rí   r^   rî   rô   rï   r^   rð   rõ   rñ   r^   rò   r^   ró   rõ   rö   r   rh  )r]   r^   r[   r`   r  r  r_   r`   ra   r   r  r   rö   r   r   r   )r%  r   r  r  r   r-  )rY  rN   rK  rt  rÊ   r   rF  rõ   rG  rõ   r   r   )	rã   rä   rå   Ú__doc__rÝ   r  rà   r$  rS  r   r   r   rë   rë   Œ  sÌ   € € € € € ØBÐBð
 #Ø#Ø15Ø"&Ø%)Ø"Ø"Ø!%ð5ð 5ð 5ð 5ð 5ð 5ð0ð ð ð ð( !Ø04Ø $Ø-1ØØð>ð >ð >ð >ð >ð >ð@cð cð cð cðJWð Wð Wð Wð Wð Wr   rë   )r   r   r   r   )r   r   )r   r,   )r   rC   )rJ   r   rK   rL   rM   r   r   rN   )rJ   r   r   rN   )NNN)
r[   r\   r]   r^   r_   r`   ra   r   r   r   )rp   r   r   r   )r�   r   rd   r   r�   r   r   r	   )r—   r   r   r˜   )r‹   r   r   rª   )rÉ   r   rÊ   r   r   r   )5rŠ  Ú
__future__r   r}   r(   rQ  Úrer/   rj  r  rN  Úcollectionsr   Úpathlibr   Útypesr   Útypingr   Ú3openai.types.chat.chat_completion_message_tool_callr	   r
   Úagent.file_safetyr   r   Úagent.redactr   Útools.environments.localr   rù   r#  ÚcompileÚDOTALLr»   rÀ   r    r!   r"   r+   r2   rB   rI   rT   rZ   r‰   r   r–   r©   rÈ   rÔ   rÖ   rç   rë   r   r   r   ú<module>r—     s2  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð
 KÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ .Ð .Ð .Ð .Ð .Ð .Ø :Ð :Ð :Ð :Ð :Ð :à%Ð Ø Ð à �b”jÐ!JÈBÌIÑVÔVÐ Ø�R”Zð  !Hð  JLô  JSñ  Tô  TÐ ð (Ð ðÐ ðCð Cð Cð Cðð ð ð ðð ð ð ðð ð ð ð2	ð 	ð 	ð 	ðð ð ð ð	ð 	ð 	ð 	ð Ø)-Øð	H_ð H_ð H_ð H_ð H_ðV ð  ð  ð  ð0ð ð ð ð +%ð +%ð +%ð +%ð\Dð Dð Dð DðP
ð 
ð 
ð 
ð>ð >ð >ð >ð >ñ >ô >ð >ð7ð 7ð 7ð 7ð 7ñ 7ô 7ð 7ð
hð hð hð hð hñ hô hð hð hð hr   