Ë
    âß²j«  ã            	      ó€  — 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dddddddœZddddœZdd	„Z	ej                  dd
„«       Zej                  dd„«       Zdd„Zd d„Zd!d„Zej                  dd„«       ZdZddœd"d„Zd#d$d„Zd%d„Zd&d„Zd'd„Zej                  dd„«       Zej                  dd„«       Zd!d„Zd!d„Zd(d„Zy))z‹Cached OS, architecture, and CPU facts for the current machine.

Native architecture remains accurate when the Python process is emulated.
é    )ÚannotationsNÚamd64Úarm64Úx86)r   Úx86_64Úx64r   Úaarch64r   Úi386Úi686)id†  idª  iL  c                ón   — t         j                  | xs dj                  «       j                  «       d«      S )z%Return a canonical architecture name.Ú Úunknown)Ú_ARCH_NAMESÚgetÚstripÚlower)Úraws    ú?/home/ubuntu/.hermes/hermes-agent/hermes_platform/host/facts.pyÚnormalize_archr      s)   € ä�?‰?˜CšI 2×,Ñ,Ó.×4Ñ4Ó6¸	ÓBÐBó    c                 ó"   — t         j                  S )z'Return the current platform identifier.)ÚsysÚplatform© r   r   Ú	os_familyr      s   € ô �<‰<Ðr   c                 ó<   — t        t        j                  «       «      S )z/Return the architecture of this Python process.)r   r   Úmachiner   r   r   Úprocess_archr       s   € ô œ(×*Ñ*Ó,Ó-Ð-r   c                óv   — t         j                  | xs d«      }|r|S t        |«      }|dk7  r|S t        |«      S )zøReturn the native architecture from Windows observations.

    Order matters: ``PROCESSOR_ARCHITECTURE`` reads ``AMD64`` inside an x64-emulated process
    on ARM64 hardware, so the environment is consulted only when both APIs are unavailable.
    r   r   )ÚIMAGE_FILE_MACHINEr   r   )Úwow64_nativer   Úenv_archÚnameÚ
normalizeds        r   Úwindows_native_archr%   &   sD   € ô ×!Ñ! ,Ò"3°!Ó4€DÙØˆÜ Ó(€JØ�YÒØÐÜ˜(Ó#Ð#r   c                 ó4  — ddl } ddl m} | j                  dd¬«      }t        |dd«      }|€y|j                  |j
                  _        g |j
                  _        |j                  | j                  |j                  «      | j                  |j                  «      g|_        |j                  |_        |j                  d«      }|j                  d«      } ||j                  «       | j                  |«      | j                  |«      «      sy|j                  xs dS )zHReturn the IsWow64Process2 native machine, or ``None`` when unavailable.r   N©ÚwintypesÚkernel32T©Úuse_last_errorÚIsWow64Process2)Úctypesr(   ÚWinDLLÚgetattrÚHANDLEÚGetCurrentProcessÚrestypeÚargtypesÚPOINTERÚUSHORTÚBOOLÚbyrefÚvalue)r-   r(   r)   ÚprobeÚprocess_machineÚnative_machines         r   Ú_wow64_native_machiner<   5   sã   € ãÝà�}‰}˜Z¸ˆ}Ó=€HÜ�HÐ/°Ó6€EØ€}Øà)1¯©€H×ÑÔ&Ø*,€H×ÑÔ'Ø—o‘o v§~¡~°h·o±oÓ'FÈÏÉÐW_×WfÑWfÓHgÐh€E„NØ—M‘M€E„MØ—o‘o aÓ(€OØ—_‘_ QÓ'€NÙ�×+Ñ+Ó-¨v¯|©|¸OÓ/LÈfÏlÉlÐ[iÓNjÔkØØ×ÑÒ' 4Ð'r   c                 ó   — t        d«      dk(  S )z/Return whether this process runs under Rosetta.s   sysctl.proc_translatedé   )Ú_sysctl_intr   r   r   Ú_darwin_translatedr@   J   s   € äÐ0Ó1°QÑ6Ð6r   c                 óª  — t         j                  dk(  rk	 t        «       } t        j                  j                  d«      xs t        j                  j                  d«      }t        | t        j                  «       |¬«      S t         j                  dk(  rt        «       dk(  rt        «       ryt        «       S # t        t        t
        t        f$ r d} Y Œ²w xY w)	zCReturn the machine architecture even when this process is emulated.Úwin32NÚPROCESSOR_ARCHITEW6432ÚPROCESSOR_ARCHITECTURE)r!   r   r"   Údarwinr   r   )r   r   r<   ÚOSErrorÚAttributeErrorÚ	TypeErrorÚ
