+
    KiT  c                   sb   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	H
t
 ^ RIHt ^ RIHtHtHtHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHtHtHt ^ RIHtH t H!t! ^ R	I"H#t#  ^ RI$t$R. RJOR. RKOR. RNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-R.R/.R0R1.R2R3.R4R5.R6R7.R8R9.//t']R: R; l4       t( ! R< R=4      t) ! R> R?4      t*])! 4       t+R@ RA lt,RB RC lt-RD RE lt.RF RG lt/RH RI lt0R#   ]% d    ]#PL                  ! R
4       Rt$ Li ; i)LzLinux specific platform codeN)Counterdefaultdict)gettext)AnyDictIteratorListOptionalTupleUnioncast)settings)MisconfigurationError)cache_singleflatpaksystem)driversglxinfovkquery)loggerz?Package 'distro' unavailable. Unable to read Linux distributionCOMMANDSOPTIONAL_COMMANDS	TERMINALSZxtermzgnome-terminalZkonsolezxfce4-terminalzpantheon-terminalZ
terminatorzmate-terminalZurxvtzcool-retro-termZEtermZguakeZlilytermZ
lxterminalZroxtermZrxvtZatermZsakuraZstZterminologyZtermiteZtilixZwtermZkittyZyuakuakeZ	qterminalZ	alacrittyZkgxzdeepin-terminalZweztermZfootZptyxis	LIBRARIESOPENGLz
libGL.so.1VULKANzlibvulkan.so.1WINEzlibsqlite3.so.0RADEONzlibvulkan_radeon.soGAMEMODEzlibgamemodeauto.soGNUTLSzlibgnutls.so.30c                $    V ^8  d   QhR\         /#    returnboolformat   "6/usr/lib/python3.14/site-packages/lutris/util/linux.py__annotate__r(   Y   s     p pD p    c                  sj    \         P                  ! R 4      ;'       d    \         P                  ! R4      # )z/etc/exherbo-release/etc/ld-i686-pc-linux-gnu.cacher   Zpath_exists r)   r'   is_exherbo_with_cross_i686r-   X   s(    45oo&:L:LMn:oor)   c                   s4  a  ] tR t^]t o Rt/ t. ROOtRR.tRt. RPOt	RR.t
V 3R lR lt]V 3R	 lR
 l4       t]V 3R lR l4       tV 3R lR lt]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       tV 3R lR lt]V 3R lR l4       t]V 3R lR l4       tV 3R lR ltV 3R lR ltV 3R lR  lt]V 3R! lR" l4       tV 3R# lR$ lt]V 3R% lR& l4       t]V 3R' lR( l4       t]V 3R) lR* l4       tV 3R+ lR, ltV 3R- lR. lt RQV 3R/ lR0 llt!V 3R1 lR2 lt"V 3R3 lR4 lt#V 3R5 lR6 lt$V 3R7 lR8 lt%V 3R9 lR: lt&V 3R; lR< lt'V 3R= lR> lt(V 3R? lR@ lt)V 3RA lRB lt*V 3RC lRD lt+V 3RE lRF lt,V 3RG lRH lt-V 3RI lRJ lt.V 3RK lRL lt/RMt0V t1RN# )RLinuxSystemz Global cache for system commandsz/usr/share/sounds/sf2z/usr/share/soundfontsi   r   r   c                   < V ^8  d   QhRR/# r    r!   Nr,   r%   __classdict__   "r'   r(   LinuxSystem.__annotate__v   s     * *$ *r)   c                sb   R F  p/ V P                   V&   \        V,           Fq  p\        P                  ! V4      pV'       g   V P	                  V4      pV'       d   W0P                   V,          V&   KQ  VR 8X  g   KZ  \
        P                  ! RV4       Ks  	  K  	  \        P                  R8  V n	        V P                  4       V n        V P                  4       V n        V P                  4        V P                  4        V P!                  4       w  V n        V n        V P'                  4       V n        R# )r   z%Command '%s' not found on your systemN)r   r   r   l        )_cacheSYSTEM_COMPONENTSshutilZwhichget_sbin_pathr   warningsysZmaxsize	is_64_bitget_archarchget_shared_librariesshared_librariespopulate_librariespopulate_sound_fontsget_file_limits
