+
    KilE  c            
       s.   R t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
HtHt ^ RIHt ^ RIHtHtHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIH t  ^ RI!H"t" ^ RI#H$t$ ^ RI%H&t& ^ RI'H(t( ^ RI)H*t* ^ RI+H,t, ^ RI-H.t. ]P^                  Pa                  RR4      Pc                  4       R-9   t2Rt3R]*R].R]&R](R],/t4R.R R llt5R R lt6R/R R  llt7R/R! R" llt8 ! R# R$4      t9 ! R% R&4      t: ! R' R(]94      t; ! R) R*];4      t< ! R+ R,];4      t=R# )0zRuntime handling moduleN)gettext)AnyDictListOptional)settings)check_stale_runtime_versionsdownload_runtime_versionsget_runtime_versionsget_time_from_api_dateProgressInfo)httpsystem)
Downloader)extract_archive)	AsyncCall)LINUX_SYSTEM)logger)parse_version)D3DExtrasManager)dgvoodoo2Manager)DXVKManager)DXVKNVAPIManager)VKD3DManagerZLUTRIS_RUNTIME zUbuntu-18.04ZdxvkZvkd3dZ
d3d_extrasZ	dgvoodoo2Z
dxvk_nvapic          
      s    V ^8  d   QhR\         \        ,          R\        R\         \        ,          R\        \        \        3,          /#    versionprefer_system_libs	wine_pathreturn)r   strboolr   format   "3/usr/lib/python3.14/site-packages/lutris/runtime.py__annotate__r&   +   s>      c]7;PXY\P]	#s(^    c                s    RP                  \        WVR7      4      p/ pV'       dT   W4R&   \        P                  P                  \        P
                  R4      pV: R\        P                  R,          : 2VR&   V# )a  Return a dict containing LD_LIBRARY_PATH env var

Params:
    version: Version of the runtime to use, such as "Ubuntu-18.04" or "legacy"
    prefer_system_libs: Whether to prioritize system libs over runtime libs
    wine_path: If you prioritize system libs, provide the path for a lutris wine build
                     if one is being used. This allows Lutris to prioritize the wine libs
                     over everything else.
Z:r   r   r   LD_LIBRARY_PATHznetwork-toolsZPATH)join	get_pathsospathr   RUNTIME_DIRenviron)r   r   r   Zlibrary_pathZenvZnetwork_tools_paths   &&&   r%   get_envr0   +   sb     88IghqrsL
C!-WW\\(*>*>P!3RZZ5GHFJr'   c                sF    V ^8  d   QhR\         R\        \         ,          /# )r   r   r   )r    r   r"   r$   r%   r&   r&   @   s       c r'   c                s    . pR F\  p\         P                  P                  T ;'       g    RV4      p\        P                  ! V4      '       g   KK  VP                  V4       K^  	  V# )z2Return wine libraries path for a Lutris wine buildr   )ZlibZlib64)r,   r-   r*   r   path_existsappend)r   pathsZwinelib_pathZwinelib_fullpath   &   r%   get_winelib_pathsr5   @   sR    E(77<<	RF.//LL)* ) Lr'   c          	          V ^8  d   QhR\         \        ,          R\        R\         \        ,          R\        \        ,          /# r   r   r    r!   r   r"   r$   r%   r&   r&   K   s9      c]7;OWX[}	#Yr'   c                s   T ;'       g    \         p RV ,          pVRRRR.p\        P                  '       d   RV ,          pVVRRR	R
.,          p. pV'       d@   V'       d   V\        V4      ,          pV\	        \        P
                  ! 4       4      ,          pYT Uu. uF1  p\        P                  P                  \        P                  V4      NK3  	  up,          pV# u upi )zReturn Lutris runtime pathsz%s-i686zsteam/i386/lib/i386-linux-gnuzsteam/i386/libz!steam/i386/usr/lib/i386-linux-gnuzsteam/i386/usr/libz	%s-x86_64z steam/amd64/lib/x86_64-linux-gnuzsteam/amd64/libz$steam/amd64/usr/lib/x86_64-linux-gnuzsteam/amd64/usr/lib)DEFAULT_RUNTIMEr   	is_64_bitr5   listZiter_lib_foldersr,   r-   r*   r   r.   )r   r   r   Zlutris_runtime_pathZruntime_pathsr3   r-   s   &&&    r%   get_runtime_pathsr;   K   s     ((G#g-'+M )G3.2!
 	
 E&y11El33566	=Q=4bggll8//6=QQEL Rs   7Cc          	      r6   r   r7   r"   r$   r%   r&   r&   m   s9      c]7;OWX[}	#Yr'   c                s    \         '       g   \        WVR7      pM. p\        P                  P	                  R4      '       d'   VP                  \        P                  R,          4       V# )z8Return a list of paths containing the runtime libraries.r(   r)   )RUNTIME_DISABLEDr;   r,   r/   getr2   )r   r   r   r3   s   &&& r%   r+   r+   m   sK     !'dmn	zz~~'((RZZ 123Lr'   c            
       s   a  ] tR t^{t o ]! ]! ^4      4      w  tttt	]]