ValueErrorÚosÚenvironr   r%   r   r   r@   )Úwow64r"   s     r   Únative_archrM   O   s£   € ô ‡|�|�wÒð	Ü)Ó+ˆEô —:‘:—>‘>Ð":Ó;Òg¼r¿z¹z¿~¹~ÐNfÓ?gˆÜ"°¼x×?OÑ?OÓ?QÐ\dÔeÐeÜ
‡|�|�xÒ¤L£N°gÒ$=ÔBTÔBVØÜ‹>Ðøô œ¬´JÐ?ò 	ØŠEð	ús   •
B4 Â4CÃCz.HARDWARE\DESCRIPTION\System\CentralProcessor\0r   ©Údevice_tree_modelc               óL  — dD ]p  }| j                  «       D ][  }|j                  «       j                  |j                  «       «      sŒ1d|v sŒ6|j                  dd«      d   j	                  «       c c S  Œr |j                  dd«      j                  dd«      j	                  «       S )z4Return the first available CPU or device-tree model.)z
model nameÚHardwareú:r>   ú r   Ú_ú )Ú
splitlinesr   Ú
startswithÚsplitr   Úreplace)ÚtextrO   ÚkeyÚlines       r   Úparse_cpuinfor]   a   s‘   € à)ò 5ˆØ—O‘OÓ%ò 	5ˆDØ�z‰z‹|×&Ñ& s§y¡y£{Õ3¸¸tºØ—z‘z # qÓ)¨!Ñ,×2Ñ2Ó4Ô4ñ	5ð5ð ×$Ñ$ T¨2Ó.×6Ñ6°s¸CÓ@×FÑFÓHÐHr   c                óŽ   — 	 t        | ddd¬«      5 }|j                  |«      cd d d «       S # 1 sw Y   y xY w# t        $ r Y yw xY w)NÚrzutf-8rY   )ÚencodingÚerrorsr   )ÚopenÚreadrF   )ÚpathÚlimitÚhandles      r   Ú
_read_textrg   j   sI   € ðÜ�$˜ g°iÔ@ð 	&ÀFØ—;‘;˜uÓ%÷	&÷ 	&ò 	&ûäò Ùðús#   ‚8 ‘,¢	8 ¬5±8 µ8 ¸	AÁAc                óè   — dd l }	 |j                  |j                  | «      5 }|j                  ||«      d   }d d d «       t        «      j                  «       S # 1 sw Y   Œ"xY w# t        $ r Y yw xY w)Nr   r   )ÚwinregÚOpenKeyÚHKEY_LOCAL_MACHINEÚQueryValueExrF   Ústrr   )Úsubkeyr#   ri   r[   r8   s        r   Ú_winreg_strro   r   sr   € ÛðØ�^‰^˜F×5Ñ5°vÓ>ð 	6À#Ø×'Ñ'¨¨TÓ2°1Ñ5ˆE÷	6ô ˆu‹:×ÑÓÐ÷		6ð 	6ûäò Ùðús'   †A% ¢A¸A% ÁA"ÁA% Á%	A1Á0A1c                ób  — dd l }dd l}|j                  |j                  j	                  d«      «      }|j                  d«      }|j                  |j                  |j
                  «      «      }|j                  | |j                  |«      |j                  |«      d d«      dk7  ry |j                  S )Nr   Úc)r-   Úctypes.utilÚCDLLÚutilÚfind_libraryÚc_intÚc_size_tÚsizeofÚsysctlbynamer7   r8   )r#   r-   Úlibcr8   Úsizes        r   r?   r?   }   sˆ   € ÛÛà�;‰;�v—{‘{×/Ñ/°Ó4Ó5€DØ�L‰L˜‹O€EØ�?‰?˜6Ÿ=™=¨¯©Ó6Ó7€DØ×Ñ˜˜vŸ|™|¨EÓ2°F·L±LÀÓ4FÈÈaÓPÐTUÒUØØ�;‰;Ðr   c                ó²  — dd l }dd l}|j                  |j                  j	                  d«      «      }|j                  d«      }|j                  | d |j                  |«      d d«      dk7  ry|j                  |j                  «      }|j                  | ||j                  |«      d d«      dk7  ry|j                  j                  d¬«      j                  «       S )Nr   rq   r   rY   )ra   )r-   rr   rs   rt   ru   rw   ry   r7   Úcreate_string_bufferr8   Údecoder   )r#   r-   rz   r{   Úbuffers        r   Ú_sysctl_strr€   ‰   s¶   € ÛÛà�;‰;�v—{‘{×/Ñ/°Ó4Ó5€DØ�?‰?˜1Ó€DØ×Ñ˜˜t V§\¡\°$Ó%7¸¸qÓAÀQÒFØØ×(Ñ(¨¯©Ó4€FØ×Ñ˜˜v v§|¡|°DÓ'9¸4ÀÓCÀqÒHØØ�<‰<×Ñ iÐÓ0×6Ñ6Ó8Ð8r   c                 óÄ   — t         j                  dk(  rt        t        d«      S t         j                  dk(  rt	        d«      S t        t        d«      t        dd«      ¬«      S )	z:Return the CPU model, or an empty string when unavailable.rB   ÚProcessorNameStringrE   s   machdep.cpu.brand_stringú/proc/cpuinfoz/proc/device-tree/modeli   rN   )r   r   ro   Ú_CPU_KEYr€   r]   rg   r   r   r   Ú	cpu_modelr…   —   sQ   € ô ‡|�|�wÒÜœ8Ð%:Ó;Ð;Ü
