
    }ja                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZddl	m
Z
 ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ  G d de j<                        Z G d	 d
e
      Z  G d de       Z! G d de       Z" G d de       Z# G d de       Z$ G d de       Z% G d de       Z& e'       jQ                         D  ci c]+  \  } }| jS                  d      r| dvr|jU                         |- c}} Z+d Z,d Z-yc c}} w )    N   )
FragmentFD   )EXT_TO_OUT_FORMATSFFmpegPostProcessor)DownloadErrorPopenRetryManager_configuration_args_get_exe_version_outputcheck_executableclasspropertycli_bool_option
cli_optioncli_valueless_optiondetermine_extencodeArgument
remove_endtraverse_objversion_tuplec                   P    e Zd Z ej                         Z ej                         Zy)FeaturesN)__name__
__module____qualname__enumauto	TO_STDOUTMULTIPLE_FORMATS     M/root/.hermes/venv/lib/python3.12/site-packages/yt_dlp/downloader/external.pyr   r       s    		I tyy{r!   r   c                       e Zd ZdZdZdZd Zed        Ze	d        Z
ej                  d        Zedd	       Zed
        Zedd       Zd ZddZddZddZd Zd Zd Zy)
ExternalFDhttphttpsftpftpsr    Tc                 @   | j                  |       | j                  |      }d | _        	 t        j                         }| j	                  ||      }| j                  r| j                  | j                         	 |dk(  rx|dt        j                         z
  d}|dk7  rEt        j                  j                  |      }| j                  ||       |j                  ||d       | j                  ||       y	| j!                  d
       | j#                  d| j                         |fz         y# t
        $ r; |j                  d      s d}| j                  d| j                          d       Y w xY w# | j                  r| j                  | j                         w w xY w)Nis_liver   [z] Interrupted by userfinished)filenamestatuselapsed-)downloaded_bytestotal_bytesT
z%s exited with code %dF)report_destination	temp_name_cookies_tempfiletime_call_downloaderKeyboardInterruptget	to_screenget_basename
try_removeospathgetsize
try_renameupdate_hook_progress	to_stderrreport_error)selfr.   	info_dicttmpfilenamestartedretvalr/   fsizes           r"   real_downloadzExternalFD.real_download*   s   )nnX.!%	8iikG**;	BF %% 6 67Q;$$99;0F
 34X6(-#(  	2NN4 6!!#V:- - .? ! 	K==+ FNNQt00233HIJ	K %% 6 67 &s$   &D, ,A E0,E3 /E00E3 3*Fc                 <    | j                   d d j                         S )N)r   lowerclss    r"   r=   zExternalFD.get_basenameS   s    ||CR &&((r!   c                 "    | j                         S N)r=   rQ   s    r"   EXE_NAMEzExternalFD.EXE_NAMEW   s    !!r!   c                     | j                   S rT   rU   )rG   s    r"   exezExternalFD.exe[   s    }}r!   Nc                     t        |d | j                         fv r| j                  n|| j                  g      }|sy|| _        |S )NF)r   r=   rU   AVAILABLE_OPTrX   rR   r@   s     r"   	availablezExternalFD.available_   sJ     T3+;+;+=$>>CLLD! r!   c                 &    t        |j                  d       xs t        j                   j                  v d|d   vxs t        j
                   j                  v t        |ddd       t         fd|d   j                  d      D              f      S )N	to_stdout+protocol)hls_aes.extra_param_to_segment_urlextra_param_to_key_urlc              3   :   K   | ]  }|j                   v   y wrT   )SUPPORTED_PROTOCOLS).0protorR   s     r"   	<genexpr>z&ExternalFD.supports.<locals>.<genexpr>o   s     _U000_s   )allr;   r   r   SUPPORTED_FEATURESr   r   split)rR   rH   s   ` r"   supportszExternalFD.supportsi   s    k**Zh.@.@CDZDZ.Zy,,c0I0ISMcMc0cY(8:VXpqq_i
>S>Y>YZ]>^__	
  	r!   c                 J    | j                  |      xr | j                  |      S rT   )r\   rl   )rR   rH   r@   s      r"   can_downloadzExternalFD.can_downloadr   s    }}T">s||I'>>r!   c                 0    t        | j                  ||      S rT   )r   params)rG   command_optionparams      r"   _optionzExternalFD._optionv   s    $++~u==r!   c                 6    t        | j                  |||||      S rT   )r   rp   )rG   rq   rr   