! R4      ]]
! R4      ]]
! R4      ]	]
! R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 3R lR ltRtV tR# )ComponentUpdaterzUpdating %szDownloading %szExtracting %sz
Updated %sc                    < V ^8  d   QhRS[ /# r   r   r    r#   __classdict__   "r%   r&   ComponentUpdater.__annotate__   s     " "c "r'   c                    \         hNZNotImplementedErrorself   &r%   nameZComponentUpdater.name   s    !!r'   c                r?   r@   r!   rB   rD   r%   r&   rE      s      t r'   c                    R# )z=True if this update should be installed; false to discard it.T rI   rK   r%   should_updateZComponentUpdater.should_update   s     r'   c                "   < V ^8  d   QhRRRR/# r   updaterRuntimeUpdaterr   NrO   rB   rD   r%   r&   rE      s     " "&6 "4 "r'   c                rF   )zPerforms the update; runs on a worker thread, and returns when complete.
However, some updates spawn a further thread to extract in parallel with the
next update even after this.rH   rJ   rS      &&r%   install_updateZComponentUpdater.install_update   s
     "!r'   c                rN   )zBlocks until the update is entirely complete; used when install_update() spawns
a thread to finish up. We call this on each update before closing the download queue.NrO   rI   rK   r%   r*   ZComponentUpdater.join   s    r'   c                r?   r@   r
   rB   rD   r%   r&   rE      s     $ $l $r'   c                s,    \         P                  ! 4       # )zUReturns the current progress for the updater as it runs; called from the main thread.)r   endedrI   rK   r%   get_progressZComponentUpdater.get_progress   s    !!##r'   rO   N)__name__