soft_limit
hard_limitget_glxinfor   )selfkeycommandcommand_path   &   r'   __init__ZLinuxSystem.__init__v   s    AC!DKK,S11%||G4##'#5#5g#>L0<KK$W-J&NN#JGT 2 B u,MMO	 $ 9 9 ;!!!#+/+?+?+A('')r)   c                6   < V ^8  d   QhRS[ RS[S[ ,          /# r    rH   r!   strr   r1   r3   r'   r(   r4      s      s x} r)   c                s    RR.pV FK  p\         P                  P                  W 4      p\         P                  P                  V4      '       g   KI  Vu # 	  R# )z6Some distributions don't put sbin directories in $PATHz/sbinz	/usr/sbinN)ospathjoinexists)rH   Zpath_candidatesZ	candidaterI   rJ   r'   r8   ZLinuxSystem.get_sbin_path   sH     #K0(I77<<	;Lww~~l++## ) r)   c                6   < V ^8  d   QhRS[ S[S[3,          /# r   )r   intr1   r3   r'   r(   r4      s     : :U38_ :r)   c                 sJ    \         P                  ! \         P                  4      # N)resourceZ	getrlimitZRLIMIT_NOFILEr,   r)   r'   rB   ZLinuxSystem.get_file_limits   s    !!("8"899r)   c                    < V ^8  d   QhRS[ /# r   r"   r1   r3   r'   r(   r4      s     @ @T @r)   c                s4    V P                   V P                  8  # rV   )rD   recommended_no_file_openrF      &r'   has_enough_file_descriptorsZ'LinuxSystem.has_enough_file_descriptors   s    $"?"???r)   c                sF   < V ^8  d   QhRS[ S[S[S[3,          ,          /# r   )r   r   rO   r1   r3   r'   r(   r4      s!     , ,d4S>* ,r)   c                 s   / .p ^ p\        RRR7      ;_uu_ 4       pVP                  4        Fp  pVP                  4       '       g   V^,          pV P                  / 4       K5  VP	                  R^4      w  rEVP                  4       W,          VP                  4       &   Kr  	  RRR4       V  Uu. uF  qf'       g   K  VNK  	  up#   + '       g   i     L+; iu upi )z!Parse the output of /proc/cpuinfoz/proc/cpuinfoutf-8Zencoding:N)open	readlinesstripappendsplit)cpusZ	cpu_indexZcpuinfolinerG   valueZcpus          r'   get_cpusZLinuxSystem.get_cpus   s     t	/G44))+zz||NIKKO!ZZQ/
/4{{}		, , 5  $+tst++ 54 ,s   BC,	C:CC	c                sF   < V ^8  d   QhRS[ S[S[S[3,          ,          /# r   )r   r   rO   r   r1   r3   r'   r(   r4      s$     n nT#s(^, nr)   c                 s    \         P                  ! . RO4      p V '       g   . # \        P                  ! V 4      R,           Uu. uF  qR,          R8w  g   K  VNK  	  up# u upi )z.Return a list of drives with their filesystemsZblockdevicesfstypeZsquashfs)Zlsblkz-fz--json)r   read_process_outputjsonZloads)Zlsblk_outputZdrives     r'   
get_drivesZLinuxSystem.get_drives   sR     112KLI#'::l#;N#Km#K%U]blOl#Kmmms   AAc                rT   r   )r   rO   r1   r3   r'   r(   r4      s      $sCx. r)   c                 s   / p \        RRR7      ;_uu_ 4       pVP                  4        F8  pVP                  R^4      w  r4VP                  R4      WP                  4       &   K:  	  RRR4       V #   + '       g   i     T # ; i)zBParse the output of /proc/meminfo and return RAM information in kBz/proc/meminfor]   r^   r_   zkB 
N)r`   ra   rd   rb   )ZmemZmeminforf   rG   rg   s        r'   get_ram_infoZLinuxSystem.get_ram_info   sp     /G44))+!ZZQ/
#(;;w#7IIK  , 5 
	 54 
s   AA//B 	c                sP   < V ^8  d   QhRS[ S[S[S[S[S[3,          3,          /# r   )r	   rO   r   r1   r3   r'   r(   r4      s)     + +uS%S#*>%>? +r)   c                s    \         f   R# V P                  4       '       dG   \         P                  ! RR7      pVP                  4       VP	                  4       VP                  4       3# \         P                  ! 4       # )zReturn distribution informationunknownz	/run/host)Zroot_dir)distro
is_flatpakZLinuxDistributionnameversionZcodenameZlinux_distribution)rF   Zhost_distro   & r'   get_dist_infoZLinuxSystem.get_dist_info   s^    >?? 22KHK##%{':':'<k>R>R>TTT((**r)   c                0   < V ^8  d   QhRS[ S[,          /# r   r   rO   r1   r3   r'   r(   r4      s      hsm r)   c                 s    \         P                  ! 4       p V R8X  d   R# V R9   d   R# RV 9   d   R# \        P                  ! RV 4       R# )zgReturn the system architecture only if compatible
with the supported architectures from the Lutris API
x86_64i386Zarmv7zUnsupported architecture %sN)rx   Zi686)platformmachiner   r9   )rz       r'   r<   ZLinuxSystem.get_arch   sF    
 ""$h&&g4g>r)   c                rX   r   rO   r1   r3   r'   r(   r4      s       r)   c                 s    \        RRR7      ;_uu_ 4       p V P                  4       ^ ,          pVP                  R4      ^,          pRRR4       V#   + '       g   i     X# ; i)z"Get kernel info from /proc/versionz/proc/versionr]   r^    N)r`   ra   rd   )Zkernel_infoZinforr         r'   get_kernel_versionZLinuxSystem.get_kernel_version   sT     /G44((*1-Djjoa(G 5  54 s   0AA!	c                rX   r   r"   r1   r3   r'   r(   r4      s     9 9D 9r)   c                .    \         P                  ! R4      # )z$Return whether gamemode is availableZgamemoderun)r   can_find_executablerZ   r[   r'   gamemode_availableZLinuxSystem.gamemode_available   s    ))-88r)   c                rX   r   r"   r1   r3   r'   r(   r4      s      $ r)   c                s<   \         P                  ! 4       '       g   R#  Rp\         P                  ! 4       pVR,          pV'       g   R# \        VP	                  R4      ^ ,          4      pWA8  #   \
         d#   p\        P                  ! RT4        Rp?R# Rp?ii ; i)z8Return whether gamescope is supported if we're on nvidiaTi  rr   FZ.z&Unable to determine NVidia version: %sN)r   	is_nvidiaget_nvidia_driver_inforU   rd   Z	Exceptionr   Z	exception)rF   Z minimum_nvidia_version_supportedZdriver_infoZdriver_versionZmajor_versionZexs   &     r'   nvidia_gamescope_supportZ$LinuxSystem.nvidia_gamescope_support   s      ""
	/2,!88:K(3N! 4 4S 9! <=M DD 	ErJ	s   'A. 	$A. .B9BBc                rX   r   r"   r1   r3   r'   r(   r4      s     
 
4 
r)   c                s    \         P                  ! R4      ;'       g[    \        P                  ! R4      ;'       g=    \        P
                  P                  \        P
                  P                  R4      4      # )z)Return whether Steam is installed locallyZsteamzcom.valvesoftware.Steamz ~/.steam/steam/ubuntu12_32/steam)r   r   r   Zis_app_installedrP   rQ   rS   Z
expanduserrZ   r[   r'   	has_steamZLinuxSystem.has_steam   s^     &&w/ V V''(ABV Vww~~bgg001STU	
r)   c                rX   r   r|   r1   r3   r'   r(   r4      s     = = =r)   c                sB    \         P                  P                  RR4      # )zReturn the display server usedXDG_SESSION_TYPErn   )rP   environgetrZ   r[   r'   display_serverZLinuxSystem.display_server   s     zz~~0)<<r)   c                rX   r   r"   r1   r3   r'   r(   r4     s     4 4D 4r)   c                r   )z.Check is we are running inside Flatpak sandboxz/.flatpak-infor+   rZ   r[   r'   rp   ZLinuxSystem.is_flatpak  s    !!"233r)   c                ru   r   r   rO   r1   r3   r'   r(   r4     s      tCy r)   c                sZ    Rp\        4       '       d   RpV P                  R8X  d   VR.# V.# )z2Return the architectures supported on this machinerx   libc6rw   )r-   r=   )rF   Zx86rs   r'   runtime_architecturesZ!LinuxSystem.runtime_architectures  s4     %''C99 ?"ur)   c                ru   r   r   r1   r3   r'   r(   r4     s     ' 'd3i 'r)   c                s"    V P                  4       # rV   get_requirementsrZ   r[   r'   requirementsZLinuxSystem.requirements  s    $$&&r)   c                ru   r   r   r1   r3   r'   r(   r4     s     = =tCy =r)   c                s&    V P                  R R7      # )F)include_optionalr   rZ   r[   r'   critical_requirementsZ!LinuxSystem.critical_requirements  s    $$e$<<r)   c                rL   )r    rQ   r!   rN   r1   r3   r'   r(   r4     s     	 	 	# 	r)   c                s^   \         P                  ! V4      p\        V P                  4       4      pV'       dv   VP	                  4       pVP                  VP                  R. 4      4       W$P                  R. 4      9   g   W$P                  R4      8X  g   Kf  \        \        VR,          4      # R# )z,Return the filesystem type a given path usesZchildrenZmountpointsZ
mountpointri   N)	r   Zfind_mount_pointlistrl   ZpopZextendr   r
   rO   )rF   rQ   Zmount_pointZdevicesZdevice   &&   r'   get_fs_type_for_pathZ LinuxSystem.get_fs_type_for_path  s}    --d3t()[[]FNN6::j"56jj;;{jjYeNf?fC!122r)   c                sD   < V ^8  d   QhRS[ S[P                  ,          /# r   )r   r   GlxInfor1   r3   r'   r(   r4   #  s      Xgoo6 r)   c                s    V P                  R4      '       g   R# \        P                  ! 4       p\        VR4      '       g   \        P
                  ! R4       R# V# )z:Return a GlxInfo instance if the gfxinfo tool is availabler   NZdisplayzInvalid glxinfo received)r   r   r   Zhasattrr   r9   )rF   Z_glxinfors   r'   rE   ZLinuxSystem.get_glxinfo#  sB    xx	""??$x++NN56r)   c                s6   < V ^8  d   QhRS[ RS[S[,          /# )r    r   r!   )r#   r   rO   r1   r3   r'   r(   r4   -  s       c r)   c                s    V P                   P                  4       pV'       d?   W P                  ,          p\        P                  ! 4       '       d   VP                  R4       V# )zReturn used system requirementsr   )required_componentsZcopyoptional_componentsr   Zis_amdrc   )rF   r   Z_requirements   && r'   r   ZLinuxSystem.get_requirements-  sH    00557555M~~$$X.r)   c                s&   < V ^8  d   QhRS[ RS[ /# rM   r|   r1   r3   r'   r(   r4   6  s     ? ?3 ?3 ?r)   c                sb    \        \        V P                  R,          P                  V4      4      # )z)Return a system command path if availabler   )r
   rO   r5   r   )rF   rH   s   &&r'   r   ZLinuxSystem.get6  s#    CZ044W=>>r)   c                ru   r   r   r1   r3   r'   r(   r4   :  s     7 7tCy 7r)   c                sV    \        V P                  R,          P                  4       4      # )z"Return list of installed terminalsr   )r   r5   valuesrZ   r[   r'   get_terminalsZLinuxSystem.get_terminals:  s    DKK,33566r)   c                ru   r   r   r1   r3   r'   r(   r4   >  s     : :S	 :r)   c                sZ    \        \        \        ,          V P                  R,          4      # )z#Return path of available soundfonts