true_valuefalse_value	separators         r"   _bool_optionzExternalFD._bool_optiony   s    t{{NE:{\effr!   c                 2    t        | j                  |||      S rT   )r   rp   )rG   rq   rr   expected_values       r"   _valueless_optionzExternalFD._valueless_option|   s    #DKKWWr!   c                     t        | j                         | j                  j                  d      | j                  |g|i |S )Nexternal_downloader_args)r   r=   rp   r;   rU   )rG   keysargskwargss       r"   r   zExternalFD._configuration_args   sD    "1K!Ldmm##!# 	#r!   c                    | j                   j                  j                  sWt        j                  dd      }|j                          |j                  | _        | j                  d| j                   d       | j                   j                  j                  | j                  dd       | j                   j                  j                  xs | j                  S )Nz.cookiesF)suffixdeletez.[download] Writing temporary cookies file to ""T)
ydl	cookiejarr.   tempfileNamedTemporaryFileclosenamer7   r<   save)rG   tmp_cookiess     r"   _write_cookieszExternalFD._write_cookies   s    xx!!**"55ZPUVK%0%5%5D"NNKDLbLbKccdef 6 6dCxx!!**Dd.D.DDr!   c                 ~   | j                  ||      D cg c]  }t        |       }}| j                  |       d|vr-| j                  ||      \  }}}|r|r| j	                  |       |S | j
                  j                  dd      }t        | j
                  j                  d      | j                  d|       }	|	D ]>  }
| j                  ||      \  }}}|s n$|r| j	                  |       t               |
_
        @ |s|	j                  ry| j                  |      }| j                  |d      \  }}t        |d         D ]  \  }}| d	| }	 | j                  |d
      \  }}|j#                   |||j%                                      |j'                          | j
                  j                  dd      rv| j)                  |        |j'                          | j)                  | d       yc c}w # t        $ r@}|r|dkD  r| j                  ||       Y d}~| j!                  d| d|        Y d}~ yd}~ww xY w)z. Either overwrite this or implement _make_cmd 	fragmentsskip_unavailable_fragmentsTfragment_retriesN)
frag_indexfatalwbz-Fragrbr   zUnable to open fragment z; keep_fragmentsFz
.frag.urlsr   )	_make_cmdr   
_debug_cmd_call_processrE   rp   r;   r
   report_retry	Exceptionerror	decryptersanitize_open	enumerateOSErrorreport_skip_fragmentrF   writereadr   r>   )rG   rI   rH   acmd_stderr
returncoder   retry_managerretrydecrypt_fragmentdestr   fragmentfragment_filenamesrcerrs                     r"   r9   zExternalFD._call_downloader   s2   *...i*PQQ~a QQi'$($6$6sI$F!Avzfv&%)[[__5QSW%X"$T[[__5G%H$J[J[04@Z<Z\" 		E$($6$6sI$F!Avz v&#+EK		 *m.A.A>>)4$$[$7a$-i.D$E 	3 J#.-uZL A++,=tDQ JJ'#((*=>IIK;;??#3U; 12	3 	

;-z23[ RB  -*q.--j#>!!$<ZL3%"PQs#   G.G33	H<<H7H77H<c                 t    t        j                  |d| j                  rt        j                        S d       S )NT)textr   )r	   run_CAPTURE_STDERR
subprocessPIPE)rG   r   rH   s      r"   r   zExternalFD._call_process   s*    yy44CWCW
bb]abbr!   rT   )truefalseN)T)r   r   r   re   rj   r   rM   classmethodr=   r   rU   	functoolscached_propertyrX   r\   rl   rn   rs   rx   r{   r   r   r9   r   r    r!   r"   r$   r$   %   s    :O'R ) ) " "       ? ?>gX#
E/bcr!   r$   c                   6    e Zd ZdZdZdZedd       Zd Zd Z	y)	CurlFD-VF)   ;   Nc                     |d}t        |dg      }|sy|j                  dd      }t        |      dk  ry|| _        t	        |d   d	
      | _        |S )Ncurlr   F r   )maxsplit   r   T)lenient)r   rk   lenrX   r   _curl_version)rR   r@   outputpartss       r"   r\   zCurlFD.available   s_    <D(v6S1-u:>)%(DAr!   c                 r   | j                   dd|dg}| j                  | j                  k\  r|ddgz  }nTt        j                  j                  d      r|ddgz  }n-| j                         }d|v rt        d      |dk7  sJ |d|gz  }|j                  d	      '|d	   j                         D ]  \  }}|d