‡|�|�xÒÜÐ6Ó7Ð7Üœ OÓ4Ì
ÐSlÐnqÓHrÔsÐsr   c                 óV  — t         j                  dk(  rt        t        d«      S t         j                  j	                  d«      rgt        d«      j                  «       D ]K  } | j                  «       j	                  d«      sŒ#d| v sŒ(| j                  dd«      d   j                  «       c S  y)	z;Return the CPU vendor, or an empty string when unavailable.rB   ÚVendorIdentifierÚlinuxrƒ   Ú	vendor_idrR   r>   r   )
r   r   ro   r„   rW   rg   rV   r   rX   r   )r\   s    r   Ú
cpu_vendorrŠ   ¡   s‹   € ô ‡|�|�wÒÜœ8Ð%7Ó8Ð8Ü
‡|�|×Ñ˜wÔ'Ü˜Ó/×:Ñ:Ó<ò 	5ˆDØ�z‰z‹|×&Ñ& {Õ3¸¸tºØ—z‘z # qÓ)¨!Ñ,×2Ñ2Ó4Ò4ð	5ð r   c                 óZ  — dd l } ddl m} | j                  dd¬«      }|j                  «       }|j	                  «       }|j                  || j                  |«      «      r|j                  dk(  ry|j                  «       }|dk7  r||j                  k(  ryt        |j                  «       «      S )Nr   r'   r)   Tr*   Fl   ÿÿ )r-   r(   r.   ÚGetCurrentProcessIdÚDWORDÚProcessIdToSessionIdr7   r8   ÚWTSGetActiveConsoleSessionIdÚboolÚGetProcessWindowStation)r-   r(   r)   Ú
process_idÚ
session_idÚactive_sessions         r   Ú_windows_interactive_sessionr•   ­   s™   € ÛÝà�}‰}˜Z¸ˆ}Ó=€HØ×-Ñ-Ó/€JØ—‘Ó!€JØ×(Ñ(¨°V·\±\À*Ó5MÔNÐR\×RbÑRbÐfgÒRgØØ×:Ñ:Ó<€NØ˜Ò#¨¸*×:JÑ:JÒ(JØÜ�×0Ñ0Ó2Ó3Ð3r   c                 ó€  — t         j                  dk(  r	 t        «       S t         j                  j                  d«      rbt        dd«      j                  «       } t        | xr; | dk7  xr4 t        j                  j                  dt        j                  «       › �«      «      S y# t        t        t
        t        f$ r Y yw xY w)	zBReturn whether this process can reach an interactive user session.rB   Frˆ   z/proc/self/sessionidé@   Ú
4294967295z
/run/user/T)r   r   r•   rG   rF   rH   rI   rW   rg   r   r�   rJ   rd   ÚisdirÚgetuid)r“   s    r   Úinteractive_sessionr›   ¼   s    € ä
‡|�|�wÒð	Ü/Ó1Ð1ô ‡|�|×Ñ˜wÔ'ÜÐ 6¸Ó;×AÑAÓCˆ
Ü�JÒk :°Ñ#=ÒkÄ"Ç'Á'Ç-Á-ÐR\Ô]_×]fÑ]fÓ]hÐ\iÐPjÓBkÓlÐlØøô ¤¬´JÐ?ò 	Ùð	ús   •	B! Â!B=Â<B=c                 ód   — t         t        t        t        t        fD ]  } | j                  «        Œ y)zClear every cached host fact.N)r   r   rM   r…   rŠ   Úcache_clear)Úfacts    r   Úclear_cachesrŸ   É   s(   € äœL¬+´yÄ*ÐMò ˆØ×ÑÕñr   )r   ú
str | NoneÚreturnrm   )r¡   rm   )r!   ú
int | Noner   rm   r"   r    r¡   rm   )r¡   r¢   )r¡   r�   )rZ   rm   rO   rm   r¡   rm   )i   )rd   rm   re   Úintr¡   rm   )rn   rm   r#   rm   r¡   rm   )r#   Úbytesr¡   r¢   )r#   r¤   r¡   rm   )r¡   ÚNone)Ú__doc__Ú
__future__r   Ú	functoolsrJ   r   r   r   r    r   Úcacher   r   r%   r<   r@   rM   r„   r]   rg   ro   r?   r€   r…   rŠ   r•   r›   rŸ   r   r   r   ú<module>rª      s
  ðñõ
 #ã Û 	Û Û 
ð  °Ø Ø˜%¨ñ€ð
 &¨wÀÑFÐ óCð
 ‡�òó ðð
 ‡�ò.ó ð.ó
$ó(ó*7ð
 ‡�òó ðð =€ð :<õ Iôóó	ó9ð ‡�òtó ðtð ‡�òó ðó4ó
ôr   