SOUNDFONTS)r
   r   rO   r5   rZ   r[   r'   get_soundfontsZLinuxSystem.get_soundfonts>  s    DIt{{<899r)   c                ru   r   r   r1   r3   r'   r(   r4   B  s     F Fc Fr)   c                s    \        R V P                  P                  4        4       4      pVP                  4        Uu. uF  q"^ ,          NK  	  up# u upi )z@Return shared library folders, sorted by most used to least usedc              3   sH   "   T F  q F  q"P                   x  K  	  K  	  R # 5irV   )dirname).0Zlib_listlib   &  r'   	<genexpr>Z.LinuxSystem.get_lib_folders.<locals>.<genexpr>D  s     $tA_Xksdg[[ks[A_s    ")r    r?   r   Zmost_common)rF   Zlib_folder_counterrQ   r   r'   get_lib_foldersZLinuxSystem.get_lib_foldersB  sI    $$tAVAVA]A]A_$tt$6$B$B$DE$DDQ$DEEEs   Ac                ru   r   )r   rO   r1   r3   r'   r(   r4   G  s     + +(3- +r)   c              #  s~  "   \        4       pV P                  4        F  pVP                  V4       Vx  K  	  V P                   F  pV P                  R8w  d   V^ ,          .pMQ\
        P                  P                  V^ ,          4      \
        P                  P                  V^,          4      8X  d   Kp  \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       g   K  V^ ,          V9  d   V^ ,          x  \        V4      ^8w  g   K  V^,          V9  g   K  V^,          x  K  	  R# 5i)z,Loop over existing 32/64 bit library foldersrw   c              3   s`   "   T F$  p\         P                  P                  V4      x  K&  	  R # 5irV   )rP   rQ   rS   )r   rQ   rs   r'   r   Z/LinuxSystem.iter_lib_folders.<locals>.<genexpr>U  s      >ID277>>$''Is   ,.FTN)
setr   Zaddmultiarch_lib_foldersr=   rP   rQ   ZrealpathZallZlen)rF   Zexported_lib_foldersZ
lib_folderZ	lib_pathsrJ   r'   iter_lib_foldersZLinuxSystem.iter_lib_foldersG  s     "u..0J $$Z0 1 33IyyH$&q\N	 77##IaL1RWW5E5EiPQl5SSs>I>sss>I>>>Q<';;#A,&y>Q& |+??'l* 4s$   B=D= D=D=1&D=D=,D=c                ru   r   r   r1   r3   r'   r(   r4   \  s     N N49 Nr)   c                s^   V P                  R4      pV'       g   \        P                  ! R4       . # VR.p\        4       '       d   VRRR.p\        P
                  ! V4      P                  R4      pV Uu. uF,  qDP                  R4      '       g   K  VP                  R4      NK.  	  up# u upi )zCReturn a list of available libraries, as returned by `ldconfig -p`.ldconfigz(Could not detect ldconfig on this systemz-pz-Cr*   Z