| d| gz  } || j                  dddd      z  }|| j                  dd      z  }|| j                  dd      z  }|| j                  dd      z  }| j                  dd      }t        |      dk(  r|d   dv rd|d<   ||z  }|| j                  dd      z  }|| j                  dd      z  }|| j                  dd       z  }|| j                  d!d"      z  }|| j                         z  }|d#|d$   gz  }|S )%Nz
--location-oz--compressedz--cookier1   	/dev/fd/0=zacurl version too old or temp directory contains `=`; please use another downloader or update curlhttp_headers--header: z--continue-at
continuedl0z--silent
noprogressz	--verboseverbose--limit-rate	ratelimitz--retryretriesr   r   infinfinite
2147483647z--max-filesizemax_filesize--interfacesource_addressz--proxyproxyz
--insecurenocheckcertificate--url)rX   r   _MIN_VERSION_FOR_STDIN_COOKIESr?   r@   islinkr   r   r;   itemsrx   r{   rs   r   r   )rG   rI   rH   r   cookies_filekeyvalr   s           r"   r   zCurlFD._make_cmd   s   xxt[.I!D!DDJ$$CWW^^K(J,,C..0Ll"#  %H  I  I3&&&J--C==(4%n5;;= 5S
se2cUO445 	t  ,SIIt%%j,??t%%k9==t||NK88Y	2u:?Qx..'a5LCt||,n==t||M+;<<t||Iw//t%%l4HIIt''))i&''
r!   c                 b   | j                   | j                  kD  st        j                  j	                  d      rat        j                         }| j                  j                  j                  |dd       t        j                  |d|j                               S t        j                  |d      S )Nr   T)r   input)r   )r   r   r?   r@   r   ioStringIOr   r   _really_saver	   r   getvalue)rG   r   rH   buffers       r"   r   zCurlFD._call_process   sz     C CCrww~~VaGb[[]FHH++FD$?99St6??3DEE yy4((r!   rT   )
r   r   r   rZ   r   r   r   r\   r   r   r    r!   r"   r   r      s/    MO%," "H)r!   r   c                       e Zd ZdZd Zy)AxelFDr   c                 8   | j                   d|g}|j                  d      '|d   j                         D ]  \  }}|d| d| gz  } | j                  j                  j                  |d         }|r|dd| dgz  }|| j                         z  }|d|d   gz  }|S )	Nr   r   z-Hr   r   zCookie: z--max-redirect=0r   )rX   r;   r   r   r   get_cookie_headerr   rG   rI   rH   r   r   r   cookie_headers          r"   r   zAxelFD._make_cmd	  s    xx{+==(4%n5;;= /SRuo../**<<Yu=MNDH]O46HIICt''))i&''
r!   Nr   r   r   rZ   r   r    r!   r"   r   r     s    M
r!   r   c                       e Zd ZdZd Zy)WgetFD	--versionc                 <   | j                   d|ddg}|d| j                         gz  }|j                  d      '|d   j                         D ]  \  }}|d| d| gz  } || j	                  dd	      z  }| j	                  d
d      }t        |      dk(  r|d   dv rd|d<   ||z  }|| j	                  dd      z  }| j                  j                  d      }|rdD ]  }|d| d| gz  } || j                  dd      z  }|| j                         z  }|d|d   gz  }|S )Nz-Oz-nvz--compression=autoz--load-cookiesr   r   r   r   r   z--triesr   r   r   r   r   z--bind-addressr   r   )
http_proxyhttps_proxyz	--executer   z--no-check-certificater   r   r   )	rX   r   r;   r   rs   r   rp   r{   r   )	rG   rI   rH   r   r   r   r   r   vars	            r"   r   zWgetFD._make_cmd  sb   xx{E3GH $"5"5"788==(4%n5;;= 5S
se2cUO445t||NK88Y	2u:?Qx..a5LCt||,.>??(4 7uAeW%5667t%%&>@TUUt''))i&''
r!   Nr   r    r!   r"   r   r     s    Mr!   r   c                   *    e Zd ZdZdZed        Zd Zy)Aria2cFDz-vr%   c                     t         j                  j                  |       r| S dt         j                  j                   |  S )N.)r?   r@   isabssep)fns    r"   _aria2c_filenamezAria2cFD._aria2c_filename4  s/    WW]]2&rAa}RD,AAr!   c                 ~   | j                   ddddddddd	d
ddg}|d| j                          gz  }|j                  d      '|d   j                         D ]  \  }}|d| d| gz  } || j	                  dd      z  }|| j	                  dd      z  }|| j	                  dd      z  }|| j                  ddddd      z  }|| j                  ddddd      z  }|| j                  ddddd      z  }|| j                  d d!ddd      z  }|| j                         z  }|d"gz  }|d#gz  }|d$gz  }|d%gz  }t        j                  j                  |      }|r1|d&| j                  |      t        j                  j                  z   gz  }|d'| j                  t        j                  j                  |            d(|d)   gz  }|S )*Nz	--no-confz--auto-save-interval=10z--console-log-level=warnz--summary-interval=0z--download-result=hidez--http-accept-gzip=truez--file-allocation=nonez-x16z-j16z-s16z--min-split-size1Mz--load-cookies=r   r   r   z--max-overall-download-limitr   r   r   z--all-proxyr   z--check-certificater   r   r   r   z--remote-time
updatetimez--show-console-readoutr   z--remove-control-filer   z--allow-overwrite=truez--always-resume=falsez--auto-file-renaming=falsez--force-save=falsez--dirz--outr   r   )rX   r   r;   r   rs   rx   r   r?   r@   dirnamer  r  basename)rG   rI   rH   r   r   r   dns          r"   r   zAria2cFD._make_cmd8  s#   xx&?)+AC[(*BFFTZ!4)
 	/$"5"5"7!89::==(4%n5;;= 5S
se2cUO445t||:KHHt||M+;<<t||M733t  !68LgW]_bcct  ,QTUUt  !9<RXZ]^^t  !8,QWY\]]t''))())'((,--$%% WW__[)GT2226DEEC!!"''"2"2;"?@e	
 	
 
r!   N)r   r   r   rZ   re   staticmethodr  r   r    r!   r"   r  r  0  s&    M:B B)r!   r  c                       e Zd ZdZdZd Zy)HttpieFDr   r&   c                     ddd||d   g}|j                  d      &|d   j                         D ]  \  }}|| d| gz  } | j                  j                  j	                  |d         }|r	|d| gz  }|S )Nr&   z
--downloadz--outputr   r   :zCookie:)r;   r   r   r   r   r   s          r"   r   zHttpieFD._make_cmdh  s    |Zi>NO==(4%n5;;= (S3%q''( **<<Yu=MNgm_-..C
r!   N)r   r   r   rZ   rU   r   r    r!   r"   r  r  d  s    MHr!   r  c                   n    e Zd ZdZej
                  ej                  fZedd       Z	d Z
ed        Zd Zy)FFmpegFD)	r&   r'   r(   r)   m3u8m3u8_nativertmprtmp_ffmpeghttp_dash_segmentsNc                 *    t               j                  S rT   )r   r\   r[   s     r"   r\   zFFmpegFD.available}  s     #$...r!   c                      y)z Override this in subclasses  Nr    )rG   procstdins      r"   on_process_startedzFFmpegFD.on_process_started  s    r!   c                     |j                  d      xrN |j                  d      xr; |j                  d       xr' d|j                  dg       vxr | j                  |      S )Nrequested_formatsr`   allow_unplayable_formatszno-direct-mergecompat_opts)r;   rn   )rR   rH   rp   s      r"   can_merge_formatszFFmpegFD.can_merge_formats  sk     MM-. ,j),JJ9::, "M2)FF,   +	-r!   c           	         t        |       }|j                  s| j                  d       y|j                          |j                  dg}dD ]'  }| j
                  j                  |d      s |d|gz  } n | j
                  j                  d      s|dgz  }d }| j
                  j                  d	      }|rvt        j                  d
|      sd| }|j                  d      r"| j                  | j                          d       t        j                  j                         }||d<   ||d<   |j                  d      xs d|j                  d      }	}t        |d      }
|j                  d      xs |g}t!        |      D ]  \  }}t        j                  d|d         }|r(| j"                  j$                  j'                  |d         ng }|r)|j)                  ddj+                  d |D              g       |j                  d      xs |j                  d      }|r9|r7|j)                  ddj+                  d |j-                         D              g       |r|dt/        |      gz  }|	r|dt/        |	|z
        gz  }|j                  d      }|d k(  r|j                  d!      }|j                  d"      }|j                  d#      }|j                  d$      }|j                  d%      }|j                  d&      }|j                  d'd      }|j                  d(      }||d)|gz  }||d*|gz  }||d+|gz  }||d,|gz  }||d-|gz  }||d.|gz  }|r|d/d0gz  }t1        |t2              r|D ]	  }|d1|gz  } n4t1        |t.              r$|d1|gz  }n|d2k(  r|j                  d3      r|d4gz  }|d   }| j
                  j                  d5      rD|j                  d6      r3|d7d8gz  }t        j4                  d9t        j6                  d:k(  rd6nd;|      }|t        |d      xs |
z  }|g | j9                  d<|d=z    d<f      d>|z  } |s|	r| j
                  j                  d?      s|d@dAgz  }|j                  d      sd2k(  r=t!        |      D ]/  \  }}|j                  dBd      }|j)                  dC| dD| g       1 | j
                  j                  dEd      r|dFt/        | j:                        gz  }|dG   }dHv r|dIk(  xs | j
                  j                  dJ      }||j                  d3      }|r|dKdLgz  }n|dKdMgz  }|j<                  dNk(  r|j>                  j                  dO      r|j                  dP      r|dP   jA                  dQ      d   dRv r|dSdTgz  }n|d k(  r|dKdUgz  }n|dMk(  r|dIk(  r|dKdLgz  }n}|dVk(  r]tC        tE        |dW            }|dVk(  r| j                  dX       nL| j                  dY| dZ       |dKtG        j                  ||      gz  }n|dKtG        j                  ||      gz  }|t        |d[      z  }|| j9                  d\      z  }|D cg c]  }tI        |       }}|jK                  |jM                  |             | jO                  |       tQ        d] |D              } tS        |tT        jV                  |^      5 }!| r| jY                  |!|!jZ                         	 |!j]                         }"|"cd d d        S c c}w # t^        $ rO}#t1        |#t`              r'tb        jd                  d_k7  r| s|!jg                  d`        |!ji                  d a        d }#~#ww xY w# 1 sw Y   y xY w)bN)
downloaderzDm3u8 download detected but ffmpeg could not be found. Please installFz-y)quietr   z	-loglevelr   z-hide_bannerr   z[\da-zA-Z]+://zhttp://sockszt does not support SOCKS proxies. Downloading is likely to fail. Consider adding --hls-prefer-native to your command.
HTTP_PROXYr   section_startr   section_end)downloader_optionsffmpeg_args.r   z	https?://r   z-cookies c           	   3      K   | ]:  }|j                    d |j                   d|j                   d|j                   d < yw)r   z; path=z	; domain=z;
N)r   valuer@   domain)rf   cookies     r"   rh   z,FFmpegFD._call_downloader.<locals>.<genexpr>  sE      1+ {{m1V\\N'&++iPVP]P]^cd1+s   A Ar   z-headersc              3   2   K   | ]  \  }}| d | d  yw)r   z
Nr    )rf   r   r   s      r"   rh   z,FFmpegFD._call_downloader.<locals>.<genexpr>  s!     0jcC53%t1D0js   z-ssz-tr`   r  
player_urlpage_urlapp	play_pathtc_urlflash_version	rtmp_live	rtmp_connz-rtmp_swfverifyz-rtmp_pageurlz	-rtmp_appz-rtmp_playpathz-rtmp_tcurlz-rtmp_flashverz
-rtmp_livelivez
-rtmp_connr  r+   z-reenable_file_urlszfile:z-protocol_whitelistz#file,crypto,data,http,https,tcp,tlsz^file://(?:localhost)?/ntzfile:/_ir   z-iforce_keyframes_at_cutsz-ccopymanifest_stream_numberz-mapr  testz-fsext)r  r  r1   hls_use_mpegtsz-fmpegtsmp4ffmpegneeds_adtstoascacodecr  )aacmp4az-bsf:aaac_adtstoascflvunknown_videoz.partzThe video format is unknown and cannot be downloaded by ffmpeg. Explicitly set the extension in the filename to attempt download in that formatz3The video format is unknown. Trying to download as z according to the filename)r+  ffmpeg_args_out.)_o1_or-  c              3   *   K   | ]  }|d    dv   yw)r   )r1   zpipe:Nr    )rf   fmts     r"   rh   z,FFmpegFD._call_downloader.<locals>.<genexpr>/  s     MSCJ.0Ms   )r  envwin32   q)timeout)5r   r\   rF   check_version
executablerp   r;   rematch
startswithreport_warningr=   r?   environr@  r   r   r   r   get_cookies_for_urlextendjoinr   str
isinstancelistsubr   r   _TEST_FILE_SIZEr  	_featuresrk   r   r   r   r   append_ffmpeg_filename_argumentr   anyr	   r   r   r  r  waitBaseExceptionr:   sysplatformcommunicate_or_killkill)$rG   rI   rH   ffppr   	log_levelrT  r   
start_timeend_timefallback_input_argsselected_formatsirS  is_httpcookiesr   r`   r3  r4  r5  r6  r7  r8  r;  connentryr   stream_numberrC  
use_mpegtsoptpipedr  rK   es$                                       r"   r9   zFFmpegFD._call_downloader  s   "d3~~de&- 	I{{y%0i00	 {{y)^$$D(88-u5!%)(##((*+ ,K KL **//#C %C %C(}}_=BIMMR_D`H
*96`a$==)<=L) 01 G	QFAshh|SZ8GLSdhh((<<SZHY[GZ 1+")1+ *+ , - 77>2SimmN6SL Z0jUaUgUgUi0j)jklJ00s8j#89::wwz*H6! WW\2
77:.ggenGGK0	* # 8ww{E2ww{+).
;;D'_h77D?[#..D(-y99D%]F33D ,-}==D\622DdD)!% 6u 556c*\400D11immI6N
 e*C{{12s~~g7N .0UVV ff7BGGtOYacfgL&PQhUhhDPd.."QUGd/CDPdPCPPDOG	QR ht{{?X/YT6N"D==,-=Q1Q#$45 >3 #(@! DVs!M?%;<=> ;;??65)UC 4 4566D..%,RAQ1RJ!&]]95
x((u%MMX-$..2D2DEV2Wbkbobopxby  ~G  HP  ~Q  ~W  ~W  X[  ~\  ]^  ~_  cr  ~rX77DT5M!DE\kS0T8$$DO#
; @ACo%##fg ##&YZ]Y^^x$yz155c3?@@T-11#s;<<DY(VWW(():;;/34s#44D22;?@M<LMM4zC8 	D''djj9 !	 	 5 ! 
 a!238OX],,T2  IIdI+
	 	s7   %\]38\]3	]0!A
]++]00]33]<rT   )r   r   r   re   r   r   r   rj   r   r\   r  r#  r9   r    r!   r"   r  r  y  sP    ~",,h.G.GH/ /
 - -pr!   r  FD)r$   r   c                  <    t        t        j                               S rT   )sorted_BY_NAMEr~   r    r!   r"   list_external_downloadersr  J  s    (--/""r!   c                     t         j                  j                  t         j                  j                  |             d   t        j                        xs' t        fdt        j                         D        d      S )zO Given the name of the executable, see whether we support the given downloader r   c              3   @   K   | ]  }|j                   v s|  y wrT   rW   )rf   klassbns     r"   rh   z*get_external_downloader.<locals>.<genexpr>Q  s!      %"0D%s   N)r?   r@   splitextr  r  r;   nextvalues)external_downloaderr  s    @r"   get_external_downloaderr  N  s`    			"''**+>?	@	CB<< t %#??,%  r!   ).r   r   r   r?   rZ  r   rm  r   r8   r   r   postprocessor.ffmpegr   r   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Enumr   r$   r   r   r   r  r  r  globalsr   endswithr=   r  r  r  )r   r  s   00r"   <module>r     s     	 	 	  
     J    &#tyy #
[c [c|@)Z @)FZ  Z 41z 1hz *Gz GX y(e}}Tt+GG 
%#s   0D
