Ë
    ãß²j5?  ã            	       óÎ  — d Z ddlZddlZddlZddlZddlZddlmZm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 dd	lmZ d
Zd$d„Zdedefd„Zdefd„Zdedededeej<                     fd„Zdedee   fd„Z dedee   fd„Z!dedee   fd„Z"dededefd„Z#deddfd„Z$dZ%dee   fd„Z&dedefd„Z'dededeee(   ee   f   fd „Z)d!e(dedeee   ee   f   fd"„Z*de+fd#„Z,y)%u¨  Real-profile local browsing: snapshot the user's default Chromium profile into a
hermes-owned copy, launch the real browser binary on it, and attach agent-browser.

State (``_REAL_PROFILE_SESSION``, ``_real_profile_cdp_lock``, ``_real_profile_cdp_cache``,
``_real_profile_chrome_procs``) lives in ``tools.browser_tool``; it is read
through ``_bt`` (resolved per call â€” never import ``tools.browser_tool`` at import time).
é    N)ÚOptionalÚTuple)Úloopback_request_kwargs)Úorigin_module)Úbrowser_tool_cloud)Úbrowser_tool_install)Ú browser_tool_lightpanda_fallback)Úbrowser_tool_sessionz$browser.use_real_profile is on, but Úreturnc                  óœ   — ddl m}  t        «       }|j                  r0 | |j                  j	                  «       d¬«       |j                  rŒ/yy)z´Terminate real-browser processes launched for real-profile sessions (idempotent, atexit-safe);
    agent-browser only ATTACHED to them, so its own session cleanup never kills them.r   )Ú
_terminatezreal-profile chrome)ÚwhatN)Útools.browser_lightpandar   Ú_originÚ_real_profile_chrome_procsÚpop)r   Ú_bts     úD/home/ubuntu/.hermes/hermes-agent/tools/browser_tool_real_profile.pyÚ_terminate_real_profile_chromer      s<   € õ 4Ü
‹)€CØ
×
(Ò
(Ù�3×1Ñ1×5Ñ5Ó7Ð>SÕTð ×
(Õ
(ó    Úhttp_cdpc                 ó"   — ddl m}  || d¬«      S )z=True when an ``http://host:port`` CDP discovery root answers.r   )Ú
_cdp_readyg      ð?)Útimeout)r   r   )r   r   s     r   Ú_cdp_http_readyr   "   s   € å3Ù�h¨Ô,Ð,r   c                  ó¦   — t        «       } t        j                  | j                  «      }t        j                  |«      }|j                  dd«       |S )uP  Reaper-visible socket dir + ``owner_pid`` claim like every other lane (agent-browser's
    default dir is invisible to the reaper â€” #100855). The daemon-side idle timeout is dropped:
    Chrome is launched by Hermes, not the daemon, so a self-exiting daemon would leave Chrome
    holding the copy dir under the next snapshot overlay.ÚAGENT_BROWSER_IDLE_TIMEOUT_MSN)r   Ú_sessionÚ_prepare_session_socket_dirÚ_REAL_PROFILE_SESSIONÚ_agent_browser_command_envr   )r   Ú
socket_dirÚenvs      r   Ú_real_profile_daemon_envr$   (   sE   € ô
 ‹)€CÜ×5Ñ5°c×6OÑ6OÓP€JÜ
×
-Ñ
-¨jÓ
9€CØ‡G�GÐ+¨TÔ2Ø€Jr   Úsession_nameÚcmdÚ	log_labelc          
      ó‚  — t        «       }	 t        j                  «       }	 t	        j
                  g t        j                  |«      ¢d‘| ‘|¢dddddt        «       t        j                  ¬«      S # t        $ r Y yw xY w# t        j                  t        f$ r'}|j                  j                  d||«       Y d}~yd}~ww xY w)	zeRun ``agent-browser --session <name> <cmd...>``; None when agent-browser is missing or the run fails.Nú	--sessionTúutf-8Úreplaceé   ©Úcapture_outputÚtextÚencodingÚerrorsr   r#   Ústdinzreal-profile %s failed: %s)r   Ú_installÚ_find_agent_browserÚFileNotFoundErrorÚ