Z	)	r   r   errorr-   r   rj   rd   Z
startswithrb   )rF   r   Zld_cmdZoutputrf      &    r'   get_ldconfig_libsZLinuxSystem.get_ldconfig_libs\  s    88J'LLCDID!%''&GNF++F399$?-3MVTt7L 

4 VMMMs   5B*B*c                sD   < V ^8  d   QhRS[ S[S[R,          3,          /# )r    r!   SharedLibraryr   rO   r   r1   r3   r'   r(   r4   j  s#        d3_0E+E&F  r)   c                sL   \        \        4      pV P                  4        FW  p \        P	                  V4      pTP                  T P                  9  d   K6  YP                  ,          P                  T4       KY  	  V#   \
         d    \        P                  ! RT4        K  i ; i)zLoads all available libraries on the system as SharedLibrary instances
The libraries are stored in a defaultdict keyed by library name.
zInvalid ldconfig line: %s)r   r   r   r   new_from_ldconfig
ValueErrorr   r   r=   r   rq   rc   )rF   r?   Zlib_liner   rJ   r'   r>   Z LinuxSystem.get_shared_librariesj  s     't,..0H#55h? xxt999XX&--c2 1    8(Cs   A=="B#"B#c                r/   r0   r,   r1   r3   r'   r(   r4   z  s     O OD Or)   c                s   / V P                   R&   V P                   F&  p\        \        4      V P                   R,          V&   K(  	  V P                   Fr  p\
        R,          V,           FW  pV P                  V,           F=  pV P                   R,          VP                  ,          V,          P                  V4       K?  	  KY  	  Kt  	  R# )z>Populates the LIBRARIES cache with what is found on the systemr   N)	r5   r   r   r   r   r6   r?   r=   rc   )rF   r=   reqr   Z