__module____qualname____firstlineno__r:   ZrangePENDINGDOWNLOADING
EXTRACTING	COMPLETED_status_formatspropertyrL   rP   rW   r*   rY   __static_attributes____classdictcell__rC      @r%   r>   r>   {   s     48qN1Wk:y 	=!Q'(Ao&1\?	N " "  " "a$ $r'   r>   c                   s   a  ] tR t^t o RtRV 3R lR llt]R 4       tV 3R lR ltV 3R lR lt	]
V 3R	 lR
 l4       tRtV tR# )rT   z"Class handling the runtime updatesc                r?   )r   forcerM   rB   rD   r%   r&   RuntimeUpdater.__annotate__   s     ; ;d ;r'   c                s   \         '       d   \        P                  ! R 4       RV n        MlV'       d	   RV n        M\\        P
                  ! RRR7      V n        V P                  '       g   \        P                  ! R4       \        4       '       g   RV n        V P                  '       d   \        4       V n	        R# \        4       V n	        R# )zURuntime disabled by environment variable. Re-enable runtime before submitting issues.FTZauto_update_runtime)ZdefaultzBRuntime updates are disabled. This configuration is not supported.N)r<   r   warningupdate_runtimer   Zread_bool_settingr   has_updatesr   runtime_versionsr   )rJ   ri   rV   r%   __init__ZRuntimeUpdater.__init__   s    NNrs"'D"&D"*"<"<=R\`"aD&&&cd/11&+#$=$?D!$8$:D!r'   c                s    V P                   # rG   )rl   rI   rK   r%   rm   ZRuntimeUpdater.has_updates   s    """r'   c                0   < V ^8  d   QhRS[ S[,          /# r@   )r   r>   rB   rD   r%   r&   rj      s     8 840@+A 8r'   c                s    V P                   '       g   . # . pV P                  '       d"   WP                  V P                   4      ,          pV Uu. uF  q"P                  '       g   K  VNK  	  up# u upi )a\  Creates the component updaters that need to be applied and returns them in a list.

This tests each to see if it should be used and returns only those you should install.
It returns an empty list if has_updates is false.

This method also downloads fresh runner versions on each call, so we call this on a
worker thread, instead of blocking the UI.)rn   rl   _get_runtime_updatersrP   )rJ   updatersZu   &  r%   create_component_updatersZ(RuntimeUpdater.create_component_updaters   s]     $$$I+-2243H3HIIH#78a8777s   A/&A/c                rp   r@   )r   r    rB   rD   r%   r&   rj      s      x} r'   c                sT   V P                   '       d   \        P                  P                  R4      '       gq   V P                   P                  R4      pV'       dN   \	        V4      \	        \
        P                  4      8  d'   \
        P                  ! R4      pV'       d   W!8w  d   V# R# )a  Checks if the client is of an old version and no longer supported; this can be blocked
with an env-var, and can be temporarily ignored as well, but if we're out of date, then
this method returns the version of Lutris that is required. If we're good, or we are ignoring
the problem, this returns None.

I expect that most users will not discover the env-var, so they will be prompted
on each new Lutris release.ZLUTRIS_NO_CLIENT_VERSION_CHECKclient_versionZ ignored_supported_lutris_verisonN)rn   r,   r/   r=   r   r   ZVERSIONZread_setting)rJ   ru   Zignoredrs   r%   check_client_versionsZ$RuntimeUpdater.check_client_versions   sw        8X)Y)Y!22667GHN 0=AQAQ3RR&334VWG"g&?--r'   c                sL   < V ^8  d   QhRS[ S[S[3,          RS[S[,          /# )r   rn   r   )r   r    r   r   r>   rB   rD   r%   r&   rj      s)      S#X 4HXCY r'   c                sL   . pV P                  R/ 4      P                  4        F  w  r#VR,          R8X  d7   \        P                  '       g!   \        P
                  ! RW#R,          4       KI   VP                  R4      pV'       dQ   R\        P                  P                  V4      P                  4       9  d   VP                  \        V4      4       K  K  VP                  \        V4      4       K  	  V#   \         d#   p\        P                  ! RY%4        Rp?K  Rp?ii ; i)	zLaunch the update processZruntimesZarchitectureZx86_64zSkipping runtime %s for %surlz-protonzUnable to download %s: %sN)r=   Zitemsr   r9   r   debugr,   r-   basenamecasefoldr2    RuntimeExtractedComponentUpdaterRuntimeFilesComponentUpdater	Exception	exception)rn   rr   rL   Zremote_runtimerw   exs   &     r%   rq   Z$RuntimeUpdater._get_runtime_updaters   s     ,.$4$8$8R$H$N$N$P Dn-9,BXBXBX94P^A_`H$((/ (8(8(=(F(F(HH (H(XY I OO$@$PQ %Q   H  !<dGGHs%   -C6AC6C66D#DD#)rn   rl   N)F)rZ   r[   r\   r]   __doc__ro   rd   rm   rt   rv   Zstaticmethodrq   re   rf   rg   rh   r%   rT   rT      sN     ,; ;( # #8 8$ $  r'   rT   c                   s   a  ] tR t^t o 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t
V 3R lR ltV 3R lR lt]V 3R lR l4       tRtV tR# )RuntimeComponentUpdatera  A base class for component updates that use the timestamp from a runtime-info dict
to decide when an update is required.

These dicts are part of the 'versions.json' file, sent down from the server. They describe
what versions of components are available from the server. This dict includes the modification
date-time of the component, and we compare it to the mtime of the relevant directory.
c                :   < V ^8  d   QhRS[ S[S[3,          RR/# r   remote_runtime_infor   Nr   r    r   rB   rD   r%   r&   $RuntimeComponentUpdater.__annotate__   s'     d dDcN dt dr'   c                s*   Wn         \        P                  V n        \	        V P                   P                  R 4      4      V n        V P                  '       d6   \        V P                   P                  R4      ;'       g    R4      V n        R# RV n        R# )	versionedr   r   N)	r   r>   r^   stater!   r=   r   r    r   )rJ   r   rV   r%   ro   Z RuntimeComponentUpdater.__init__   sf    #6 %--
d66::;GHMQ^^^s43377	BHHbIacr'   c                r?   r@   rA   rB   rD   r%   r&   r     s     0 0c 0r'   c                s(    V P                   R ,          # )rL   )r   rI   rK   r%   rL   ZRuntimeComponentUpdater.name  s    ''//r'   c                r?   r@   rA   rB   rD   r%   r&   r     s     = =C =r'   c                sr    \         P                  P                  \        P                  V P
                  4      # )zLReturn the local path for the runtime directory where the component
is kept.)r,   r-   r*   r   r.   rL   rI   rK   r%   local_runtime_pathZ*RuntimeComponentUpdater.local_runtime_path  s#     ww||H00$))<<r'   c                rQ   rR   rO   rB   rD   r%   r&   r     s     " "&6 "4 "r'   c                rF   rG   rH   rU   rV   r%   rW   Z&RuntimeComponentUpdater.install_update  s    !!r'   c                r?   r@   r
   rB   rD   r%   r&   r     s     	, 	,l 	,r'   c                s>   \         P                  V P                  ,          V P                  ,          pV P                  \         P                  8X  d   \
        P                  ! V4      # V P                  \         P                  8X  d   \        R V4      # \        ^ V4      # )g        )r>   rc   r   rL   ra   r   rX   r^   )rJ   Zstatus_texts   & r%   rY   Z$RuntimeComponentUpdater.get_progress  sp    &55djjADIIM::)333%%k22::)111[11A{++r'   c                s4   < V ^8  d   QhRS[ P                  /# r@   )timestruct_timerB   rD   r%   r&   r     s     F F 0 0 Fr'   c                s|    \         P                  ! \        P                  P	                  V P
                  4      4      # )z2Return the modification date of the runtime folder)r   gmtimer,   r-   getmtimer   rI   rK   r%   get_updated_atZ&RuntimeComponentUpdater.get_updated_at  s&    {{277++D,C,CDEEr'   c                s   < V ^8  d   QhRR/# )r   r   NrO   rB   rD   r%   r&   r     s     * * *r'   c                s    \         P                  ! V P                  4      '       g$   \        P                  ! RV P                  4       R# \
        P                  ! V P                  4       R# )z-Set the creation and modification time to nowzNo local runtime path in %sN)r   r1   r   r   errorr,   ZutimerI   rK   r%   set_updated_atZ&RuntimeComponentUpdater.set_updated_at  sC    !!$"9"9::LL68O8OP
(()r'   c                r?   r@   rM   rB   rD   r%   r&   r   &  s      t r'   c           	     s   V P                   '       dN   \        P                  ! \        P                  P                  V P                  V P                  4      4      '       * #  V P                  4       p\        T P                  R,          4      pT'       d	   Y8  d   R# \        P                  ! RT P                  \        P                   ! RT4      \        P                   ! RT4      4       R#   \         d     R# i ; i)z2Determine if the current runtime should be updatedTZ
created_atFz7Runtime %s locally updated on %s, remote created on %s)z%c)r   r   r1   r,   r-   r*   r   r   r   ZFileNotFoundErrorr	   r   r   rx   rL   r   Zstrftime)rJ   Zlocal_updated_atZremote_updated_atrs   r%   rP   Z%RuntimeComponentUpdater.should_update%  s     >>>))"'',,t7N7NPTP\P\*]^^^	#224 343K3KL3YZ 0 EEIIMM$ 01MM$ 12		
  ! 		s   !C, ,C;:C;)r   r   r   r   N)rZ   r[   r\   r]   r   ro   rd   rL   r   rW   rY   r   r   rP   re   rf   rg   rh   r%   r   r      s|     d d 0 0 = =
" "	, 	,F F* *  r'   r   c                   s   a a ] tR tRt oRtV3R lV 3R lltV3R lV 3R llt]R 4       tV3R lR	 lt	R
 t
R tV3R lR ltV3R lR ltV3R lR ltRtVtV ;t# )r{   i>  z9Component updater that downloads and extracts an archive.c                r   r   r   rB   rD   r%   r&   -RuntimeExtractedComponentUpdater.__annotate__A  s#     0 0DcN 0t 0r'   c                s   < \         SV `  V4       VR ,          V n        RV n        \        P
                  ! 4       V n        R# )rw   N)superro   rw   
downloader	threadingZEventcomplete_event)rJ   r   	__class__s   &&r%   ro   Z)RuntimeExtractedComponentUpdater.__init__A  s3    ,-&u-&*'oo/r'   c                r?   r@   r
   rB   rD   r%   r&   r   G  s      l r'   c                s   < \         SV `  4       pV P                  '       dR   VP                  '       g@   \	        V P                  P
                  VP                  V P                  P                  4      # V# rG   )r   rY   r   Z	has_endedr   Zprogress_fractionZlabel_markupZcancel)rJ   Zprogress_infor   s   & r%   rY   Z-RuntimeExtractedComponentUpdater.get_progressG  sV    ,.???=#:#:#: A A=C]C]_c_n_n_u_uvvr'   c                s    \         P                  P                  \        P                  \         P                  P                  V P                  4      4      # )zIThis is the path where the archive is downloaded, before being extracted.)r,   r-   r*   r   r.   ry   rw   rI   rK   r%   archive_pathZ-RuntimeExtractedComponentUpdater.archive_pathO  s2     ww||H00"''2B2B4882LMMr'   c                $   < V ^8  d   QhRS[ RR/# r   rS   r   NrT   rB   rD   r%   r&   r   T  s     
A 
An 
A 
Ar'   c                sn   \         P                  V n        V P                  P	                  4        V P
                  p\        V P                  VR R7      V n        V P                  P                  4        V P                  P                  4        RV n        \        V P                  V P                  V4       R# )T)Z	overwriteN)r>   r_   r   r   Zclearr   r   rw   r   Zstartr*   r   _install_install_cb)rJ   rS   r      && r%   rW   Z/RuntimeExtractedComponentUpdater.install_updateT  s}    %11
!!#(($TXX|tL$--!1!1<@r'   c                s:    V P                   P                  4        R # rG   )r   ZwaitrI   rK   r%   r*   Z%RuntimeExtractedComponentUpdater.join`  s      "r'   c                sd    \         P                  V n        V P                  P	                  4        R # rG   )r>   ra   r   r   ZsetrI   rK   r%   	_completeZ*RuntimeExtractedComponentUpdater._completec  s!    %//
!r'   c                r?   )r   r-   rA   rB   rD   r%   r&   r   g  s      S r'   c                s    V P                  V4       V P                  4        V P                  \        9   d-   \        V P                  ,          ! 4       pVP	                  4        V P                  4        R#   T P                  4        i ; i)zFinishes the installation after download, on a worker thread. This extracts
the archive and downloads the versions file for it, the marks the update complete
so join() above will be unblocked.N)_extractr   rL   DLL_MANAGERSZfetch_versionsr   )rJ   r-   Zmanagerr   r%   r   Z)RuntimeExtractedComponentUpdater._installg  s]    	MM$!yyL(&tyy13&&(NNDNNs   A"A6 6Bc                s&   < V ^8  d   QhRS[ RS[/# )r   
_completedr   )r!   r}   rB   rD   r%   r&   r   u  s     = =d =9 =r'   c                sH    V'       d   \         P                  ! R V4       R# R# )zRuntime update failed: %sN)r   r   )rJ   r   r   s   &&&r%   r   Z,RuntimeExtractedComponentUpdater._install_cbu  s    LL4e< r'   c                r   )r   r-   r   NrA   rB   rD   r%   r&   r   y  s        S  T  r'   c                st   V'       g   R# \         P                  ! V4      pVP                  '       g0   \        P                  ! RV4       \         P
                  ! V4       R# \         P                  P                  V4      w  r4\         P                  P                  W0P                  4      pV P                  '       d+   \         P                  P                  WPP                  4      pM\        P                  ! V4       \        P                  V n        \#        WRR7      w  rg\         P
                  ! V4       R# )zActions taken once a runtime is downloaded

Arguments:
    path: local path to the runtime archive, or None on download failure
Nz1Download failed: file %s is empty, Deleting file.T)Zmerge_single)r,   ZstatZst_sizer   r   Zunlinkr-   Zsplitr*   rL   r   r   r   Zdelete_folderr>   r`   r   r   )rJ   r-   ZstatsZ	directoryZ	_filenameZ	dest_pathr   Z_destination_paths   &&      r%   r   Z)RuntimeExtractedComponentUpdater._extracty  s     }}}LLLdSIIdO!ww}}T2	 GGLLII6	>>>Y=I   +%00
*9$X\*]'
		,r'   )r   r   r   rw   )rZ   r[   r\   r]   r   ro   rY   rd   r   rW   r*   r   r   r   r   re   rf   Z__classcell__)r   rC   s   @@r%   r{   r{   >  sk     C0 0  N N
A 
A#" = =     r'   r{   c                   sl   a  ] tR tRt o R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tRt	V t
R# )r|   i  zVComponent updaters that downloads a set of files described by the server
individually.c                r   r   r   rB   rD   r%   r&   )RuntimeFilesComponentUpdater.__annotate__  s     0 0n 0 0r'   c           	     s   \         P                  V n        V P                  4       p. pV FG  p\	        VR,          4      pV P                  VR,          V4      '       g   K6  VP                  V4       KI  	  \        P                  P                  ^R7      ;_uu_ 4       pV Uu/ uF&  qFP                  V P                  V4      VR,          bK(  	  pp\        P                  P                  V4       F`  pVP                  4       '       d   K  VP                  4       '       g   K3  Wx,          p	\        P                   ! RWP                  4       4       Kb  	  RRR4       \         P"                  V n        R# u upi   + '       g   i     L,; i)zSDownload a runtime item by individual components. Used for icons only at the momentmodified_atfilename)Zmax_workerszFailed to get '%s': %sN)r>   r_   r   _get_runtime_componentsr	   _should_update_componentr2   
concurrentZfuturesZThreadPoolExecutorZsubmit_download_componentZas_completedZ	cancelledr~   r   rk   ra   )
rJ   rS   
componentsZ	downloads	componentr   ZexecutorZfuture_downloadsZfutureZexpected_filenames
   &&        r%   rW   Z+RuntimeFilesComponentUpdater.install_update  s<   %11