subprocessÚrunr   Ú_agent_browser_argvr$   ÚDEVNULLÚSubprocessErrorÚOSErrorÚloggerÚdebug)r%   r'   r&   r   Úbrowser_cmdÚes         r   Ú_agent_browser_session_cmdr@   4   s½   € ä
‹)€CðÜ×2Ñ2Ó4ˆðÜ�~‰~Ðk¤× <Ñ <¸[Ó IÐkÈ;ÐkÐXdÐkÐgjÐkØ-1¸ÀwÐW`ÐjlÜ":Ó"<ÄJ×DVÑDVôXð 	Xøô ò Ùðûô ×&Ñ&¬Ð0ò Ø�
‰
×ÑÐ5°yÀ!ÔDÜûðús)   ŒA/ ¡AA> Á/	A;Á:A;Á>B>ÂB9Â9B>c                 ó¼   — t        | ddd¬«      }|�2t        j                  d|j                  xs dj	                  «       «      nd}|rd|j                  d	«      › �S dS )
zZHTTP CDP discovery root of an agent-browser session (from its ``ws://`` cdp-url), or None.Úgetzcdp-urlzget cdp-url©r'   Nzws://127\.0\.0\.1:(\d+)/Ú úhttp://127.0.0.1:é   )r@   ÚreÚsearchÚstdoutÚstripÚgroup)r%   ÚprocÚms      r   Ú_agent_browser_get_cdprN   D   s[   € ä% l°E¸9ÐP]Ô^€DØOSÐO_Œ�	‰	Ð-°·±Ò0A¸r×/HÑ/HÓ/JÔKÐei€AÙ/0Ð˜qŸw™w q›z˜lÐ+Ð:°dÐ:r   Údata_dirc                 óà   — 	 t        t        j                  j                  | d«      d¬«      5 }|j	                  «       j                  «       cddd«       S # 1 sw Y   yxY w# t        $ r Y yw xY w)zUFirst line of Chrome's ``DevToolsActivePort`` in ``data_dir`` (None when unreadable).ÚDevToolsActivePortr*   ©r0   N)ÚopenÚosÚpathÚjoinÚreadlinerJ   r;   )rO   Úfhs     r   Ú_read_devtools_portrY   K   s\   € ðÜ”"—'‘'—,‘,˜xÐ)=Ó>ÈÔQð 	)ÐUWØ—;‘;“=×&Ñ&Ó(÷	)÷ 	)ò 	)ûäò Ùðús.   ‚+A! ­AÁ	A! ÁAÁA! ÁA! Á!	A-Á,A-c           	      óP  — 	 t        t        j                  j                  | d«      d¬«      5 }|j	                  «       j                  «       |j	                  «       j                  «       }}ddd«       j                  «       rj                  d«      syd|› �}	 ddl	}t         |j                  |› d�fd	d
it        |«      ¤Žj                  «       j                  d«      xs d«      }|j                  |«      r|S dS # 1 sw Y   Œ•xY w# t        $ r Y yw xY w# t        $ r Y yw xY w)a  HTTP CDP root of a Chrome still running on ``data_dir``, or None. ``DevToolsActivePort``
    outlives a crashed Chrome and its port can be recycled by another local CDP server, so the
    file's browser id (line 2) must match what ``/json/version`` reports before it is trusted.rQ   r*   rR   Nz/devtools/browser/rE   r   z/json/versionr   é   ÚwebSocketDebuggerUrlrD   )rS   rT   rU   rV   rW   rJ   r;   ÚisdigitÚ
startswithÚrequestsÚstrrB   r   ÚjsonÚ	ExceptionÚendswith)rO   rX   ÚportÚbrowser_pathr   r_   Úws_urls          r   Ú_surviving_chrome_cdprg   T   s  € ðÜ”"—'‘'—,‘,˜xÐ)=Ó>ÈÔQð 	NÐUWØ!#§¡£×!4Ñ!4Ó!6¸¿¹»×8KÑ8KÓ8M�,ˆD÷	Nð �<‰<Œ> ×!8Ñ!8Ð9MÔ!NØØ" 4 &Ð)€HðÛÜ�\�X—\‘\ X J¨mÐ"<ÑmÀaÐmÔKbÐckÓKlÑmß‘d“fŸS™SÐ!7Ó8ò?Ø<>ó@ˆð —‘ |Ô4ˆ8Ð>¸$Ð>÷	Nð 	Nûäò Ùðûô ò Ùðús;   ‚+D
 ­=C>Á*D
 ÂAD Ã>DÄD
 Ä
	DÄDÄ	D%Ä$D%c                 óŠ   — t        j                  d| xs d«      }t        |«      xr t        |«      |j	                  d«      k(  S )z³True when the CDP endpoint's browser runs on ``data_dir`` (DevToolsActivePort match proves it
    is our profile copy, not a throwaway temp dir a raced/stale launch fell back to).ú:(\d+)rD   rF   )rG   rH   ÚboolrY   rK   )r   rO   rM   s      r   Ú_cdp_on_data_dirrk   i   s:   € ô 	�	‰	�)˜Xš^¨Ó,€AÜ�‹7ÒBÔ*¨8Ó4¸¿¹À»
ÑBÐBr   c                 ó    — t        | dd¬«       y)zHBest-effort close of an agent-browser session (stale/wrong-dir cleanup).Úclosezsession closerC   N)r@   )r%   s    r   Ú_agent_browser_close_sessionrn   p   s   € ä˜|¨WÀÖPr   )z--remote-debugging-port=0z--no-first-runz--no-default-browser-checkz--disable-background-networkingz--disable-component-updatez--disable-default-appsz--disable-hang-monitorz--disable-popup-blockingz--disable-prompt-on-repostz--disable-syncz--disable-features=Translatez--no-startup-windowc                 óB   — ddl m} | €	t        dz   S | |k(  r	t        dz   S y)a  Fail-closed message when the default browser can't be used, else None.

    A pre-release channel lives in a profile dir we don't resolve; normalizing to the stable
    family would drive a DIFFERENT profile/account (wrong-principal bug), so refuse rather than guess.
    r   )ÚUNSUPPORTED_CHANNELNzºyour default browser is not a supported Chromium browser (Chrome, Edge, Brave, Brave Origin, Chromium). Real-profile browsing requires a Chromium default; set one or turn the toggle off.záyour default browser is a pre-release Chromium channel (Beta / Dev / Canary), which real-profile browsing does not support. Set your default to a stable Chrome / Edge / Brave / Brave Origin / Chromium, or turn the toggle off.)Úhermes_cli.browser_connectrp   Ú_RP)Úbrowserrp   s     r   Ú _real_profile_unsupported_reasonrt   }   sD   € õ ?Ø€Üð ~ñ ~ð 	àÐ%Ò%Üð bñ bð 	cð r   Úerrc                 ój   — ddl m} | r"| j                  |«      r| t        |«      d dz   S t        › | › �S )z°User-facing message for a failed profile snapshot; a locked profile adds the approved-close
    command, which the agent must ASK the user about first (it quits their browser).r   )Ú_PROFILE_LOCKED_PREFIXNu�    To close it (only after the user approves â€” it quits their browser and loses unsaved tabs), run: `hermes browser close-profile`, then retry.)rq   rw   r^   Úlenrr   )ru   rw   s     r   Ú_real_profile_snapshot_errorry   Ž   sH   € õ BÙ
ˆs�~‰~Ð4Ô5Ø”CÐ.Ó/Ð0Ð1ð 5pñ pð 	qäˆU�3�%ˆ=Ðr   Úreal_binaryÚcopy_dirc           	      óœ  — t        «       }	 t        j                  t        j                  j	                  |d«      «       | d|› �gt        ¢}t        t        j                  j                  d«      xs t        j                  j                  d«      «      }t        j                  «       r!|s0t        j                  j                  d«      r|j                  d«       	 t!        j"                  |t         j$                  t         j$                  t         j$                  d|j'                  «       ¬«      }|j,                  j                  |«       t/        j0                  «       dz   }t/        j0                  «       |k  r~t3        |«      xs d}|j5                  «       rt7        |«      d	fS |j9                  «       �t;        «        d	t*        dz   fS t/        j<                  d«       t/        j0                  «       |k  rŒ~t;        «        d	t*        dz   fS # t
        $ r Y �ŒØw xY w# t         j(                  t
        f$ r}d	t*        › d
|› �fcY d	}~S d	}~ww xY w)a§  Launch the user's REAL browser binary on the profile COPY; return (debug_port, error).

    agent-browser's own launch force-adds --use-mock-keychain / --password-store=basic, which makes
    macOS Chrome drop every keychain-encrypted cookie (signed-out copy); launching the real binary
    ourselves keeps the OS keychain path intact and agent-browser attaches via ``--cdp <port>``.
    Headless by default (a focus-stealing window defeats a background capability); Chrome's NEW
    headless shares the profile's cookie store (legacy --headless does not). browser.headed /
    AGENT_BROWSER_HEADED opts into a window, except on a display-less Linux host (launch would die).
    rQ   z--user-data-dir=ÚDISPLAYÚWAYLAND_DISPLAYÚlinuxz--headless=newT)rI   Ústderrr2   Ústart_new_sessionr#   Núthe launch failed: g      >@rD   zJChrome exited during startup (another instance may hold the profile copy).g      Ð?z\the real-profile browser did not expose a debug port in time. Retry, or turn the toggle off.)r   rT   ÚunlinkrU   rV   r;   Ú_REAL_PROFILE_CHROME_FLAGSrj   ÚenvironrB   Ú_cloudÚ_is_headed_modeÚsysÚplatformr^   Úappendr6   ÚPopenr9   Ú_build_browser_envr:   rr   r   ÚtimeÚ	monotonicrY   r]   ÚintÚpollr   Úsleep)	rz   r{   r   Úchrome_argvÚ_has_displayÚchrome_procr?   ÚdeadlineÚlines	            r   Ú_launch_real_profile_chromer—   ˜   sß  € ô ‹)€CðÜ
�	‰	”"—'‘'—,‘,˜xÐ)=Ó>Ô?ð Ð"2°8°*Ð =Ð[Ô@ZÐ[€KÜœŸ
™
Ÿ™ yÓ1ÒV´R·Z±Z·^±^ÐDUÓ5VÓW€LÜ×"Ñ"Ô$©,¼c¿l¹l×>UÑ>UÐV]Ô>^Ø×ÑÐ+Ô,ð4Ü ×&Ñ& {¼:×;MÑ;MÔV`×VhÑVhÜ-7×-?Ñ-?ÐSWÐ]`×]sÑ]sÓ]uôwˆð ×"Ñ"×)Ñ)¨+Ô6ä�~‰~Ó $Ñ&€HÜ
�.‰.Ó
˜XÒ
%Ü" 8Ó,Ò2°ˆØ�<‰<Œ>Ü�t“9˜d�?Ð"Ø×ÑÓÐ)Ü*Ô,ØœÐkÑkÐkÐkÜ�
‰
�4Ôô �.‰.Ó
˜XÓ
%ô #Ô$Ø”ÐuÑuÐuÐuøô/ ò Úðûô ×&Ñ&¬Ð0ò 4Øœ�uÐ/°¨sÐ3Ð3Õ3ûð4ús0   Œ3H ÃAH È	HÈHÈIÈ4IÉ IÉIrd   c           
      óÈ  — t        «       }	 t        j                  «       }g t        j                  |«      ¢d‘|j                  ‘d‘t        | «      ‘d‘d‘}	 t        j                  |dddd	|j                  d¬
«      t        «       t        j                  ¬«      }|j"                  dk7  r^|j$                  xs |j&                  xs dj)                  «       j+                  «       }dt        › d|r|d   › �fS d|j"                  › �› �fS t-        |j                  «      }t/        |«      }	|	�5t1        j2                  d|xs d«      x}
r|
j5                  d«      |	k7  rd|	› �}|sdt        dz   fS |dfS # t        $ r}dt        › d|› �fcY d}~S d}~ww xY w# t        j                  $ r dt        dz   fcY S t        j                  t         f$ r}dt        › d|› �fcY d}~S d}~ww xY w)a  Make agent-browser ATTACH to the running Chrome (never launch its own); returns ``(http_cdp, error)``.

    The daemon may answer with the endpoint of a browser IT spawned (throwaway temp profile);
    the DevToolsActivePort OUR Chrome wrote is authoritative on disagreement.
    Nz;the local browser engine (agent-browser) is not installed: r)   z--cdprS   zabout:blankTr*   r+   )Ú
first_openr-   zOthe real-profile browser took too long to start. Retry, or turn the toggle off.r‚   r   rD   z*the real-profile browser failed to start: éÿÿÿÿzexit ri   rF   rE   zethe real-profile browser started without exposing a devtools endpoint. Retry, or turn the toggle off.)r   r3   r4   r5   rr   r   r8   r    r`   r6   r7   Ú_get_open_command_timeoutr$   r9   ÚTimeoutExpiredr:   r;   Ú
returncoder€   rI   rJ   Ú
splitlinesrN   rY   rG   rH   rK   )rd   r{   r   r>   r?   ÚargvrL   ÚtailÚcdpÚour_portrM   s              r   Ú%_attach_agent_browser_to_real_profiler£   ¿   s"  € ô ‹)€Cð\Ü×2Ñ2Ó4ˆð7ŒX×)Ñ)¨+Ó6ð 7¸ð 7ÀS×E^ÑE^ð 7Øð7Ü˜“Yð7Ø &ð7Ø(5ð7€Dð4Ü�~‰~˜d°4¸dÈWÐ]fØ&)×&CÑ&CÈtÐ&CÓ&TÔZrÓZtÜ$.×$6Ñ$6ô8ˆð ‡�˜!ÒØ—‘Ò0˜tŸ{™{Ò0¨b×7Ñ7Ó9×DÑDÓFˆØœ�uÐFÑSWÀtÈBÁxÐFwÐxÐxÐxÐ_dÐei×etÑetÐduÐ]vÐFwÐxÐxÐxÜ
  ×!:Ñ!:Ó
;€CÜ" 8Ó,€HØÐ¤b§i¡i°	¸3º9À"Ó&EÐ!E Ð!EÈ1Ï7É7ÐSTË:ÐYaÒKaØ! ( Ð,ˆÙØ”Sð  Cñ  Cð  Cð  	CØ�ˆ9Ðøô+ ò \Øœ�uÐWÐXYÐWZÐ[Ð[Õ[ûð\ûô ×$Ñ$ò mØ”SÐlÑlÐlÒlÜ×&Ñ&¬Ð0ò 4Øœ�uÐ/°¨sÐ3Ð3Õ3ûð4úsB   ŒE/ ÁAF Å/	FÅ8F
ÆFÆ
FÆG!Æ2G!Ç
GÇG!ÇG!c            	      óî  — t        «       } t        j                  «       s+	 ddlm}  |«        | j                  j                  dd«       yt        j                  «       rdt        dz   fS ddlm}m}m}m} | j"                  5  | j                  j%                  d«      }|r7t'        |«      r,t)        j*                  | j,                  «       |dfcddd«       S | j                  j                  dd«        |«       }t/        |«      }	|	rd|	fcddd«       S  ||«      }
t1        | j,                  «      }|r3t'        |«      r(t3        ||
«      r|| j                  d<   |dfcddd«       S |rt5        | j,                  «       t7        |
«      }|rst9        t;        |j=                  d	d
«      d
   «      |