shared_libr   r'   r@   ZLinuxSystem.populate_librariesz  s    #%K ..D-8->DKK$T* /$$C(5c::"&"7"7"<"<JKK,Z__=cBII#N #= ; %r)   c                r/   r0   r,   r1   r3   r'   r(   r4     s     < <d <r)   c                s   . V P                   R&   V P                   Fi  p\        P                  P	                  V4      '       g   K*  \        P
                  ! V4       F%  pV P                   R,          P                  V4       K'  	  Kk  	  R# )zPopulates the soundfont cacher   N)r5   soundfont_foldersrP   rQ   rS   Zlistdirrc   )rF   ZfolderZ	soundfontr   r'   rA   Z LinuxSystem.populate_sound_fonts  s`    $&L!,,F77>>&))ZZ/	L)00; 0 -r)   c                sF   < V ^8  d   QhRS[ RS[S[S[ ,          ,          /# )r    r   r!   rO   r   r1   r3   r'   r(   r4     s'     w w wT#Y wr)   c           
     s    \        \        R,          V,          4      pV P                   Uu. uF=  p\        V\        V P                  R,          V,          V,          4      ,
          4      NK?  	  up# u upi )zJReturn a list of sets of missing libraries for each supported architecturer   )r   r6   r   r   r5   )rF   r   Zrequired_libsr=   s   &&  r'   get_missing_requirement_libsZ(LinuxSystem.get_missing_requirement_libs  sZ    -k:3?@[_[u[uv[uSW]S[)A$)G)L%MMN[uvvvs   AA2c                sV   < V ^8  d   QhRS[ S[S[S[S[,          ,          3,          /# r   r   r1   r3   r'   r(   r4     s)     Z Z$sDcO';"< Zr)   c                sb    V P                    Uu/ uF  qV P                  V4      bK  	  up# u upi )z(Return a dictionary of missing libraries)r   r   )rF   r   rs   r'   get_missing_libsZLinuxSystem.get_missing_libs  s0    GKGXGXYGXT66s;;GXYYYs   ,c                rL   )r    requirementr!   r   r1   r3   r'   r(   r4     s       S	 r)   c                s    . p\        V P                  4       F6  w  r4V P                  V4      V,          '       g   K%  VP                  V4       K8  	  V# )zVReturns a list of architectures that are missing a library for a specific
requirement.)Z	enumerater   r   rc   )rF   r   Zmissing_archZindexr=   r   r'   get_missing_lib_archZ LinuxSystem.get_missing_lib_arch  sM     $T%?%?@KE00=eDD##D) A r)   c                s&   < V ^8  d   QhRS[ RS[/# )r    featurer!   )rO   r#   r1   r3   r'   r(   r4     s     A AC AD Ar)   c                s    VR8X  d9    \        \        \        P                  P                  P
                  4      pVR8  # V P                  V4      ^ ,          '       * #   \         d     R# i ; i)zEReturn whether the system has the necessary libs to support a featureZACOz19.3F)r
   rO   LINUX_SYSTEMr   ZGLX_MESA_query_rendererrr   ZAttributeErrorr   )rF   r   Zmesa_versionr   r'   is_feature_supportedZ LinuxSystem.is_feature_supported  sg    e#C)=)=)U)U)])]^#v-- 44W=a@@@ " s   6A A,+A,c                rX   r   r"   r1   r3   r'   r(   r4     s     a aT ar)   c                sp    \         P                  R 4      '       * ;'       d    \        P                  ! 4       # )r   )r   r   r   is_vulkan_supportedrZ   r[   r'   r   ZLinuxSystem.is_vulkan_supported  s'    44X>>``7C^C^C``r)   )r=   r   rD   r;   r?   rC   N))z/lib/lib64)z/lib32r   )/usr/lib
/usr/lib64)z
/usr/lib32r   )z/lib/i386-linux-gnuz/lib/x86_64-linux-gnu)z/usr/lib/i386-linux-gnuz/usr/lib/x86_64-linux-gnu)r   z/opt/32/lib)z/usr/i686-pc-linux-gnu/libz/usr/x86_64-pc-linux-gnu/lib)r   r   r   )T)2__name__
__module____qualname____firstlineno____doc__r5   r   r   rY   r   r   rK   Zstaticmethodr8   rB   r\   rh   rl   rm   rt   r<   r   r   r   r   propertyr   rp   r   r   r   r   rE   r   r   r   r   r   r   r   r>   r@   rA   r   r   r   r   r   __static_attributes____classdictcell__r2      @r'   r.   r.   ]   s    *F	 	 
  &8!:.* **   : :@ @ , , n n  + +    9 9 &
 
 = =4 4   ' ' = =	 	  ? ?7 7: :F F
+ +*N N    O O< <w w
Z Z A Aa ar)   r.   c                   s   a  ] tR tRt o RtRtV 3R lR lt]V 3R lR l4       t]	V 3R lR	 l4       t
]	V 3R
 lR l4       t]	V 3R lR l4       tV 3R lR ltRtV tR# )r   i  z(Representation of a Linux shared libraryrx   c                s,   < V ^8  d   QhRS[ RS[ RS[ /# )r    rq   flagsrQ   r|   r1   r3   r'   r(   SharedLibrary.__annotate__  s"      S  C r)   c                s    Wn         VP                  R 4       Uu. uF  qDP                  4       NK  	  upV n        W0n        R# u upi )Z,N)rq   rd   rb   r   rQ   )rF   rq   r   rQ   Zflags   &&&& r'   rK   ZSharedLibrary.__init__  s7    	/4{{3/?@/?tjjl/?@
	 As   Ac                s$   < V ^8  d   QhRS[ RR/# )r    ldconfig_liner!   r   r|   r1   r3   r'   r(   r     s     O Oc Oo Or)   c                s    \         P                  ! RV4      pV'       g   \        RV,          4      hV ! VP                  ^4      VP                  ^4      VP                  ^4      4      # )zACreate a SharedLibrary instance from an output line from ldconfigz^(.*) \((.*)\) => (.*)$z.Received incorrect value for ldconfig line: %s)reZmatchr   Zgroup)Zclsr   Z	lib_matchr   r'   r   ZSharedLibrary.new_from_ldconfig  sT     HH7G	MP]]^^9??1%yq'99??1;MNNr)   c                rX   r   r|   r1   r3   r'   r(   r     s     
! 
!c 
!r)   c                s    RR.p\        4       '       d   VP                  R4       V F'  pW P                  9   g   K  VP                  RR4      u # 	  V P                  # )z,Return the architecture for a shared libraryzx86-64Zx32r   Z-_)r-   rc   r   Zreplacedefault_arch)rF   Zdetected_archr=   r   r'   r=   ZSharedLibrary.arch  sX     "5)%''  )!Dzz!||C-- "    r)   c                rX   r   r|   r1   r3   r'   r(   r     s     ) )# )r)   c                sF    V P                   P                  R4      ^ ,          # )z3Return the name of the library without an extentionz.so)rq   rd   rZ   r[   r'   basenameZSharedLibrary.basename  s     yyu%a((r)   c                rX   r   r|   r1   r3   r'   r(   r     s     * * *r)   c                sT    \         P                  P                  V P                  4      # )z*Return the directory where the lib resides)rP   rQ   r   rZ   r[   r'   r   ZSharedLibrary.dirname  s     wwtyy))r)   c                rX   r   r|   r1   r3   r'   r(   r     s     2 2 2r)   c                s>    V P                   : R V P                  : R2# ) ())rq   r=   rZ   r[   r'   __str__ZSharedLibrary.__str__  s     IItyy11r)   )r   rq   rQ   N)r   r   r   r   r   r   rK   Zclassmethodr   r   r=   r   r   r   r   r   r   r   r'   r   r     ss     2L 
 O O 
! 
! ) ) * *2 2r)   r   c                F    V ^8  d   QhR\         \        \        3,          /# r   r   rO   r   r$   r&   r'   r(   r(     s      DcN r)   c                 s:   / p \         P                  ! 4       '       dU   \         P                  ! 4       V R&   \         P                  ! 4        Uu. uF  p\         P                  ! V4      NK  	  upV R&   \         P
                  ! 4        Uu. uF  p\         P                  ! V4      NK  	  upV R&   \        \        P                  4      V R&   \        P                  4       V R&   \        P                  4       V R&   \        P                  4       V R&   \        P                  4       V R&   \        P                  4       V R	&   \        P!                  4       V R
&   \        P#                  4       V R&   \$        P&                  ! 4       P)                  4       V R&   V # u upi u upi )z5Get all system information in a single data structureZnvidia_driverZnvidia_gpusZgpusenvZmissing_libsre   Zdrivesramdistr=   kernelr   )r   r   r   Zget_nvidia_gpu_idsZget_nvidia_gpu_infoZget_gpu_cardsZget_gpu_infoZdictrP   r   r   r   rh   rl   rm   rt   r<   r   r   r   Zas_dict)system_infoZgpu_idZgpur~   r'   gather_system_infor     sH   K'.'E'E'GO$X_XrXrXt%uXtfg&A&A&&IXt%uM"@G@U@U@WX@W7//4@WXKbjj)K"."?"?"AK&//1K(335K%224K&446K&//1K(;;=K$__.668K	 &vXs   F	Fc                r   r   r   r$   r&   r'   r(   r(     s     0  0 c3h 0 r)   c                 s   \        4       p / p/ pRP                  V R,          4      VR&   V R,          VR&   V R,          VR&   \        P                  VR&   \        P
                  VR	&   V R
,          P                  RR4      VR&   V R
,          P                  RR4      VR&   W!R&   / pV R,          ^ ,          P                  RR4      VR&   V R,          ^ ,          P                  RR4      VR&   V R,          ^ ,          P                  RR4      VR&   V R,          ^ ,          P                  RR4      VR&   W1R&   / pR\        V R ,          R!,          4      R",          R",          ,          VR#&   R\        V R ,          R$,          4      R",          R",          ,          VR%&   WAR&&   / p\        P                  '       d   V R',          P                  R(R4      VR&   V R',          P                  R)R*4      VR+&   V R',          P                  R,R-4      VR.&   V R',          P                  R/R04      VR1&   V R',          P                  R2R34      VR4&   MR5VR&   \        P                  ! 4       '       d   \        P                  ! \        P                  ! 4       4      VR6&   R7P                  \        P                  ! 4        UUu0 uF#  w  rgV: R8\        P                  ! V4      : R92kK%  	  upp4      VR:&   MR;VR<&   WQR=&   V# u uppi )>zAGet all relevant system information already formatted as a stringr}   r   ZOSr=   ZArchr   ZKernelzLutris VersionzPython Versionr   ZXDG_CURRENT_DESKTOPz	Not foundZDesktopr   zDisplay ServerZSystemre   Z	vendor_idzVendor unavailableZVendorz
model namezModel unavailableZModelz	cpu coreszPhysical cores unavailablezPhysical coresZsiblingszLogical cores unavailablezLogical coresZCPUz%0.1f GBr   ZMemTotali   ZRAMZ	SwapTotalZSwapZMemoryr   Zopengl_vendorZopengl_rendererzOpenGL Renderer unavailablezOpenGL RendererZopengl_versionzOpenGL Version unavailablezOpenGL VersionZopengl_core_profile_versionzOpenGL core unavailablezOpenGL CoreZopengl_es_profile_versionzOpenGL ES unavailablez	OpenGL ESzUnable to obtain glxinfozVulkan Versionz, r   r   zVulkan DriverszNot SupportedZVulkanZGraphics)r   rR   r   ZVERSIONr:   rr   r   Zfloatr   r   r   r   Zformat_versionZget_vulkan_api_versionZget_device_info)r   Zsystem_info_readableZsystem_dictZcpu_dictZram_dictZgraphics_dictrq   rr   s           r'   gather_system_info_dictr     s   $&KKV!45K%f-K'1K$,$4$4K !$'KKK !(/334I;WK	$/$6$:$:;M{$[K !%0"H$V,Q/33KAUVHX#F+A.22<ATUHW!,V!4Q!7!;!;KIe!fH +F 3A 6 : ::Gb cH_"*H E+e*<Z*H$ID$PSW$WXHUO!U;u+=k+J%Kd%RUY%YZHV%-"M"-i"8"<"<_Nb"ch+6y+A+E+EFWYv+w'(*5i*@*D*DEUWs*t&''29'='A'A)+D(
m$ &1%;%?%?@[]t%uk""<h""$$*1*@*@A_A_Aa*b&'*.))V]VmVmVopVo]T$ 6 6w ?@Vop+
&' #2h'4$ qs   2)K2
c                :    V ^8  d   QhR\         \        ,          /# r   r   r$   r&   r'   r(   r(   #  s     ( (49 (r)   c                 s*    \         P                  4       # )z/Return the list of installed terminal emulators)r   r   r,   r)   r'   get_terminal_appsr   #  s    %%''r)   c                r   r   rv   r$   r&   r'   r(   r(   (  s      hsm r)   c                 s<    \        4       p V '       d
   V ^ ,          # R# )z<Return the default terminal emulator, or None if none found.N)r   )Ztermsr{   r'   get_default_terminalr   (  s    EQxr)   c                r   r   r|   r$   r&   r'   r(   r(   0  s     N Ns Nr)   c                 sR    \        4       p V '       d   V # \        \        R4      4      h)z[Return the default terminal emulator, or raises MisconfigurationError if none can be
found.z'No terminal emulator could be detected.)r   r   r   )Ztermr{   r'   get_required_default_terminalr   0  s%      !D
"K L
MMr)   )	Zxrandrfuserr   Z
vulkaninfor   Z7zzgtk-update-icon-cacheZlspcir   )
fluidsynthz
nvidia-smir   )1r   rk   rP   ry   r   rW   r7   r:   Zcollectionsr    r   r   r   Ztypingr   r   r   r   r   r   r	   r
   Zlutrisr   Zlutris.exceptionsr   Zlutris.utilr   r   r   Zlutris.util.graphicsr   r   r   Zlutris.util.logr   ro   ZImportErrorr9   r6   r-   r.   r   r   r   r   r   r   r   r,   r)   r'   <module>r      sZ   "  	  	   
 ,   J J J  3 5 5 : : "  
  
      	  		 
 	  	  	  	  	  	  	  	  	  	  	   	! " 	# $ 	% & 	' ( 	) * 	+ , 	- . 	/ 0 	1 2 	3 4 	5 6 	7 8 	9 : 	; < 	= > 	? B <.#$"#())*$%e: z p pMa Ma`
*2 *2Z }&0 f(
Nu  
NNTUFs   (D D.-D.