113
	#I0=1IJK00:1FTTY'	 $ 22q2AAXmv mv`i 8 8)DiPZF[[mv    %,,99:JK''))f.>.>.@.@(8(@%NN#;=NP`P`Pbc L	 B &//
  BAs*   E7",E27E7
E7"1E72E77F	c                s@   < V ^8  d   QhRS[ RS[P                  RS[/# )r   r   remote_modified_atr   )r    r   r   r!   rB   rD   r%   r&   r     s)       $JZJZ _c r'   c                s   \         P                  P                  V P                  V4      p\        P
                  ! V4      '       g   R# \        P                  ! \         P                  P                  V4      4      pWB8  d   R# R# )z*Should an individual component be updated?TF)	r,   r-   r*   r   r   r1   r   r   r   )rJ   r   r   	file_pathZlocally_modified_ats   &&&  r%   r   Z5RuntimeFilesComponentUpdater._should_update_component  sZ    GGLL!8!8(C	!!),,"kk"''*:*:9*EF4r'   c                sF   < V ^8  d   QhRS[ S[S[S[3,          ,          /# r@   )r   r   r    r   rB   rD   r%   r&   r     s!     
3 
3d38n)= 
3r'   c                sr   \         P                  ! \        P                  R,           V P                  ,           4      p VP                  4       pTP                  '       g   . # TP                  P                  R. 4      #   \         P                   d$   p\        P                  ! RT4       . u Rp?# Rp?ii ; i)z.Fetch individual runtime files for a componentZ/zFailed to get components: %sNr   )
r   ZRequestr   ZRUNTIME_URLrL   r=   Z	HTTPErrorr   r   Zjson)rJ   ZrequestZresponser   r4   r%   r   Z4RuntimeFilesComponentUpdater._get_runtime_components  s    ,,x33c9DIIEF	{{}H }}}I}}  r22 ~~ 	LL7<I	s   A> >B6B1+B61B6c                r   )r   r   r   Nr   rB   rD   r%   r&   r     s#     8 8T#s(^ 8 8r'   c                s    \         P                  P                  V P                  VR,          4      p\        P
                  ! VR,          V4       R# )z/Download an individual file from a runtime itemr   rw   N)r,   r-   r*   r   r   Zdownload_file)rJ   r   r   r   r%   r   Z0RuntimeFilesComponentUpdater._download_component  s6    GGLL!8!8)J:OP	9U+Y7r'   )r   N)rZ   r[   r\   r]   r   rW   r   r   r   re   rf   rg   rh   r%   r|   r|     s2     0 0* 
3 
38 8r'   r|   )Z0Zoff)NFN)NTN)>r   Zconcurrent.futuresr   r,   r   r   r    rb   Ztypingr   r   r   r   Zlutrisr   Z
lutris.apir   r   r   r	   Zlutris.gui.widgets.progress_boxr   Zlutris.utilr   r   Zlutris.util.downloaderr   Zlutris.util.extractr   Zlutris.util.jobsr   Zlutris.util.linuxr   Zlutris.util.logr   Zlutris.util.stringsr   Zlutris.util.wine.d3d_extrasr   Zlutris.util.wine.dgvoodoo2r   Zlutris.util.wine.dxvkr   Zlutris.util.wine.dxvk_nvapir   Zlutris.util.wine.vkd3dr   r/   r=   rz   r<   r8   r   r0   r5   r;   r+   r>   rT   r   r{   r|   rO   r'   r%   <module>r      s      	     , ,   9 $ - / & * " - 8 7 - 8 /::>>"2B7@@BlR   K\"!"*D$ $DR RjI. IXV '> V r28#: 28r'   