«      \  }}|sd|fcddd«       S || j                  d<   | j                  j?                  d||
«       |dfcddd«       S  ||«      \  }
}|s|
sdtA        |«      fcddd«       S  ||«      }|€dt        › d|› d�fcddd«       S tC        ||
«      \  }}|€d|fcddd«       S t9        ||
«      \  }}|sd|fcddd«       S || j                  d<   | j                  j?                  d|||
«       |dfcddd«       S # t
        $ r'}| j                  j                  d|«       Y d}~�Œ¶d}~ww xY w# 1 sw Y   yxY w)aÕ  Resolve ``(cdp_url, error)`` for consented real-profile browsing.

    Snapshot -> launch real binary on the copy -> return its HTTP CDP endpoint. The copy is a
    non-default dir, so it sidesteps the Chrome >=136 default-profile remote-debugging block and
    never contends with the user's running browser. One shared agent-browser session is reused
    across calls (cached, re-validated). ``(None, message)`` fail-closed; ``(None, None)`` when consent is off.
    r   )Úcleanup_real_profile_snapshotsz.real-profile cleanup-on-consent-off failed: %sNr¡   )NNz°browser.engine is set to 'lightpanda', which cannot load a real Chromium profile. Set browser.engine to 'auto' or 'chrome' to use real-profile browsing, or turn the toggle off.)Úchromium_executableÚdetect_default_chromiumÚreal_profile_copy_dirÚsnapshot_real_profileú:rF   z8real-profile: re-attached to surviving Chrome at %s (%s)zthe real browser binary for 'z:' could not be found. Reinstall it or turn the toggle off.z,real-profile browser ready for %s at %s (%s))"r   r†   Ú_use_real_profilerq   r¥   rb   r<   r=   Ú_real_profile_cdp_cacher   Ú_lpÚ_using_lightpanda_enginerr   r¦   r§   r¨   r©   Ú_real_profile_cdp_lockrB   r   r   r   r    rt   rN   rk   rn   rg   r£   r�   ÚrsplitÚinfory   r—   )r   r¥   r?   r¦   r§   r¨   r©   Úcachedrs   Úunsupportedr{   ÚexistingÚ	survivingr¡   ru   rz   rd   s                    r   Ú_real_profile_cdpr¶   à   s3  € ô ‹)€CÜ×#Ñ#Ô%ð	RÝQÙ*Ô,ð 	×#Ñ#×'Ñ'¨¨tÔ4Øô ×#Ñ#Ô%Ø”cð wñ wð xð 	x÷Zó Zð 
×	#Ñ	#ñ 3Ø×,Ñ,×0Ñ0°Ó7ˆÙ”o fÔ-ô ×0Ñ0°×1JÑ1JÔKØ˜4�<÷3ñ 3ð 	×#Ñ#×'Ñ'¨¨tÔ4á)Ó+ˆÜ6°wÓ?ˆÙØ˜Ð$÷3ñ 3ñ" )¨Ó1ˆÜ)¨#×*CÑ*CÓDˆÙœ¨Ô1Ô6FÀxÐQYÔ6ZØ19ˆC×'Ñ'¨Ñ.Ø˜T�>÷+3ñ 3ñ, Ü(¨×)BÑ)BÔCô
 *¨(Ó3ˆ	ÙÜ<¼SÀ×AQÑAQÐRUÐWXÓAYÐZ[ÑA\Ó=]Ð_gÓh‰HˆC�ÙØ˜S�y÷A3ñ 3ðB 25ˆC×'Ñ'¨Ñ.Ø�J‰J�O‰OÐVÐX[Ð]eÔfØ˜�9÷G3ñ 3ñJ .¨gÓ6‰ˆ�#Ù‘hØÔ5°cÓ:Ð:÷O3ñ 3ñP *¨'Ó2ˆØÐØœC˜5Ð =¸g¸Yð  GAð  Bð  B÷U3ñ 3ôV 0°¸XÓF‰	ˆˆcØˆ<Ø˜�9÷[3ñ 3ô\ 9¸¸xÓH‰ˆˆSÙØ˜�9÷a3ñ 3ðb .1ˆ×#Ñ# EÑ*Ø�
‰
�‰ÐFÈÐQTÐV^Ô_Ø�Dˆy÷g3ñ 3øô ò 	RØ�J‰J×ÑÐMÈq×QÒQûð	Rú÷3ð 3ús\    J8 ÂAK+Ã3K+ÄAK+Å%AK+Ç/K+Ç<K+È!K+ÉK+É K+É>0K+Ê8	K(ËK#Ë#K(Ë+K4)r   N)-Ú__doc__rT   rG   r6   rˆ   r�   Útypingr   r   Úagent.proxy_bypassr   Útools.browser_tool_originr   r   Útoolsr   r†   r   r3   r	   r­   r
   r   rr   r   r`   rj   r   Údictr$   ÚCompletedProcessr@   rN   rY   rg   rk   rn   r„   rt   ry   r�   r—   r£   Útupler¶   © r   r   ú<module>rÀ      s   ðñó 
Û 	Û Û 
Û ß "Ý 6Ý >Ý .Ý 2Ý 9Ý 2à,€óUð-˜cð - dó -ð	 $ó 	ð¨Sð ¸ð Èð ÐPXÐYc×YtÑYtÑPuó ð ;¨ð ;°¸#±ó ;ð #ð ¨(°3©-ó ð? Cð ?¨H°S©Mó ?ð*C˜sð C¨cð C°dó CðQ¨sð Q°tó Qð
Ð ð°¸#±ó ð" cð ¨có ð$v¨Sð $v¸Cð $vÀEÈ(ÐSVÉ-ÐYaÐbeÑYfÐJfÑDgó $vðN°ð ¸sð ÀuÈXÐVYÉ]Ð\dÐehÑ\iÐMiÑGjó ðBP˜5ô Pr   