
    V|h                       S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r
S SKr
S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK r S SK!r!S SK"r"S SK#r#S SK$r$S SK%r%S SK&r&S SK'r'S SK(r(S SK)r)S SK*r*S SK+r+S SK,r-S SK.r-S SK/r-S SK0r1SSK2J3r3  SSK4J5r5J6r6J7r7J8r8  SSK9J:r:  SSK;J<r<J=r=  \>R                  SS5      S    r> " S	 S
5      r@S rA/ SQrB\B/ SQ/ SQS.rCS S S S SSSSSSSSSSS.rD\E" \F" S\R                  " SS/SS/SSS/SS /S!S"/S#S$/S%5      5      5      rHS&rI\J" \I5      rK\KR                  / S'Q5        \J" \I5      rM\MR                  / S(Q5        S)rNS*rOS+rP\R                  S, 5       rRS- rSS. rTGSS/ jrUS0 rVSS1\@4S2 jrWSS1\@4S3 jrXSS1\@4S4 jrYS5 rZS6 r[S7 r\S8 r]S9 r^S: r_S; r`S< raS= rbS> rcS?S@SA.SB jrd " SC SD\R                  R                  5      rgSE rh " SF SG\R                  R                  5      ri " SH SI\R                  R                  5      rjSJ rkSK rlSL rm " SM SN\R                  5      roSO rpSP rqS1\@4SQ jrrSR rsGSSS jrtSTSU.SV jruSW rvSX rwS1SY.SZ jrxS[ ryS\ rzS] r{ " S^ S_\R6                  5      r| " S` Sa\%R                  5      r}Sb r~\R                  " ScSd5      rSe rGSSf jrGSSg jr " Sh Si\5      r " Sj Sk\5      r " Sl Sm\5      r " Sn So\5      r " Sp Sq\5      r " Sr Ss\5      r " St Su\5      r " Sv Sw\5      r " Sx Sy\5      r " Sz S{\5      r " S| S}\5      r " S~ S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS rGSS jr\TGSS j5       rGSS jrGSS jrGSS jr\TGSS j5       rGSS jrGSS jrGSS jrS rGSS jrS r " S S5      r\R                  S 5       r\R                  S 5       rGSS jrSS S.S jr\" 5       \l         " S S\5      r\&R<                  S:X  Ga  S SKrS SKrS SKr " S S\GRd                  5      r\GRh                  " S5      r\GRl                  r\GRn                  GRp                  \GRn                  GRr                  \GRn                  GRr                  \GRn                  GRr                  \GRn                  GRr                  \GRt                  " \5      /\l        \GRn                  GRx                  \l        \GR|                  r\GRn                  GRp                  \GRn                  GRr                  \GRn                  GRr                  \GRn                  GRr                  \GRt                  " \5      /\l        \GRn                  GRx                  \l        SrSrS rS rO S SKrS rS r " S S5      r\R                  S 5       r\GR                  SS05      r\GR                  SSSSS.5      rS1S.S jrS rGSS jrGSSS.S jjrS rGSS jrS rS rS rS1S.S jrS rGSS jrS rS rS rS rS rS rS rS rS r\TS 5       r\TGSS j5       rGSS jrS r\TGSS j5       rGSS jrGSS jrS rGSS jrS rGSS jr\GR                  " \S@5      r\GR                  " \S15      r/ 4S jrS rGSS jrS/SS4S jrGSS jr " S S\GR                  GR                  5      r " S S5      r " S S\5      r " S S\5      r " S S5      rS rS rS rS rS r\TSS.S j5       r\TS 5       Gr S GrGSS jGr\GR                  GR                  \@4S jGr\@4S jGrS/ 0 S.S jGrGSS jGrS 4GS  jGrGS Gr	\R" 5       GS4GS jGr
S GSGSGSGSGS.GrS GS	S S GS
GSGS.GrGS GrGS Gr0 4S1GS.GS jjGrGS GrGSGrGSGSGS.GrSSSGSGSGSSSSGSGSGS.GrGSGrGSGrGS GrGS GrGSGS jGrGS GrGS  GrGS! Gr\T\@4GS" j5       GrGS# GrGS$ GrSGS%.GS& jGr\@4GS' jGr GS( Gr!GS) Gr"/ GS*QGr#GS+ Gr$GS, Gr%GSGS- jGr&GS. Gr'GSGS/ jGr(GSGS0 jGr) " GS1 GS25      Gr*GS3 Gr+GS4 Gr,GS5 Gr-GS6 Gr.GSGS7 jGr/GSGS8 jGr0GSGS9 jGr1/ S@4GS: jGr2S/ S@4GS; jGr3 " GS< GS=5      Gr4 " GS> GS?5      Gr5 " GS@ GSA5      Gr6GSGSB jGr7GSC Gr8GSD Gr9GSE Gr:GSF Gr;GSGSG jGr<GSGSH jGr=GSI Gr>GSJ Gr?GSK Gr@GSL GrAGSM GrBGSN GrCGSO GrDGSGSQ jGrEGSRGrFGSSGrGGSTGrHG\FG\HG\GGSU.GrIGSV GrJGSW GrK\TSGSX\@GSP\A4GSY j5       GrLGSZ GrMGS[GrNGS\ GrOGSGS] jGrPGS^ GrQGS_ GrRGS` GrSGSa GrTGSbSGSc.GSd jGrUGSe GrV\R                  GSf 5       GrWGSg GrX\ GR                  " GSh5      GrZGSi Gr[GSj Gr\GSkSGSl.GSm jGr]GSn Gr^GSo Gr_GSp Gr`GSq Gra " GSr GSs5      GrbGSt GrcGSu Grd " GSv GSw5      Gre " GSx GSy5      Grf " GSz GS{\*GR                  5      GrhG\h" GS|GS}GS~GSGSGSGSGSGS9GriG\i=GR                  G\iGR                  -  sGlj        G\i=GR                  G\iGR                  -  sGll        / G\iGR                  QG\iGR                  QG\iGR                  Q7Gro " GS GS\5      Grp " GS GS5      Grq\TGS 5       Grr\TGSGS j5       GrsS1SGS.GS jGrt " GS GS5      GruGS GrvGSGS jGrw " GS GS5      Grx " GS GS\GR                  5      Grzg! \ a
    S rS r GNf = f(      N   )	traversal   )compat_datetime_from_timestampcompat_etree_fromstringcompat_expandusercompat_HTMLParseError)xattr)IN_CLIWINDOWS_VT_MODE.c                       \ rS rSrSrg)
NO_DEFAULT=    N__name__
__module____qualname____firstlineno____static_attributes__r       M/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/utils/_utils.pyr   r   =       r   r   c                     U $ Nr   xs    r   IDENTITYr   A   s    Hr   )JanuaryFebruaryMarchAprilMayJuneJulyAugust	SeptemberOctoberNovemberDecember)janvieru   févriermarsavrilmaijuinjuilletu   août	septembreoctobrenovembreu	   décembre)stycznialutegomarcakwietniamajaczerwcalipcasierpniau	   wrześniau   października	listopadagrudnia)enfrpliii)UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDTu   ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐØŒÙÚÛÜŰÝÞßàáâãäåæçèéêëìíîïðñòóôõöőøœùúûüűýþÿAAAAAAAECEEEEIIIIDNOOOOOOOOEUUUUUYTHssaaaaaaaeceeeeiiiionooooooooeuuuuuythy)*z%d %B %Yz%d %b %Yz%B %d %Yz
%B %dst %Yz
%B %dnd %Yz
%B %drd %Yz
%B %dth %Yz%b %d %Yz
%b %dst %Yz
%b %dnd %Yz
%b %drd %Yz
%b %dth %Yz%b %dst %Y %I:%Mz%b %dnd %Y %I:%Mz%b %drd %Y %I:%Mz%b %dth %Y %I:%Mz%Y %m %d%Y-%m-%dz	%Y.%m.%d.z%Y/%m/%dz%Y/%m/%d %H:%Mz%Y/%m/%d %H:%M:%Sz
%Y%m%d%H%Mz%Y%m%d%H%M%S%Y%m%dz%Y-%m-%d %H:%Mz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%S:%fz%d.%m.%Y %H:%Mz%d.%m.%Y %H.%Mz%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZz%Y-%m-%dT%H:%M:%S.%f0Zz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%Mz%b %d %Y at %H:%Mz%b %d %Y at %H:%M:%Sz%B %d %Y at %H:%Mz%B %d %Y at %H:%M:%Sz%H:%M %d-%b-%Y)z%d-%m-%Yz%d.%m.%Yz%d.%m.%yz%d/%m/%Yz%d/%m/%yz%d/%m/%Y %H:%M:%Sz%d-%m-%Y %H:%Mz%H:%M %d/%m/%Y)z%m-%d-%Yz%m.%d.%Yz%m/%d/%Yz%m/%d/%yz%m/%d/%Y %H:%M:%Sz.}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)zc(?is)<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>\s*(?P<json_ld>{.+?}|\[.+?\])\s*</script>z\d+(?:\.\d+)?c                  z     [         R                  " 5       n SR                  U 5        U $ ! [         a    Sn  U $ f = f)zGet preferred encoding.

Returns the best encoding scheme for the system, based on
locale.getpreferredencoding() and some further tweaks.
TESTzUTF-8)localegetpreferredencodingencode	Exception)prefs    r   preferredencodingrj      sC    **,d K  Ks   &* ::c           	         [         R                  " [        R                  R	                  U5       S3[        R                  R                  U5      SSSSS9n U   [        R                  " XSS9  SSS5        [        R                  S	:X  a9  [        R                  " [        5         [        R                  " U5        SSS5        [        R                  " [        5         [        R                  " S
5      n[        R                  " U5        [        R                  " UR                   SU) -  5        SSS5        [        R"                  " UR                   U5        g! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       NR= f! [$         aV    [        R                  " [        5         [        R&                  " UR                   5        SSS5        e ! , (       d  f       e = ff = f)z>Encode obj as JSON and write it to fn, atomically if possible r   z.tmpFwutf-8)prefixdirsuffixdeletemodeencoding)ensure_asciiNwin32r     )tempfileNamedTemporaryFileospathbasenamedirnamejsondumpsysplatform
contextlibsuppressOSErrorunlinkumaskchmodnamerenamerh   remove)objfntfmasks       r   write_json_filer      s?    
	$	$''""2&'q)rwwr/Be#
ABIIcE2 <<7" $$W-		" .  )88A;DHHTNHHRWWetem, * 			"''2 R
 .-))
    )IIbgg * *)sm   F E06F &E,="F AE=1)F 
E)%F ,
E:6F =
FF $G.2!G	G.
G*	&G.c                   ^ ^ [         R                  " T 5      nUR                  R                  5        Vs/ s H|  nUR                  [         R
                  R                  [         R
                  R                  4;   d  MG  UR                  [         R
                  R                  L d  Mp  UR                  PM~     snm[        R                  " T 5      U U4S j5       nU$ s  snf )Nc                     > [        T[        U 5      S  5      R                  U5      (       a  [        R                  " T/U Q70 UD6$ T" U 0 UD6$ r   )setlen
difference	functoolspartial)argskwargsfuncrequired_argss     r   wrapped$partial_application.<locals>.wrapped   sO    }SYZ()44V<<$$T;D;F;;T$V$$r   )inspect	signature
parametersvalueskind	ParameterPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORDdefaultemptyr   r   wraps)r   sigparamr   r   s   `   @r   partial_applicationr      s    


D
!C # 5 5 7 7u::'++;;W=N=N=d=dee 	==G--333 	

 7M __T% %
 Ns   AC?%C(Cc                     [         R                  " SU5      (       d   eXc  SU S3OSU SU S3-   nU R                  U5      $ )zFind the xpath xpath[@key=val] z^[a-zA-Z_-]+$[@]z='z'])rematchfind)nodexpathkeyvalexprs        r   find_xpath_attrr      sM    88$c****;bQKbRuB4GHD99T?r   c                 &   U R                  S5       Vs/ s H  o"R                  S5      PM     nn/ nU HE  n[        U5      S:X  a  UR                  US   5        M(  Uu  pVUR                  SX    SU 35        MG     SR                  U5      $ s  snf )N/:r   r   {})splitr   appendjoin)rz   ns_mapc
componentsreplacednstags          r   xpath_with_nsr      s    (,

381''#,J8Hq6Q;OOAaD!GBOObBse45  88H 9s   BFc                    ^  U 4S jn[        U[        5      (       a	  U" U5      nOU H  nU" U5      nUc  M    O   Wc(  U[        La  U$ U(       a  Uc  UOUn[        SU 35      eg U$ )Nc                 &   > TR                  U 5      $ r   )r   )r   r   s    r   _find_xpath"xpath_element.<locals>._find_xpath   s    yyr   zCould not find XML element )
isinstancestrr   ExtractorError)r   r   r   fatalr   r   nxps   `       r   xpath_elementr      sy      %BBA} 
 	y*$N L5dD #>tf!EFFHr   c                     [        XX#US9nUb  XT:X  a  U$ UR                  c(  U[        La  U$ U(       a  Uc  UOUn[        SU 35      eg UR                  $ )N)r   r   z"Could not find XML element's text )r   textr   r   )r   r   r   r   r   r   s         r   
xpath_textr     sa    d4gFAyALvv~*$N L5dD #Ftf!MNN66Mr   c                     [        XU5      nUc.  U[        La  U$ U(       a  Uc  U SU S3OUn[        SU 35      eg UR                  U   $ )Nr   r   zCould not find XML attribute )r   r   r   attrib)r   r   r   r   r   r   r   s          r   
xpath_attrr   #  s_    S)Ay*$N)-eWBse1%4D #@!GHH88C=r   c                     [        SX40 UD6$ )zOReturn the content of the tag with the specified ID in the passed HTML documentid)get_element_by_attributer   htmlr   s      r   get_element_by_idr   0  s    #D"=f==r   c                     [        SX40 UD6$ )zLReturn the html of the tag with the specified ID in the passed HTML documentr   )get_element_html_by_attributer   s      r   get_element_html_by_idr   5  s    (rB6BBr   c                 4    [        X5      nU(       a  US   $ S$ )zXReturn the content of the first tag with the specified class in the passed HTML documentr   N)get_elements_by_class
class_namer   retvals      r   get_element_by_classr   :  s    ":4F6!9(D(r   c                 4    [        X5      nU(       a  US   $ S$ )zUReturn the html of the first tag with the specified class in the passed HTML documentr   N)get_elements_html_by_classr   s      r   get_element_html_by_classr   @  s    '
9F6!9(D(r   c                 8    [        XU40 UD6nU(       a  US   $ S $ Nr   )get_elements_by_attribute)	attributevaluer   r   r   s        r   r   r   F  s$    &yHHF6!9(D(r   c                 8    [        XU40 UD6nU(       a  US   $ S $ r   )get_elements_html_by_attribute)r   r   r   kargsr   s        r   r   r   K  s$    +IdLeLF6!9(D(r   c                 J    [        SS[        R                  " U 5       S3USS9$ )z]Return the content of all tags with the specified class in the passed HTML document as a listclass[^\'"]*(?<=[\'"\s])(?=[\'"\s])[^\'"]*Fescape_value)r   r   escape)r   r   r   s      r   r   r   P  s.    $'		*(='>>PQ5" "r   c                 J    [        SS[        R                  " U 5       S3USS9$ )zZReturn the html of all tags with the specified class in the passed HTML document as a listr   r   r   Fr   )r   r   r   )r   r   s     r   r   r   W  s.    )'		*(='>>PQ5" "r   c                  N    [        U 0 UD6 VVs/ s H  u  p#UPM	     snn$ s  snnf )zVReturn the content of the tag with the specified attribute in the passed HTML document'get_elements_text_and_html_by_attribute)r   r   content_s       r   r   r   ^  s)    &Mt&^W]&^_&^
G&^___   !c                  N    [        U 0 UD6 VVs/ s H  u  p#UPM	     snn$ s  snnf )zSReturn the html of the tag with the specified attribute in the passed HTML documentr   )r   r   r   wholes       r   r   r   c  s)    "I4"ZSY"Z["ZhaE"Z[[[r   z[\w:.-]+T)r   r   c          
   #     #    U(       d  g[         R                  " SU5      (       a  SOSnU(       a  [         R                  " U5      OUnSU S[         R                  " U 5       SU SU S	3	n[         R                  " Xb5       Hb  n[	        UR                  S
5      X'R                  5       S 5      u  p[        [         R                  " SSU[         R                  S95      U	4v   Md     g7f)zt
Return the text (content) and the html (whole) of the tag with the specified
attribute in the passed HTML document
Nz
[\s"'`=<>] ?z(?x)
        <(?P<tag>z9)
         (?:\s(?:[^>"']|"[^"]*"|'[^']*')*)?
         \sz\s*=\s*(?P<_q>['"]z)(?-x:z)(?P=_q)
        r   z#^(?P<q>["\'])(?P<content>.*)(?P=q)$z\g<content>)flags)
r   r   r   finditer get_element_text_and_html_by_taggroupstartunescapeHTMLsubDOTALL)
r   r   r   r   r   quotepartial_element_remr   r   s
             r   r   r   h  s     
 ((,e44B#E ,BIIe%E IIi !!3E7& H	 [[+29!''%.$wwyzJZ[  FX_gigpgpqr
 	
 3s   C(C*c                   R    \ rS rSrSr " S S\5      rS rS rS r	S r
S	 rS
 rSrg)HTMLBreakOnClosingTagParseri  z
HTML parser which raises HTMLBreakOnClosingTagException upon reaching the
closing tag for the first opening tag it has encountered, and can be used
as a context manager
c                       \ rS rSrSrg):HTMLBreakOnClosingTagParser.HTMLBreakOnClosingTagExceptioni  r   Nr   r   r   r   HTMLBreakOnClosingTagExceptionr        r   r  c                     [         R                  " 5       U l        [        R                  R
                  R                  U 5        g r   )collectionsdequetagstackr   parser
HTMLParser__init__selfs    r   r  $HTMLBreakOnClosingTagParser.__init__  s*    #))+''-r   c                     U $ r   r   r  s    r   	__enter__%HTMLBreakOnClosingTagParser.__enter__  s    r   c                 $    U R                  5         g r   )closer  r   s     r   __exit__$HTMLBreakOnClosingTagParser.__exit__  s    

r   c                     g r   r   r  s    r   r"  !HTMLBreakOnClosingTagParser.close  s     	r   c                 :    U R                   R                  U5        g r   )r  r   )r  r   r   s      r   handle_starttag+HTMLBreakOnClosingTagParser.handle_starttag  s    S!r   c                    U R                   (       d  [        S5      eU R                   (       a3  U R                   R                  5       nX!:X  a  O"U R                   (       a  M3  [        SU S35      eU R                   (       d  U R                  eg )Nzno tags in the stackz!matching opening tag for closing  tag not found)r  r	   popr  )r  r   	inner_tags      r   handle_endtag)HTMLBreakOnClosingTagParser.handle_endtag  sr    }}'(>??mm))+I mmm
 (*KC5P^(_``}}555 r   )r  N)r   r   r   r   __doc__rh   r  r  r  r$  r"  r)  r/  r   r   r   r   r  r    s1     ."
6r   r  c           
         S nSU  S3nU" USU  3[        SU  S35      5      nU" XS S[        SU  S	35      5      nXTS
-   -  n[        5        nUR                  XU 5        UR                  (       a  UR                  S   U :w  a  [        SU  S	35      eUnU[	        U5      :  aR  U" XS U[        SU  S35      5      nU[	        U5      -   n	 UR                  XXy-    5        Xy-  nU[	        U5      :  a  MR  [        S5      e! [        R
                   a    XXx-    XXy-    4s sSSS5        $ f = f! , (       d  f       g= f)z
For the first element with the specified tag in the passed HTML document
return its' content (text) and the whole element (html)
c                 F     U R                  U5      $ ! [         a    Uef = fr   index
ValueError)haystackneedleexcs      r   find_or_raise7get_element_text_and_html_by_tag.<locals>.find_or_raise  s*    	>>&)) 	I	s     </><zopening r,  Nzmalformed opening z tagr   r   zparser did not match opening zclosing zunexpected end of html)r	   r  feedr  r   r  )
r   r   r:  closing_tagwhole_startcontent_startr  offsetnext_closing_tag_startnext_closing_tag_ends
             r   r  r    s   

 se1+K#i.#n/MNPK!\C!69KC5PT7U!VXM1_$M	$	&&D]34&//!"4";'*GuD(QRRs4y %2W{%^&DE&G" $:C<L#L DD(EFG. s4y  $$<== /MM D&*IJV%BCD D 
'	&D 
'	&s7   A?D2D'D28D2 D/#D2.D//D22
E c                   $    \ rS rSrSrS rS rSrg)HTMLAttributeParseri  zATrivial HTML parser to gather the attributes for a single elementc                 d    0 U l         [        R                  R                  R	                  U 5        g r   )attrsr   r  r  r  r  s    r   r  HTMLAttributeParser.__init__  s!    
''-r   c                 8    [        U5      U l        [        S5      e)Ndone)dictrI  r	   r  r   rI  s      r   r)  #HTMLAttributeParser.handle_starttag  s    %[
#F++r   )rI  N)r   r   r   r   r1  r  r)  r   r   r   r   rG  rG    s    K.,r   rG  c                   *    \ rS rSrSrS rS rS rSrg)HTMLListAttrsParseri  z?HTML parser to gather the attributes for the elements of a listc                 r    [         R                  R                  R                  U 5        / U l        SU l        g r   )r   r  r  r  items_levelr  s    r   r  HTMLListAttrsParser.__init__  s(    ''-
r   c                     US:X  a4  U R                   S:X  a$  U R                  R                  [        U5      5        U =R                   S-  sl         g )Nlir   r   )rT  rS  r   rM  rN  s      r   r)  #HTMLListAttrsParser.handle_starttag  s8    $;4;;!+JJd5k*qr   c                 .    U =R                   S-  sl         g Nr   )rT  )r  r   s     r   r/  !HTMLListAttrsParser.handle_endtag  s    qr   )rT  rS  N)	r   r   r   r   r1  r  r)  r/  r   r   r   r   rQ  rQ    s    I

r   rQ  c                     [        5       n[        R                  " [        5         UR	                  U 5        UR                  5         SSS5        UR                  $ ! , (       d  f       UR                  $ = f)a6  Given a string for an HTML element such as
<el
     a="foo" B="bar" c="&98;az" d=boz
     empty= noval entity="&amp;"
     sq='"' dq="'"
>
Decode and return a dictionary of attributes.
{
    'a': 'foo', 'b': 'bar', c: 'baz', d: 'boz',
    'empty': '', 'noval': None, 'entity': '&',
    'sq': '"', 'dq': '''
}.
N)rG  r   r   r	   r?  r"  rI  )html_elementr  s     r   extract_attributesr^    sV     !"F			2	3L! 
4 << 
4	3 <<s   "A
A4c                 p    [        5       nUR                  U 5        UR                  5         UR                  $ )z[Given a string for an series of HTML <li> elements,
return a dictionary of their attributes)rQ  r?  r"  rS  )webpager  s     r   
parse_listra    s+     !"F
KK
LLN<<r   c                    U c  U $ [         R                  " SSU 5      n [         R                  " SSU 5      n [         R                  " SSU 5      n [         R                  " SSU 5      n [        U 5      n U R                  " 5       $ )z,Clean an HTML snippet into a readable string\s+ z(?u)\s?<\s?br\s?/?\s?>\s?
z(?u)<\s?/\s?p\s?>\s?<\s?p[^>]*>z<.*?>r  )r   r	  r  strip)r   s    r   
clean_htmlrg    sn     |66&#t$D66.d;D664dDAD66'2t$DD::<r   c                   P   ^  \ rS rSrSSSS.U 4S jjr\S 5       rU 4S jrS	rU =r	$ )
LenientJSONDecoder  NFr   )transform_sourceignore_extraclose_objectsc                V   > XsU l         U l        SU-  U l        [        TU ]  " U0 UD6  g Nr   )rk  rl  _close_attemptssuperr  )r  rk  rl  rm  r   r   	__class__s         r   r  LenientJSONDecoder.__init__  s2    3C0t0 =0$)&)r   c                 N   U R                   S U R                   nU R                  R                  S5      (       a  US-   $ UR	                  S5      (       d  g U R                  R                  S5      (       a  US S S-   $ U R                  R                  S5      (       a  US S S-   $ g )NzExpecting ',',zExpecting property namer   zExpecting valuer   )docposmsg
startswithendswith)errrw  s     r   _close_object LenientJSONDecoder._close_object#  s    gghsww77/009c""77788s8c>!WW 122s8c>! 3r   c           
      T  > U R                   (       a  U R                  U5      n[        U R                  S-   5       HH  n U R                  (       a$  U R	                  UR                  5       5      S   s  $ [        TU ]  U5      s  $     S5       e! [        R                   a  nUR                  c  e X R                  :  a  U R                  U5      nUb   S nAM  [        U5      " UR                   SXR                  S-
  UR                  S-    < 3XR                  5      eS nAff = f)Nr   r   z in 
   z Too many attempts to decode JSON)rk  rangerp  rl  
raw_decodelstriprq  decoder}   JSONDecodeErrorrx  r}  typery  )r  sattempterr  s       r   r  LenientJSONDecoder.decode1  s      %%a(AT11A56GT$$??188:6q99w~a((	 7 	988u '' T55=333**1-A} 1gtAeebj,D+GH!UUSSTs%    2B5BD'#1D"AD""D')rp  rl  rk  )
r   r   r   r   r  staticmethodr}  r  r   __classcell__rr  s   @r   ri  ri    s3    /3%WX * *
 " "9 9r   ri  c                 :   U S:X  a  [         R                  S:X  an  SSKn[        R                  " [
        R                  5         UR                  " [         R                  R                  5       [        R                  5        SSS5        [        [         R                  S5      (       a  [         R                  R                  U 4$ [         R                  U 4$ [        S5       H:  n  [         R                  S:X  a  [        e[!        XSS9R#                  5       nX@4s  $    g! , (       d  f       N= f! [$         a    ['        X5      n N0f = f! [$         aD  nU(       d  UR(                  [(        R*                  4;   a  e U [-        U 5      pX`:X  a  e  SnAM  SnAff = f)	aW  Try to open the given filename, and slightly tweak it if this fails.

Attempts to open the given filename. If this fails, it tries to change
the filename slightly, step by step, until it's either able to open it
or it fails and raises a final exception, like the standard open()
function.

It returns the tuple (stream, definitive_file_name).
-ru   r   Nbufferr   F)block)r   r   msvcrtr   r   ioUnsupportedOperationsetmodestdoutfilenory   O_BINARYhasattrr  r  LockingUnsupportedErrorlocked_filer  r   openerrnoEACCESsanitize_path)filename	open_moder  r  streamr|  old_filenames          r   sanitize_openr  D  s:    3<<7" $$R%<%<=szz002BKK@ >%,SZZ%B%B

!!T\]]

T\]]8	3<<7* 21$XFPPR ## 	 >=  3h23  	#))6%-}X/F(' (		sB   >D &2D1E 
D.1E	EE		E
F9FFc                     Sn[         R                  R                  U 5      nUb  [         R                  R                  U5      nU$ )z:Convert RFC 2822 defined time string into system timestampN)emailutilsparsedate_tz	mktime_tz)timestr	timestamp	timetuples      r   timeconvertr  k  s;    I((1IKK)))4	r   c                   ^^ U S:X  a  gUU4S jnT(       a'  T[         L d  T(       d  [        R                  " SU 5      n [        R                  " SS U 5      n SR                  [        X05      5      nT[         L a9  [        R                  " SSU5      nSn[        R                  " S	U S
U S3SU5      nUR                  SS5      =(       d    SnT(       d  SU;   a  UR                  SS5      nSU;   a  M  UR                  S5      nT(       a  UR                  S5      (       a  USS nUR                  S5      (       a  SU[        S5      S -   nUR                  S5      nU(       d  SnU$ )a  Sanitizes a string so it could be used as part of a filename.
@param restricted   Use a stricter subset of allowed characters
@param is_id        Whether this is an ID that should be kept unchanged if possible.
                    If unset, yt-dlp's new sanitization rules are in effect
r  c                   > T(       a  U [         ;   a	  [         U    $ T(       d  U S:X  a  gT[        L a7  T(       d0  U S;   a*  SSS.R                  U [        [	        U 5      S-   5      5      $ U S:X  d  [	        U 5      S	:  d  [	        U 5      S
:X  a  gU S:X  a  T(       a  S$ S$ U S:X  a  T(       a  S$ S$ U S;   a  gT(       aK  U S;   d$  U R                  5       (       d  [	        U 5      S
:  a!  [        R                  " U 5      S   S;   a  S$ S$ U $ )Nre  z  z	"*:<>?|/\u   ⧸u   ⧹)r   \i  r         r  "'r   z _ -z   -z\/|*<>z _z!&'()[]{}$;`^,#r   CM)ACCENT_CHARSr   getchrordisspaceunicodedatacategory)charis_id
restricteds    r   replace_insane)sanitize_filename.<locals>.replace_insane}  s    $,.%%j 8L!266tSTVAS=TUUS[CINc$i3.>S[#2--S[)87x7Y4#553t9WZ?$--d3A6$>2IEIr   NFKCz[0-9]+(?::[0-9]+)+c                 D    U R                  S5      R                  SS5      $ )Nr   r   r   )r  replacer  s    r   <lambda>#sanitize_filename.<locals>.<lambda>  s    
0B0B30Lr   z(\0.)(?:(?=\1)..)+\1z(?:\0.|[ _-])*z^ .|z .$ r   __z-_r   Nr  r   )r   r  	normalizer   r	  r   mapr  rf  rz  r   r  )r  r  r  r  resultSTRIP_REs    ``   r   sanitize_filenamer  t  sA    	Bw* u
*%!!&!,
$&LaPAWWS+,F
-uf=$$xj(48"fE^^D"%,Ffn^^D#.F fnc"&++D11ABZFS!!6#c(),,Fs#FMr   c                     / nU  Hu  nU(       a  US:X  a  M  US:X  a4  U(       a  US   S:w  a  UR                  5         OUR                  S5        ML  [        R                  " SSU5      nUR                  U5        Mw     U$ )Nr   z..rv  z[/<>:"\|\\?\*]|[\s.]$#)r-  r   r   r	  )partssanitized_partspartsanitized_parts       r   _sanitize_path_partsr    s{    Ots{T\?2#6$#>##%&&t,  8#tD~.  r   c                    [         R                  S:w  a`  U(       d  U $ U R                  S5      (       a  SOSnSR                  [	        U R                  S5      5      5      nU(       d  U(       a  X#-   $ S$ U R                  SS5      nUR                  S5      (       a.  UR                  S5      nSR                  USS 5      S-   nUSS nOMUS	S
 S:X  a&  US
S S:X  a  SOS
nUSU nXFS R                  S5      nOUSS	 S:X  a  SOSnUR                  S5      nSR                  [	        U5      5      nU(       d  U(       a  X#-   $ S$ )z(Sanitizes and normalizes path on Windowsru   r   r  r   r  z\\N   r   r   r      )r   r   rz  r   r  r   r  )r  forcerootrz   normedr  rC  s          r   r  r    s5   
||wHll3''sRxx,QWWS\:;"dt{33YYsD!F  T"yyr#d*ab		!	QqkT)qgvw%%d+ bqzT)trT"99)%01D$4;/C/r   http)schemec                    U c  g U R                  S5      (       a  U SU  3$ SnU H9  u  p4[        R                  " X05      (       d  M"  [        R                  " X4U 5      s  $    U $ )N//r   ))z
^httpss://zhttps://)z^rmtp([es]?)://z	rtmp\1://)rz  r   r   r	  )urlr  COMMON_TYPOSmistakefixups        r   sanitize_urlr    sh     {			3%  L '88G!!66'#.. ' Jr   c                    [         R                  R                  U 5      nUR                  c  U S 4$ [         R                  R	                  UR                  UR                  c  UR                  OUR                   SUR                   3S95      n [        R                  " SR                  UR                  UR                  =(       d    S5      R                  5       5      nU SUR                  5        34$ )Nr   )netlocz{}:{}r  zBasic )urllibparseurlsplitusername
urlunsplit_replaceporthostnamebase64	b64encodeformatpasswordrg   r  )r  r  auth_payloads      r   extract_basic_authr    s    LL!!#&E~~Dy
,,
!
!%..**,q- #1 #0 1C ##	(<"	=EEGIL&,,./000r   c                 R    [         R                  R                  [        U 5      5      $ )zExpand shell variables and ~)ry   rz   
expandvarsr   r  s    r   expand_pathr    s    77/233r   )lazyc                L   ^  U 4S jnU(       a  U" 5       $ [        U" 5       5      $ )z-Remove all duplicates from the input iterablec               3   \   >#    / n T H  nX;  d  M
  U R                  U5        Uv   M!     g 7fr   )r   )seenr   iterables     r   _iterorderedSet.<locals>._iter  s*     A}A s   ,,)list)r  r  r   s   `  r   
orderedSetr    s     57-UW-r   c                 >   U SS nU[         R                  R                  ;   a&  [        [         R                  R                  U   5      $ U [         R                  R                  ;   a  [         R                  R                  U    $ [
        R                  " SU5      nUbi  UR                  S5      nUR                  S5      (       a  SnSU 3nOSn[        R                  " [        5         [        [        X45      5      sSSS5        $ S	U S
3$ ! , (       d  f       N= f)z)Transforms an HTML entity to a character.Nrv  z#(x[0-9a-fA-F]+|[0-9]+)r   r      0r  &;)r   entitiesname2codepointr  html5r   r   r  rz  r   r   r6  int)entity_with_semicolonentitymobjnumstrbases        r   _htmlentity_transformr    s    "3B'F ---4==//788  3 33}}""#89988.7DAS!!D\FD  ,s6() -, vha=	 -,s   *D
Dc                 j    U c  g [        U [        5      (       d   e[        R                  " SS U 5      $ )Nz
&([^&;]+;)c                 6    [        U R                  S5      5      $ rZ  )r  r  r  s    r   r  unescapeHTML.<locals>.<lambda>1  s    !6qwwqz!Br   )r   r   r   r	  r  s    r   r  r  +  s8    ya66BAG Gr   c                     U R                  SS5      R                  SS5      R                  SS5      R                  SS5      R                  S	S
5      $ )Nr  &amp;r>  z&lt;r=  z&gt;r  z&quot;r  z&#39;r  )r   s    r   
escapeHTMLr  4  sF    	g		f		f		h		g	r   c                       \ rS rSrS rSrg)netrc_from_contenti?  c                     0 0 sU l         U l        [        R                  " U5       nU R	                  SUS5        S S S 5        g ! , (       d  f       g = f)Nr  F)hostsmacrosr  StringIO_parse)r  r   r  s      r   r  netrc_from_content.__init__@  s<    "$b
DK[[!VKKVU+ "!!s   A
A)r  r  N)r   r   r   r   r  r   r   r   r   r  r  ?  s    ,r   r  c                     ^  \ rS rSr\R
                  S:X  a1  \R                  " 5       r\=R                  \R                  -  sl	        OSr\S 5       rSSSS.U 4S jjrS rS	 rS
S.U 4S jjr\SS.S j5       rSrU =r$ )PopeniF  ru   Nc                 h   ^  [        [        S5      (       d  g ST S'   U 4S jnU" S5        U" S5        g )N_MEIPASS1PYINSTALLER_RESET_ENVIRONMENTc                 d   > TR                  U  S35      nUc  TR                  U S 5        g UTU '   g )N_ORIG)r  r-  )r   origenvs     r   _fix+Popen._fix_pyinstaller_issues.<locals>._fixZ  s3    77cU%=)D|T"Cr   LD_LIBRARY_PATHDYLD_LIBRARY_PATH)r  r   )r+  r,  s   ` r   _fix_pyinstaller_issuesPopen._fix_pyinstaller_issuesM  s9    sJ''
 03+,
	  	 !r   F)r+  r   shellc                ~  > Uc  [         R                  R                  5       nU R                  U5        UR	                  S5      =(       d2    UR	                  S5      =(       d    U=(       d    UR	                  S5      U l        USL a)  SUS'   UR                  SS5        UR                  SS5        U(       ab  [         R                  S:X  aN  UR	                  S5      c<  [        U[        5      (       d
  [        USS	9nS
nSUS'   U R                  5        SU S3n[        TU ]4  " U/UQ7X$S.UDSU R                  0D6  g )Nrs   errorsuniversal_newlinesTrm   r  nt
executabler2  Fz"^

"=z /Q /S /D /V:OFF /E:ON /C "r  )r+  r2  startupinfo)ry   environcopyr0  r  _Popen__text_mode
setdefaultr   r   r   shell_quote_Popen__comspecrq  r  _startupinfo)r  r   r+  r   r2  	remainingr   rr  s          r   r  Popen.__init__d  s   ;**//#C$$S)!::j1uVZZ5IuTuU[U_U_`tUu4<+/F'(j'2h	2RWW_L)A)IdC(("4t4E CHnn&''B4&JDi	isi6iW[WhWhir   c                 .   [         R                  R                  S5      =(       d?    [         R                  R	                  [         R                  R                  SS5      SS5      n[         R                  R                  U5      (       a  U$ [        S5      e)NComSpec
SystemRootr  System32zcmd.exez:shell not found: neither %ComSpec% nor %SystemRoot% is set)ry   r;  r  rz   r   isabsFileNotFoundError)r  comspecs     r   	__comspecPopen.__comspecy  sd    **..+ Erww||JJNN<,j)0E77==!!N \]]r   c                 d     U R                   " U0 UD6$ ! [         a    U R                  S S9  e f = f)Ntimeout)communicateBaseExceptionkillr  r   r   s      r   communicate_or_killPopen.communicate_or_kill  s=    	##T4V44 	IIdI#	s    /r   rN  c                N   > [         TU ]  5         US:w  a  U R                  US9  g g )Nr   rN  )rq  rR  wait)r  rO  rr  s     r   rR  
Popen.kill  s&    a<IIgI& r   c                    U " U0 UD6 nUR                   (       a  SOSnUR                  US9u  pgU=(       d    UU=(       d    UUR                  4sS S S 5        $ ! , (       d  f       g = f)Nr  r   rN  )r=  rT  
returncode)clsrO  r   r   procr   r  stderrs           r   run	Popen.run  sY    $!&!T ,,b#G!55g5FNF$Wf&7H "!!s   AA
A()__text_mode)r   r   r   r   r   r   
subprocessSTARTUPINFOrA  dwFlagsSTARTF_USESHOWWINDOWr  r0  r  r@  rT  rR  classmethodr^  r   r  r  s   @r   r#  r#  F  s    
||w!--/
 ? ??" ", .2U j j*^   ' '
  $ I Ir   r#  c                 R    [        U [        5      (       a  U $ U R                  S5      $ Nascii)r   r   r  r  s    r   encodeArgumentri    s$     1c""19(99r   Time)hoursminutessecondsmillisecondsc                 n    [        U S5      u  p[        US5      u  p![        US5      u  p2[        X2X5      $ )N  <   )divmod
_timetuple)msecsecsminshrss       r   timetuple_from_msecrx    s9    d#JDb!JDtR ICc,,r   c                 8   [        U S-  5      nUR                  (       a'  SUR                  XR                  XR                  4-  nO<UR                  (       a  SUR                  XR                  4-  nOSUR                  -  nU(       a  SXCR                  4-  $ U$ )Nrp  z%d%s%02d%s%02dz%d%s%02d%dz%s.%03d)rx  rk  rl  rm  rn  )ru  delimrt  timerets        r   formatSecondsr~    s{    td{+Dzz$**e\\5,,!WW	DLL%>>T\\!379..//@S@r   c                     SSK Jn  SU S3nU R                  5       n U (       a  U R                  S5      (       a  US   R	                  5       USS  -   nU (       a  U S-   U-   $ S	U-   $ )
Nr   )
REPOSITORYz0please report this issue on  https://github.com/zo/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U)r   !r  r   r   rd  r  )updater  rstripr{  title)beforer  ry  s      r   bug_reports_messager    sn    #=j\ Jp pC ]]_FV___55!fllns12w&"FSLc11c11r   c                   4   ^  \ rS rSrSrSrSU 4S jjrSrU =r$ )YoutubeDLErrori  z$Base exception for YoutubeDL errors.Nc                    > Ub  Xl         O'U R                   c  [        U 5      R                  U l         [        TU ]  U R                   5        g r   )ry  r  r   rq  r  )r  ry  rr  s     r   r  YoutubeDLError.__init__  s9    ?HXXDz**DH"r   )ry  r   	r   r   r   r   r1  ry  r  r   r  r  s   @r   r  r    s    .
C# #r   r  c                   R   ^  \ rS rSrSrSU 4S jjr\S 5       rS rU 4S jr	Sr
U =r$ )	r   i  zError during info extraction.c                   > SSK Jn  [        R                  " 5       S   U;   a  Sn[	        U5      U l        X l        X0l        X@l        XPl	        X`l
        [        R                  " 5       U l        [        U R                  S   [        5      (       a  U R                  S   R                  U l        [        TU ]9  U R                  5        g)ztb, if given, is the original traceback (so that it can be printed out).
If expected is set, this is a normal error message and most likely not a bug in yt-dlp.
r   )network_exceptionsr   Tr   N)networking.exceptionsr  r   exc_infor   orig_msg	tracebackexpectedcausevideo_idier   r   rq  r  _ExtractorError__msg)	r  ry  tbr  r  r  r  r  rr  s	           r   r  ExtractorError.__init__  s     	?<<>! 22HC 
 dmmA&77 MM!,55DM$r   c           
          SR                  [        U R                  S S5      [        U R                  S S5      U R                  [        U R
                  S S5      U R                  (       a  S45      $ [        5       45      $ )Nr  z[%s] z%s: z (caused by %r))r   format_fieldr  r  r  r  r  r  r  s    r   __msgExtractorError.__msg  sp    ww$0f5MMT+<=--B< = 	=
 &9%:< = 	=r   c           
      \   [        U R                  =(       a/    SR                  [        R                  " U R                  5      5      U R                  =(       aH    SR                  [        R
                  " S U R                  U R                  R                  5      SS  5      SS9=(       d    S $ )Nr  r   re  r{  )join_nonemptyr  r   	format_tbr  format_exception__traceback__r  s    r   format_tracebackExtractorError.format_traceback  s~    NNKrwwy':':4>>'JKJJn2779#=#=dDJJPTPZPZPhPh#ijkjl#mn    	 r   c                    > [         TU ]  X5        [        U SS 5      (       aG  US;  a@  U R                  =(       d    [	        U 5      R
                  U l        U R                  4U l        g g g )Nry  )ry  r   )rq  __setattr__getattrr  r  r   ry  r   )r  r   r   rr  s      r   r  ExtractorError.__setattr__  sV    D(4%%$o*Ezz8T$Z%8%8DHDI +F%r   )	r   r  r  r  r  ry  r  r  r  )NFNNN)r   r   r   r   r1  r  propertyr  r  r  r   r  r  s   @r   r   r     s.    '%& = = % %r   r   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )UnsupportedErrori  c                 4   > [         TU ]  SU 3SS9  Xl        g )NzUnsupported URL: Tr  )rq  r  r  )r  r  rr  s     r   r  UnsupportedError.__init__  s&    u% 	 	6r   r  r   r   r   r   r  r   r  r  s   @r   r  r    s     r   r  c                       \ rS rSrSrSrg)RegexNotFoundErrori  zError when a regex didn't matchr   Nr   r   r   r   r1  r   r   r   r   r  r    s    )r   r  c                   0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )GeoRestrictedErrori  zGeographic restriction Error exception.

This exception may be thrown when a video is not available from your
geographic location due to geographic restrictions imposed by a website.
c                 >   > SUS'   [         TU ]  " U40 UD6  X l        g )NTr  )rq  r  	countries)r  ry  r  r   rr  s       r   r  GeoRestrictedError.__init__  s$    !z''"r   )r  r   r   r   r   r   r1  r  r   r  r  s   @r   r  r    s    # #r   r  c                   0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )UserNotLivei  z%Error when a channel/user is not livec                 D   > SUS'   [         TU ]  " U=(       d    S40 UD6  g )NTr  z!The channel is not currently live)rq  r  )r  ry  r   rr  s      r   r  UserNotLive.__init__  s%    !zC CNvNr   r   r   r  r  s   @r   r  r    s    /O Or   r  c                   0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )DownloadErrori  zDownload Error exception.

This exception may be thrown by FileDownloader objects if they are not
configured to continue on errors. They will contain the appropriate
error message.
c                 0   > [         TU ]  U5        X l        g)zgexc_info, if given, is the original exception that caused the trouble (as returned by sys.exc_info()). N)rq  r  r  )r  ry  r  rr  s      r   r  DownloadError.__init__  s     r   )r  r   r  r  s   @r   r  r    s    ! !r   r  c                       \ rS rSrSrSrSrg)EntryNotInPlaylisti$  zEntry not in playlist exception.

This exception will be thrown by YoutubeDL when a requested entry
is not found in the playlist info_dict
zEntry not found in infor   Nr   r   r   r   r1  ry  r   r   r   r   r  r  $  s    
 $Cr   r  c                   4   ^  \ rS rSrSrSrSU 4S jjrSrU =r$ )SameFileErrori-  zSame File exception.

This exception will be thrown by FileDownloader objects if they detect
multiple files would have to be downloaded to the same file on disk.
z4Fixed output name but more than one file to downloadc                 n   > Ub  U =R                   SU 3-  sl         [        TU ]	  U R                   5        g N: ry  rq  r  )r  r  rr  s     r   r  SameFileError.__init__5  s.    HH"XJ'H"r   r   r   r  r  s   @r   r  r  -  s    
 AC# #r   r  c                       \ rS rSrSrSrg)PostProcessingErrori;  zPost Processing exception.

This exception may be raised by PostProcessor's .run() method to
indicate an error in the postprocessing task.
r   Nr  r   r   r   r  r  ;  s    r   r  c                       \ rS rSrSrSrSrg)DownloadCancellediC  z?Exception raised when the download queue should be interrupted zThe download was cancelledr   Nr  r   r   r   r  r  C  s
    J
&Cr   r  c                       \ rS rSrSrSrSrg)ExistingVideoReachediH  z--break-on-existing triggered zWEncountered a video that is already in the archive, stopping due to --break-on-existingr   Nr  r   r   r   r  r  H  s
    )
cCr   r  c                       \ rS rSrSrSrSrg)RejectedVideoReachediM  z--break-match-filter triggered zSEncountered a video that did not match filter, stopping due to --break-match-filterr   Nr  r   r   r   r  r  M  s
    *
_Cr   r  c                       \ rS rSrSrSrSrg)MaxDownloadsReachediR  z(--max-downloads limit has been reached. zDMaximum number of downloads reached, stopping due to --max-downloadsr   Nr  r   r   r   r  r  R  s
    3
PCr   r  c                   0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )ReExtractInfoiW  z%Video info needs to be re-extracted. c                 0   > [         TU ]  U5        X l        g r   )rq  r  r  )r  ry  r  rr  s      r   r  ReExtractInfo.__init__Z  s     r   r  Fr  r  s   @r   r  r  W  s    0! !r   r  c                   0   ^  \ rS rSrSrSrU 4S jrSrU =r$ )ThrottledDownloadi_  z'Download speed below --throttled-rate. z*The download speed is below throttle limitc                 6   > [         TU ]  U R                  SS9  g )NFr  rq  r  ry  r  rr  s    r   r  ThrottledDownload.__init__c  s    E2r   r   r  r  s   @r   r  r  _  s    2
6C3 3r   r  c                   4   ^  \ rS rSrSrSrSU 4S jjrSrU =r$ )UnavailableVideoErrorig  zUnavailable Format exception.

This exception will be thrown when a video is requested
in a format that is not available for that video.
zUnable to download videoc                 n   > Ub  U =R                   SU 3-  sl         [        TU ]	  U R                   5        g r  r  )r  r|  rr  s     r   r  UnavailableVideoError.__init__o  s-    ?HH"SE
"H"r   r   r   r  r  s   @r   r  r  g  s    
 %C# #r   r  c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )ContentTooShortErroriu  zContent Too Short exception.

This exception may be raised by FileDownloader objects when a file they
download is too small for what the server announced first, indicating
the connection was probably interrupted.
c                 J   > [         TU ]  SU SU S35        Xl        X l        g )NzDownloaded z bytes, expected z bytes)rq  r  
downloadedr  )r  r  r  rr  s      r   r  ContentTooShortError.__init__}  s*    ;zl2CH:VTU$ r   )r  r  r  r  s   @r   r  r  u  s    ! !r   r  c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )XAttrMetadataErrori  c                 b  > [         TU ]  U5        Xl        X l        U R                  [        R
                  [        R                  4;   d   SU R                  ;   d  SU R                  ;   a  SU l        g U R                  [        R                  :X  d  SU R                  ;   a  SU l        g SU l        g )NzNo space leftzDisk quota exceededNO_SPACEzArgument list too longVALUE_TOO_LONGNOT_SUPPORTED)	rq  r  codery  r  ENOSPCEDQUOTreasonE2BIG)r  r  ry  rr  s      r   r  XAttrMetadataError.__init__  s~    	 II%,,55"dhh.2G4882S$DKYY%++%)ATXX)M*DK)DKr   )r  ry  r  )NzUnknown errorr  r  s   @r   r  r    s    * *r   r  c                       \ rS rSrSrg)XAttrUnavailableErrori  r   Nr   r   r   r   r  r    r   r   r  c                 L    [        U [        [        [        R                  45      $ r   )r   r   bytesry   PathLikefs    r   is_path_liker    s    a#ubkk233r   c           	         [         R                  " SU 5      nS nU(       d  [         R                  " SU 5      n[        R                  U=(       a    UR	                  S5      R                  5       5      nUb2  U S [        UR	                  S5      5      *  n [        R                  " US9nOU S [        UR	                  S5      5      *  n UR	                  S5      (       ad  UR	                  S5      S:X  a  SOSn[        R                  " U[        UR	                  S	5      5      -  U[        UR	                  S
5      5      -  S9nUc'  U[        La  U=(       d    [        R                  " 5       nX04$ )Na  (?x)
            ^.{8,}?                                              # >=8 char non-TZ prefix, if present
            (?P<tz>Z|                                            # just the UTC Z, or
                (?:(?<=.\b\d{4}|\b\d{2}:\d\d)|                   # preceded by 4 digits or hh:mm or
                   (?<!.\b[a-zA-Z]{3}|[a-zA-Z]{4}|..\b\d\d))     # not preceded by 3 alpha word or >= 4 alpha or 2 digits
                   [ ]?                                          # optional space
                (?P<sign>\+|-)                                   # +/-
                (?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})       # hh[:]mm
            $)
        +\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$tzrk  sign+r   rv  rk  rl  )rk  rl  )r   searchTIMEZONE_NAMESr  r  rf  r   dt	timedeltar  r   )date_strr   r  timezoner  s        r   extract_timezoner    s/   
				 
	A HIIDhO!%%a&AAGGDM,?,?,AB 4#aggdm"4!45H||(3H0c!''$-001776??3.1BD||S!122s1779#5668H G:5,bllnr   c                 `   U c  g[         R                  " SSU 5      n [        X5      u  p [        R                  " [
        [        5         SU S3n[        R                  R                  X5      U-
  n[        R                  " UR                  5       5      sSSS5        $ ! , (       d  f       g= f)z,Return a UNIX timestamp from the given date Nz\.[0-9]+r  ra   z%H:%M:%S)r   r	  r  r   r   r6  	TypeErrorr  datetimestrptimecalendartimegmr  )r	  	delimiterr
  date_formatdt_s        r   parse_iso8601r    s     vvk2x0H)(=H			Z	3 84kk""89HDs}}/ 
4	3	3s   	AB
B-c                 (    U (       a  [         $ [        $ r   )DATE_FORMATS_DAY_FIRSTDATE_FORMATS_MONTH_FIRST)	day_firsts    r   date_formatsr    s    %.!L4LLr   c                    U c  gSnU R                  SS5      n [        R                  " SSU 5      n [        U 5      u  p0[	        U5       HT  n[
        R                  " [        5         [        R                  R                  X5      R                  S5      nSSS5        MV     Ucn  [        R                  R                  U 5      nU(       aH  [
        R                  " [        5         [        R                  " USS 6 R                  S5      nSSS5        Ub  [        U5      $ g! , (       d  f       M  = f! , (       d  f       N/= f)z4Return a string with the date in the format YYYYMMDDNru  rd  (?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?r  rb      )r  r   r	  r  r  r   r   r6  r  r  r  strftimer  r  r  r   )r	  r  upload_dater   
expressionr  s         r   unified_strdater!    s     KS)Hvv7XFH"8,KA"9-
  ,++..xDMMhWK -, . KK,,X6	$$Z0 kk9Ra=9BB8L 1;  -,
 10s   &/D!$&D3!
D0	3
Ec           	         [        U [        5      (       d  g [        R                  " SS[        R                  " SSU 5      5      n [        R                  " SU 5      (       a  SOSn[        U 5      u  p0[        R                  " SSU 5      n [        R                  " S	U 5      nU(       a  U S [        UR                  S
5      5      *  n [        R                  " SU 5      nU(       a  UR                  S5      n [        U5       H  n[        R                  " [        5         [        R                  R                  X5      U-
  [        R                  " US9-   n[         R"                  " UR%                  5       5      sS S S 5        s  $    [&        R(                  R+                  U 5      nU(       a6  [         R"                  " U5      US-  -   [-        UR/                  5       5      -
  $ g ! , (       d  f       M  = f)Nrc  rd  z>(?i)[,|]|(mon|tues?|wed(nes)?|thu(rs)?|fri|sat(ur)?|sun)(day)?r  z(?i)PM   r   r  r   r  zT^([0-9]{4,}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{6})[0-9]+$r   r    )r   r   r   r	  r  r  r   r  r  r   r   r6  r  r  r  r  r  r  r  r  r  r  r  total_seconds)r	  r  pm_deltar
  r  r   r  r  s           r   unified_timestampr'    s{   h$$vvfc266I2x$Y ZH YYy(33rH)(3H vv7XFH 			@(KA0c!''$-001 			ikstA771:"9-
  ,++&&x<xG",,]eJffC??3==?3 -, .
 ((2Iy)HtO;c(BXBXBZ>[[[  -,s   AG##
G2	c                     U b  SU ;  a  U$ U R                  S5      S   R                  S5      S   n[        R                  " SU5      (       a  U$ UR	                  S5      [
        ;   a  UR	                  S5      $ U$ )Nr   r  r   r   z^[A-Za-z0-9]+$r   )	partition
rpartitionr   r   r  KNOWN_EXTENSIONS)r  default_extguesss      r   determine_extr.    st    
{cnMM#q!,,S1!4E	xx!5))	c	.	.||C  r   c                 &    [        XS-   U-   U5      $ Nr   )replace_extension)r  sub_lang
sub_formatexpected_real_exts       r   subtitles_filenamer5    s    X#~
'BDUVVr   c                    SnUS:X  a  SnSn[        [        R                  R                  [        R                  R
                  5      U5      nU S;   a  U$ U S:X  a  U[        R                  " SS9-
  $ [        R                  " S	U 5      nUb  [        UR                  S
5      X5      n[        UR                  S5      5      UR                  S5      S:X  a  SOS-  nUR                  S5      nUS:X  d  US:X  a  [        XhS:X  a  US-  OU5      n	SnO,US:X  a  SnUS-  n[        R                  " S0 US-   U0D6n
Xj-   n	U(       a  [        X5      $ U	$ [        [        R                  R                  X5      U5      $ )ap  
Return a datetime object from a string.
Supported format:
    (now|today|yesterday|DATE)([+-]\d+(microsecond|second|minute|hour|day|week|month|year)s?)?

@param format       strftime format of DATE
@param precision    Round the datetime object: auto|microsecond|second|minute|hour|day
                    auto: round to the unit provided in date_str (if applicable).
FautoTmicrosecond)nowtoday	yesterdayr   )dayszf(?P<start>.+)(?P<sign>[+-])(?P<time>\d+)(?P<unit>microsecond|second|minute|hour|day|week|month|year)s?r  r|  r  r  rv  unitmonthyearr#  dayweek   r  r   )datetime_roundr  r  r9  r
  utcr  r   r   datetime_from_strr  r  datetime_add_monthsr  )r	  	precisionr  auto_precisionr:  r   
start_timer|  r=  new_datedeltas              r   rE  rE    s_    NF!	2;;??2;;??;YGE##;r||+++HHqE &u{{7';YO
5;;v&'V1D1K2QRS{{6"7?dfn*:FNtbyX\]HDv~	LL6D3J#56E!)H!(11"++..x@)LLr   c                     U(       a+  [         R                  " SU 5      (       d  [        SU  S35      e[        U SUS9R	                  5       $ )z
Return a date object from a string using datetime_from_str

@param strict  Restrict allowed patterns to "YYYYMMDD" and
               (now|today|yesterday)(-\d+(day|week|month|year)s?)?
z9\d{8}|(now|today|yesterday)(-\d+(day|week|month|year)s?)?zInvalid date format "r  r8  )rG  r  )r   	fullmatchr6  rE  date)r	  r  stricts      r   date_from_strrP  H  sF     bll#_aijj0
!<==XvNSSUUr   c                     U R                   U-   S-
  nU R                  US-  -   nUS-  S-   n[        U R                  [        R
                  " X25      S   5      nU R                  X2U5      $ )z0Increment/Decrement a datetime object by months.r   r#  )r>  r?  minr@  r  
monthranger  )r  monthsr>  r?  r@  s        r   rF  rF  T  se    II"E88erk!DBJNE
cggx**47:
;C;;tC((r   c                     US:X  a  U $ SnSSSSS.nS nU" [         R                  " U R                  5       5      U R                  U-  -   X1   5      n[	        U5      $ )	z8
Round a datetime object's time to a specific precision
r8  @B Q r$  rq  r   )r@  hourminutesecondc                     XS-  -   U-  U-  $ ro  r   )r   r   s     r   r   datetime_round.<locals>.<lambda>k  s    QQY1,1r   )r  r  r  r8  r   )r  rG  
time_scaleunit_secondsroundtor  s         r   rC  rC  ]  sh     M!
J	L 2G83??Z;WWYeYpqI))44r   c                 x    [         R                  " SU 5      nUb  SR                  UR                  5       5      $ U $ )z;
Convert a date in 'YYYYMMDD' format to 'YYYY-MM-DD' formatz^(\d\d\d\d)(\d\d)(\d\d)$r  )r   r   r   groups)r	  r   s     r   hyphenate_daterb  p  s5     HH0(;Exx''r   c                   J    \ rS rSrSrSS jr\S 5       rS rS r	S r
S	 rS
rg)	DateRangeiz  z,Represents a time interval between two datesNc                 V   Ub  [        USS9U l        O-[        R                  R                  R                  5       U l        Ub  [        USS9U l        O-[        R                  R                  R                  5       U l        U R                  U R                  :  a  [        SU  S35      eg)z<start and end must be strings in the format accepted by dateNTrO  zDate range: "z." , the start date must be before the end date)	rP  r  r  r  rR  rN  endmaxr6  r  r  rg  s      r   r  DateRange.__init__}  s    &uT:DJ--/DJ?$S6DH{{++-DH:: }TF2`abb !r   c                     U " X5      $ )z0Returns a range that only contains the given dayr   )r[  r@  s     r   r@  DateRange.day  s     3}r   c                     [        U[        R                  5      (       d  [        U5      nU R                  Us=:*  =(       a    U R
                  :*  $ s  $ )z!Check if the date is in the range)r   r  rN  rP  r  rg  )r  rN  s     r   __contains__DateRange.__contains__  s>    $(( &DzzT--TXX----r   c                     [          S[        U 5      R                    SU R                  R                  5       < SU R                  R                  5       < S3$ Nr   (, ))r   r  r  	isoformatrg  r  s    r   __repr__DateRange.__repr__  sI    1T$Z0014::3G3G3I2LBtxxOaOaOcNffghhr   c                 8    U R                    SU R                   3$ )Nz to )r  rg  r  s    r   __str__DateRange.__str__  s    **T$((,,r   c                     [        U[        5      =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ r   )r   rd  r  rg  r  others     r   __eq__DateRange.__eq__  s>    5), HJJ%++-H26((eii2G	Ir   )rg  r  NN)r   r   r   r   r1  r  re  r@  rn  rv  ry  r~  r   r   r   r   rd  rd  z  s5    6c  .i-Ir   rd  c                  :   [         R                  " 5       n U S:X  a.  [        [        S5      (       a  U S[        R                  S S -  -  n / n[
        R                  " [        5         [         R                  " 5       nS S S 5        SR                  [         R                  " 5       U [         R                  " 5       [         R                  " 5       S   [         R                   " 5       [        R                  [        [!        USS06S S	5      5      $ ! , (       d  f       N= f)
NPyPypypy_version_infoz version %d.%d.%dr  z Python {} ({} {} {}) - {} ({}{})r   r{  rd  z, %s)r   python_implementationr  r   r  r   r   r   libc_verr  python_versionmachinearchitecturesslOPENSSL_VERSIONr  r  )r  r  s     r   system_identifierr    s    $::<&738K+L+L!4s7L7LRa7P!PPH			W	%$$& 
& .44!"]H8C8$G  
&	%s   &D
Dc                  n    [         R                  S:X  a!  [        [        R                  " 5       S   5      $ g)z?Get Windows version. returns () if it's not running on Windows r6  r   r   )ry   r   version_tupler   	win32_verr   r   r   get_windows_versionr    s+     
ww$X//1!455r   c                 J   [        U [        5      (       d   eU=(       d    [        R                  nU(       d  g [        R
                  S:X  a(  [        U5      (       a  [        R                  " SSU 5      n S UpCS[        USS 5      =(       d    S;   a  U=(       d
    [        5       nOD[        US5      (       a3  UR                  nU=(       d    [        USS 5      =(       d
    [        5       nUR                  U(       a  U R                  US	5      OU 5        UR                  5         g )
Nr6  z	([\r\n]+)z \1brr   r  r  rs   ignore)r   r   r   r]  ry   r   supports_terminal_sequencesr   r	  r  rj   r  r  writerg   flush)r  outrs   encr  s        r   write_stringr    s    a

C	ww$6s;;FF<+
wsFD)/R0-+-	h		O'#z48O<M<O
LLC#x(Q7IIKr   )printer
stacklevelc                B   [         R                  (       aj  U [        R                  ;   a  g [        R                  R	                  U 5        U(       a  U" U  [        5        340 UD6$ [        SU  [        5        S340 UD6$ SS KnUR                  [        U 5      US-   S9  g )NzERROR: re  r   r  )r  )
r   r   deprecation_warning_cacheaddr  r  warningswarnDeprecationWarning)ry  r  r  r   r  s        r   r  r    s    ||%,,,""&&s+cU#6#8"9:EfEEgcU+>+@*ADOOO(-*q.Ir   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )r  i  zFile locking is not supportedc                 8   > [         TU ]  U R                  5        g r   r  r  s    r   r   LockingUnsupportedError.__init__  s    "r   r   )r   r   r   r   ry  r  r   r  r  s   @r   r  r    s    
)C# #r   r  ru   c                       \ rS rSrS\R
                  R                  4S\R
                  R                  4S\R
                  R                  4S\R
                  R                  4S\R
                  R                  4/r	Sr
g)	
OVERLAPPEDi  InternalInternalHighOffset
OffsetHighhEventr   N)r   r   r   r   ctypeswintypesLPVOIDDWORDHANDLE_fields_r   r   r   r   r  r    sc    //0V__334v,,-6??001v--.
r   r  kernel32    ic                    [        5       nSUl        SUl        SUl        [        R
                  " U5      U l        [        [        R                  " U R                  5       5      U(       a  SOSU(       a  SOS-  S[        [        U R                  5      (       d6  [        S[        R                  " [        R                  " 5       5      < 35      eg )Nr   r   r   zLocking file failed: )r  r  r  r  r  pointer_lock_file_overlapped_p
LockFileExr  get_osfhandler  	whole_low
whole_highBlockingIOErrorFormatErrorGetLastError)r  	exclusiver  
overlappeds       r   
_lock_filer    s    \

 !

$*NN:$>!&..qxxz:"+33OY
A4M4MO O "$9&:L:LVM`M`Mb:c9f"ghh	Or   c                    U R                   (       d   e[        R                  " U R                  5       5      n[	        US[
        [        U R                   5      (       d"  [        S[        R                  " 5       < 35      eg )Nr   zUnlocking file failed: )
r  r  r  r  UnlockFileExr  r  r   r  r  )r  handles     r   _unlock_filer    sc    ((((%%ahhj1FAy*a>W>WXX3F4F4F4H3KLMM Yr   c                    U(       a  [         R                  O[         R                  nU(       d  U[         R                  -  n [         R                  " X5        g ! [
         a    e [         a    [         R                  " X5         g f = fr   )fcntlLOCK_EXLOCK_SHLOCK_NBflockr  r   lockf)r  r  r  r  s       r   r  r  (  s[    %.EMMEMME&&A%"  &A%&s   A *BBc                    [         R                  " [        5         [        R                  " U [        R
                  5      sS S S 5        $ ! , (       d  f       O= f[         R                  " [        5         [        R                  " U [        R
                  5      sS S S 5        $ ! , (       d  f       O= f[        R                  " U [        R
                  [        R                  -  5      $ r   )r   r   r   r  r  LOCK_UNr  r  r  s    r   r  r  3  sx    $$W-{{1emm4 .--$$W-{{1emm4 .--;;q%--%--"?@@s   %A


A5%B$$
B2c                     [         er   r  )r  r  r  s      r   r  r  <      ))r   c                     [         er   r  r  s    r   r  r  ?  r  r   c                   H    \ rS rSrSrSS jrS rS rS r\r	\r
S rS	 rS
rg)r  iC  FNc           
        ^ TS;  a  [        T5      eTUsU l        U l        [        U4S jS 5       5      n[        U4S jS 5       5      n[        R
                  " [        R                  [        [        SS5      [        [        SS5      [        [        S	S5      U(       a  [        R                  OSS
T;   a  [        R                  OSST;   a  [        R                  OSU(       d  [        R                  O&U(       a  [        R                  O[        R                  45      n[        R                   " [        R"                  " XS5      TUS9U l        g )N>   arrl   abrbwbc              3   ,   >#    U  H	  oT;   v   M     g 7fr   r   .0r  rr   s     r   	<genexpr>'locked_file.__init__.<locals>.<genexpr>K  s     1&QDy&   zwax+c              3   ,   >#    U  H	  oT;   v   M     g 7fr   r   r  s     r   r  r  L  s     /$QDy$r  zr+	O_CLOEXECr   r  O_NOINHERITr  r   rv   rs   )NotImplementedErrorrr   r  anyr   reduceoperatoriorr  ry   O_CREATO_APPENDO_EXCLO_RDONLYO_RDWRO_WRONLYfdopenr  r  )r  r  rr   r  rs   writablereadabler  s     `     r   r  locked_file.__init__F  s    88%d++ $e	4:1&11/$//  BQ'B
A&Bq)"BJJ$;BKKABII!'BKK(RYY0
  2778E:D8Tr   c                    SU R                   ;  n [        U R                  XR                  5        SU l        SU R                   ;   a   U R                  R                  5         U $ U $ ! [
         a    U R                  R                  5         e f = f! [
         a:  nUR                  [        R                  [        R                  4;  a  e  S nAU $ S nAff = f)Nr  Trl   )rr   r  r  r  lockedr   r"  truncater  ESPIPEEINVAL)r  r  r  s      r   r  locked_file.__enter__Y  s    tyy(		tvvy**5DK $))! t  	FFLLN	  77LLLL#  	
 s#   'A' 	B '&B
C/CCc                 z    U R                   (       d  g  [        U R                  5        SU l         g ! SU l         f = fNF)r  r  r  r  s    r   unlocklocked_file.unlockl  s,    {{	  DK%DKs   1 	:c                      U R                  5         U R                  R                  5         g ! U R                  R                  5         f = fr   )r  r  r"  r#  s     r   r$  locked_file.__exit__t  s+    	KKMFFLLNDFFLLNs	   - A	c                 .    [        U R                  U5      $ r   )r  r  )r  attrs     r   __getattr__locked_file.__getattr__}  s    tvvt$$r   c                 ,    [        U R                  5      $ r   )iterr  r  s    r   __iter__locked_file.__iter__  s    DFF|r   )r  r  r  rr   )TN)r   r   r   r   r  r  r  r  r$  r  r"  r   r  r   r   r   r   r  r  C  s2    FU&&  DE%r   r  c                  :    [         R                  " 5       n U b  U $ S$ )Nrm   )r   getfilesystemencodingr  s    r   get_filesystem_encodingr    s     ((*H+888r   r  z\"""z%=%z%%cd:~,%)r  re  %r8  c                   ^ [        [        U 5      5      n [        R                  S:w  a  [        R
                  " U 5      $ U(       a  [        O[        mSR                  U4S jU  5       5      $ )Nr6  rd  c              3      >#    U  Hh  n[         R                  " S U[         R                  5      (       a  UO5[         R                  " SSU5      R	                  T5      R                  S5      v   Mj     g7f)z[\w#$*\-+./:?@\\]+z
(\\+)("|$)z\1\1\2r	  N)r   rM  ASCIIr	  	translater   )r  r  transs     r   r  shell_quote.<locals>.<genexpr>  s]       A \\/BHH==VVM9a0::5AFFtL	Ms   A0A3)r  variadicry   r   shlexr   _CMD_QUOTE_TRANS_WINDOWS_QUOTE_TRANS)r   r2  r  s     @r   r?  r?    sV    D	ww$zz$ %+?E88    r   c                     [        U 0 5      u  pUR                  U5        [        R                  R	                  S[
        R                  " U5      05      nU S-   U-   $ )z0Pass additional data in a URL for internal use. __youtubedl_smuggler  )unsmuggle_urlr  r  r  	urlencoder}   dumps)r  dataidatasdatas       r   smuggle_urlr    sR     sB'JCKKLL""	

4 013E9ur   c                     SU ;  a  X4$ U R                  S5      u  p#n[        R                  R                  U5      S   S   n[        R
                  " U5      nX&4$ )Nz#__youtubedl_smuggler  r  r   )r*  r  r  parse_qsr}   loads)smug_urlr   r  r   r  jsondr  s          r   r  r    s\    X-  '',MCELL!!%()>?BE::eD9r   rp  factorc                   [        U 5      [        U5      p U b  U S:  a  gSnU S:X  a  SO1[        [        [        R
                  " X5      5      [        U5      5      nS/UQU   nUS:X  a  SSS.R                  XU S35      nXU-  -  nXU4-  $ )	z4Formats numbers with decimal sufixes like K, M, etc Nr   kMGTPEZYr     Ki)kr  i)float_or_nonefloatrR  r  mathlogr   r  )numfmtr%  POSSIBLE_SUFFIXESexponentrp   	converteds          r   format_decimal_suffixr5    s    $eFm
{cAg"1Hq#c$((3*?&@#FWBX"YH%$%h/F~$((81>)*IV$$$r   c                 *    [        U SSS9=(       d    S$ )Nz%.2f%sBr(  r$  zN/A)r5  )r  s    r   format_bytesr7    s     	$?H5Hr   c                    U(       a  [         O[         R                  SS5      nSR                  S U  5       5      nU(       a  [        R                  O[        R
                  " SU SU S3U5      nU(       d  g [        UR                  S5      R                  S	S
5      5      nXR                  S5         n[        Xg-  5      $ )Nz\.z[,.]r  c              3   N   #    U  H  n[         R                  " U5      v   M     g 7fr   r   r   )r  us     r   r  $lookup_unit_table.<locals>.<genexpr>  s     9j		!j   #%z(?P<num>z)\s*(?P<unit>z)\br0  ru  r   r=  )		NUMBER_REr  r   r   rM  r   r-  r  round)
unit_tabler  rO  num_reunits_rer  r0  mults           r   lookup_unit_tablerD    s     Yi&7&7v&FFxx9j99HRXX	-F8=
#6	;A
&&sC0
1Cggfo&Dr   c           	          [        [        S/SQ5       VVs0 s H  u  pUSU-  _M     snnU R                  5       SS9$ s  snnf )z9Parse a string indicating a byte quantity into an integerr  KMGTPEZYr(  Trf  )rD  	enumerateupper)r  r+  r;  s      r   parse_bytesrI    sH     )2*;
*; <= <D!G <=		$   =s   ?
c           
      t   U c  g 0 SS_SS_SS_SS_SS_S	S_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_0 SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_S$S!_S%S#_S&S#_S'S#_S(S!_S)S*_S+S,_S-S*_E0 S.S,_S/S,_S0S,_S1S*_S2S3_S4S5_S6S3_S7S5_S8S5_S9S5_S:S3_S;S<_S=S>_S?S<_S@S>_SAS>_SBS>_ES<SCSDSCSDSDSDSCSE.En[        X5      $ )FNBr   r  r  KiBr(  KBrp  kBKbkb	kilobytes	kibibytesMiBi   MBrV  mBMbmb	megabytes	mebibytesGiBi   @GB ʚ;gBGbgb	gigabytes	gibibytesTiBl        TBl    J)tBTbr  	terabytes	tebibytesPiBl           PBl     I5 pBPbpb	petabytes	pebibytesEiBl            EBl     NZoeBEbebexabytes	exbibytesZiBl            ZBl     @=7M.czBZbzb
zettabytesl               l      B3v^!< )	zebibytesYiBYByBYbyb
yottabytes	yobibytes)rD  )r  _UNIT_TABLEs     r   parse_filesizer    s   y<Q<Q< 	< 	t	<
 	d< 	d< 	d< 	d< 	T< 	T< 	y< 	i< 	i< 	i< 	i<  	Y!<" 	Y#<$ 	y%<& 	i'<( 	i)<* 	i+<, 	i-<. 	Y/<0 	Y1<2 	y3<4 	i5<6 	i7<8 	i9<: 	i;<< 	Y=<> 	Y?<@ 	yA<B 	iC<D 	iE<F 	iG<H 	iI<J 	YK<L 	YM<N 	yO<P 	iQ<R 	iS<T 	iU<V 	iW<X 	IY<Z 	Y[<\ 	y]<^ 	i_<` 	ia<b 	ic<d 	ie<f 	ig<h w<K| [,,r   c           	      L   U c  g [         R                  " SSU 5      R                  5       n [         R                  " SU 5      (       a  [	        U 5      $ SSSSSSSSS.n[        X5      nUb  U$ [         R                  " SU 5      nU(       a  [	        UR                  S	5      5      $ g )
Nz	^[^\d]+\sr  z	^[\d,.]+$rp  rV  r\  )r*  Kr  MkkKKr  rK  z([\d,.]+)(?:$|\s)r   )r   r	  rf  r   
str_to_intrD  r  )r  r  r}  r  s       r   parse_countr  %  s    y
|R#))+A	xxa  !} 	K K
+C

88(!,D$**Q-(( r   )lenientc                d   U c  0 $ U(       a  [         R                  " SU 5      nO[         R                  " SU 5      nU(       a5  [        UR                  S5      5      [        UR                  S5      5      S.$ [         R                  " SU 5      nU(       a  S[        UR                  S5      5      0$ [         R                  " S	U 5      nU(       a  S[        UR                  S5      5      S
-  0$ U(       a:  [         R                  " SU 5      nU(       a  S[        UR                  S5      5      0$ 0 $ )Nu!   (?P<w>\d+)\s*[xX×,]\s*(?P<h>\d+)u@   (?<![a-zA-Z0-9])(?P<w>\d+)\s*[xX×,]\s*(?P<h>\d+)(?![a-zA-Z0-9])rl   hwidthheightz*(?<![a-zA-Z0-9])(\d+)[pPiI](?![a-zA-Z0-9])r  r   z\b([48])[kK]\brj  z (?<!\d)(\d{2,5})w(?![a-zA-Z0-9])r  )r   r  r  r  )r  r  r  s      r   parse_resolutionr  B  s    y	yy=qAyy\^_`C)$**S/*
 	

 99BAFD#djjm,--99&*D#djjm,s233yy<a@SA/00Ir   c                     [        U [        5      (       d  g [        R                  " SU 5      nU(       a  [	        UR                  S5      5      $ g )Nz\b(\d+)\s*kbpsr   )r   r   r   r  r  r  )r  r  s     r   parse_bitrater  `  s>    a99&*D4::a=!! r   c                     [         R                  U[         S   5      n UR                  U 5      S-   $ ! [         a     gf = f)zDReturn the number of a month by (locale-independently) English name r?   r   N)MONTH_NAMESr  r5  r6  )r   langmonth_namess      r   month_by_namer  h  sF     //$D(9:K  &** s   3 
A A c                      [          Vs/ s H  oSS PM	     snR                  U 5      S-   $ s  snf ! [         a     gf = f)zMReturn the number of a month by (locale-independently) English
abbreviations Nr  r   )ENGLISH_MONTH_NAMESr5  r6  )abbrevr  s     r   month_by_abbreviationr  s  sG    232!"12399&AAEE3 s   2 -2 2 
??c                 2    [         R                  " SSU 5      $ )z%Replace all the '&' by '&amp;' in XMLz<&(?!amp;|lt;|gt;|apos;|quot;|#x[0-9a-fA-F]{,4};|#[0-9]{,4};)r  r   r	  )xml_strs    r   fix_xml_ampersandsr  }  s    66G r   c                 x   [        U [        5      (       d   e SS Kn UR                  R                  S5      nU R                  5       nUR                  " [        U5      5      nX4l         UR                  SUSSS5        g ! [         a     g f = f! [         a     g [         a     g f = f! [         a     g f = f)Nr   z	libc.so.6   )r   r   r  ImportErrorcdllLoadLibraryr   r  rg   create_string_bufferr   r   prctlAttributeError)r  r  libctitle_bytesbufs        r   setproctitler    s    eS!!!!{{&&{3 ,,.K

%
%c+&6
7CI

2sAq!$#  
    		  s:   B B +B, 
BB
B)	B)(B),
B98B9c                 T    U b$  U R                  U5      (       a  U [        U5      S  $ U $ r   )rz  r   )r  r  s     r   remove_startr    s)    ]q||E/B/B1SZ[>IIr   c                 d    U b,  U(       a%  U R                  U5      (       a  U S [        U5      *  $ U $ r   )r{  r   )r  rg  s     r   
remove_endr    s+    Mcajjoo1Zs3xi=L1Lr   c                 v    U b  [        U 5      S:  a  U $ S H  nU S   U:X  d  M  U S   U:X  d  M  U SS s  $    U $ )Nr   )r  r  r   rv  r   r   )r  r  s     r   remove_quotesr    sG    yCFQJQ45=QrUe^Qr7N  Hr   c                 z    [        [        R                  R                  U 5      R                  S5      =(       d    S$ )zl
This implementation is inconsistent, but is kept for compatibility.
Use this only for "webpage_url_domain"
zwww.N)r  r  r  urlparser  r  s    r   
get_domainr    s+    
 --c2996BJdJr   c                     [         R                  R                  U 5      R                  nUR	                  S5      R                  S5      S   $ )Nr   rv  )r  r  r  rz   rf  r   )r  rz   s     r   url_basenamer    s:    <<  %**D::c?  %b))r   c                 L    [         R                  " SU 5      R                  5       $ )Nzhttps?://[^?#]+/)r   r   r  r  s    r   base_urlr    s    88'-3355r   c                    [        U[        5      (       a  UR                  5       n[        U[        5      (       a  U(       d  g [        R
                  " SU5      (       a  U$ [        U [        5      (       a  U R                  5       n [        U [        5      (       a  [        R
                  " SU 5      (       d  g [        R                  R                  X5      $ )Nz(?:[a-zA-Z][a-zA-Z0-9+-.]*:)?//z^(?:https?:)?//)	r   r  r  r   r   r   r  r  urljoin)r  rz   s     r   r  r    s    ${{}dC  	xx2D99${{}dC  )& )&<<++r   c                     U(       a  U b  [        XS 5      n US:X  a  US:  a  [        SU-  5      nSn Uc  [        U 5      O[        XS9U-  U-  $ ! [        [        [        4 a    Us $ f = f)Nr   )r  )r  r  r6  r  OverflowError)vscaler   get_attrinvscaler  s         r   int_or_noner    ss    AMA&1}q5y>,AC,=IURR	=1 s   A A+*A+c                 "    U c  U$ [        U 5      $ r   r   r  r   s     r   str_or_noner    s    i7+SV+r   c                     [        U [        5      (       a  U $ [        U [        5      (       a#  [        R                  " SSU 5      n [        U 5      $ g)z&A more relaxed version of int_or_none z[,\.\+]r  N)r   r  r   r   r	  r  )int_strs    r   r  r    sC    '3	GS	!	!&&R17## 
"r   c                     U c  U$ US:X  a  US:  a  [        SU-  5      nSn [        U 5      U-  U-  $ ! [        [        4 a    Us $ f = frZ  )r  r-  r6  r  )r  r  r  r   s       r   r,  r,    s]    y1}q5y>Qx("U**	" s   4 A	A	c                 4    [        U [        5      (       a  U $ U$ r   r   boolr  s     r   bool_or_noner    s    1d##100r   c                 P    [        U [        5      (       a  U R                  5       $ U$ r   )r   r   rf  r  s     r   strip_or_noner    s    "1c**177977r   c                     U (       a  [        U [        5      (       d  g U R                  5       n [        R                  " SU 5      (       a  U $ S $ )Nz@(?:(?:https?|rt(?:m(?:pt?[es]?|fp)|sp[su]?)|mms|ftps?|wss?):)?//)r   r   rf  r   r   r  s    r   url_or_noner    s=    jc**
))+C((^`cdd3njnnr   c                    S n [        U [        [        45      (       a  [        U 5      nO5[        U [        5      (       a   [
        R                  R                  U S5      n[        R                  " SS[        UR                  5       5       3U5      nUR                  U5      $ ! [        [        [        [        [         4 a    Us $ f = f)Nrb   z(?<!%)(%%)*%s\g<1>)r   r  r-  r   r   r  r  r  r   r	  r  r  r6  r  r  r  r   )r  r  r   datetime_objects       r   strftime_or_noner  	  s    O	i#u..<YGO	3'' kk229hGOffs?+D+D+F'G&HI;X''44	>='J s   BB# #!CCc           	          [        U [        5      (       d  g U R                  5       n U (       d  g S /S-  u  pp4n[        R                  " SU 5      nU(       a  UR                  SSSSS5      u  pp4nOe[        R                  " SU 5      nU(       a  UR                  5       u  pp4nO2[        R                  " S	U 5      nU(       a  UR                  5       u  p#Og U(       a  UR                  S
S5      n[        S US4US4US4US4US44 5       5      $ )N   z(?x)
            (?P<before_secs>
                (?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)?
            (?P<secs>(?(before_secs)[0-9]{1,2}|[0-9]+))
            (?P<ms>[.:][0-9]+)?Z?$
        r<  rk  rv  ru  msa  (?ix)(?:P?
                (?:
                    [0-9]+\s*y(?:ears?)?,?\s*
                )?
                (?:
                    [0-9]+\s*m(?:onths?)?,?\s*
                )?
                (?:
                    [0-9]+\s*w(?:eeks?)?,?\s*
                )?
                (?:
                    (?P<days>[0-9]+)\s*d(?:ays?)?,?\s*
                )?
                T)?
                (?:
                    (?P<hours>[0-9]+)\s*h(?:(?:ou)?rs?)?,?\s*
                )?
                (?:
                    (?P<mins>[0-9]+)\s*m(?:in(?:ute)?s?)?,?\s*
                )?
                (?:
                    (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*s(?:ec(?:ond)?s?)?\s*
                )?Z?$zW(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)Z?$r   r   c              3   T   #    U  H  u  p[        U=(       d    S 5      U-  v   M      g7fr   N)r-  )r  r  rC  s      r   r  !parse_duration.<locals>.<genexpr>K  s+      G :F:4uTYQ$& :Fs   &(rW  r$  rq  r   )	r   r   rf  r   r   r  ra  r  sum)r  r<  rk  rv  ru  r  r  s          r   parse_durationr    s   a		A#'&1*DR
 
 	A 	&'ggfgvvt&T#THH, /0 *+((*'DRsuvwAhhjt	ZZS! G	ut}tRj4)b!W:F G G Gr   c                     [         R                  R                  U5      u  pEU(       a	  USS  U:X  a-  UnU (       a$  U(       a  [        R	                  USS9  U SU U 3$ U S[        R	                  U5       3$ )Nr   Tprependr   )ry   rz   splitext_UnsafeExtensionErrorsanitize_extension)r  r  extr4  r   real_exts         r   _change_extensionr  O  sy    WW%%h/ND0A Ax!44S$4GZqhZ00Zq.AA#FGHHr   c                      [         R                  U /UQ[        R                  [        R                  S9  U $ ! [         a     gf = f)zChecks if the given binary is installed somewhere in PATH, and returns its name.
args can be a list of arguments for a short output (like -version) )r  r]  F)r#  r^  ra  PIPEr   )exer   s     r   check_executabler  _  sB    		3,,zz	O J  s   48 
AAc                      [         R                  [        U 5      /UQS[        R                  [        R                  [        R
                  S9u  p#nU(       a  g  U$ ! [         a     gf = f)NT)r   stdinr  r]  F)r#  r^  ri  ra  r  STDOUTr   )r  r   r  r   r}  s        r   _get_exe_version_outputr  i  sn    	 N3$7#?$#?d)3YcYjYj # l3  M  s   AA 
A*)A*c                     [        U [        5      (       d   eUc  Sn[        R                  " X5      nU(       a  UR	                  S5      $ U$ )Nzversion\s+([-0-9._a-zA-Z]+)r   )r   r   r   r  r  )output
version_reunrecognizedr  s       r   detect_exe_versionr  w  sE    fc""""3

		*%Awwqzr   	--version)presentbrokenc                     [        U5      n[        U5      S;   d   e[        X5      nUc  US   $ U=(       a    [        XBUS   5      $ )z[Returns the version of the specified executable,
or False if the executable is not present )r   r   rv  r   )r  r   r  r  )r  r   r  r  r  s        r   get_exe_versionr    sR     L)L|&&&
!#
,C
{BG%c|AGGr   c              #   |   #    Uc  SU pU(       a
  SS/US:     OSnX0-  X1-  :  a  U v   X-  n X0-  X1-  :  a  M  gg7f)zFloat rangeNr   rv  r   r   )r  stopstepr  s       r   franger    sM     |t $B74!8!D
,
$ ,
$s   6<<c                       \ rS rSrSr " S S\5      rSSS.S jrS	 rS
 rS r	\
S 5       rS rS rS rS rS rS rS rSrg)LazyListi  z^Lazy immutable list from an iterable
Note that slices of a LazyList are lists and not LazyListc                       \ rS rSrSrg)LazyList.IndexErrori  r   Nr   r   r   r   
IndexErrorr    r  r   r  FNreverser  c                H    [        U5      U l        Uc  / OUU l        X l        g r   )r  	_iterabler  	_reversed)r  r  r  r  s       r   r  LazyList.__init__  s    h"Nb r   c              #      #    U R                   (       a  U R                  5        S h  vN   g U R                   S h  vN   U R                   H"  nU R                  R	                  U5        Uv   M$     g  NL N97fr   )r	  exhaustr  r  r   )r  items     r   r  LazyList.__iter__  sX     >>||~%%;;NNDKKt$J # &s   %A8A4A8A68A86A8c                 r    U R                   R                  U R                  5        / U l        U R                   $ r   )r  extendr  r  s    r   _exhaustLazyList._exhaust  s)    4>>*{{r   c                 Z    U R                  5       SSU R                  (       a  S2   $ S2   $ )zEvaluate the entire iterableNrv  r   )r  r	  r  s    r   r  LazyList.exhaust  s*    }}<t~~<==1<==r   c                     U c  S $ U ) $ r   r   r   s    r   _reverse_indexLazyList._reverse_index  s    yt(qb(r   c                    [        U[        5      (       a  U R                  (       aS  [        U R                  UR                  5      U R                  UR
                  5      UR                  =(       d    S* 5      nUR                  UR
                  UR                  =(       d    SpCnOG[        U[        5      (       a'  U R                  (       a  U R                  U5      nXSpCnO[        S5      eU=(       d    SS:  d!  U=(       d    SS:  d  Uc  US:  d	  Uc&  US:  a   U R                  5          U R                  U   $ [        U=(       d    SU=(       d    S5      [        U R                  5      -
  S-   nUS:  a:  U R                  R                  [        R                   " U R"                  U5      5         U R                  U   $ ! [         a  nU R                  U5      UeS nAff = f! [         a  nU R                  U5      UeS nAff = f)Nr   r   z"indices must be integers or slices)r   slicer	  r  r  r  r  r  r  r  r  r  rh  r   r  	itertoolsislicer  )r  idxr  r  r  r  r   s          r   __getitem__LazyList.__getitem__  s   c5!!~~D//		:D<O<OPSPXPX<Y]`]e]e]jij[kl #		388SXX]ES!!~~))#. #!E@AAZa1aMdQhLTAX MMO0{{3'' 
DIA&T[[)99A=q5KKy//BC	,;;s##  0ooa(a/0  	,//!$!+	,s0   /G 6G) 
G&G!!G&)
H
3HH
c                 j     U R                   (       a  U S     gU S     g! U R                   a     gf = f)Nrv  r   FT)r	  r  r  s    r   __bool__LazyList.__bool__  s?    	DH  -1G   		s     22c                 L    U R                  5         [        U R                  5      $ r   )r  r   r  r  s    r   __len__LazyList.__len__  s    4;;r   c                 j    [        U 5      " U R                  U R                  (       + U R                  S9$ Nr  r  r  r	  r  r  s    r   __reversed__LazyList.__reversed__  s$    Dz$..dnn2DT[[YYr   c                 `    [        U 5      " U R                  U R                  U R                  S9$ r&  r'  r  s    r   __copy__LazyList.__copy__  s!    Dz$..$..UUr   c                 4    [        U R                  5       5      $ r   reprr  r  s    r   rv  LazyList.__repr__  s    DLLN##r   c                 4    [        U R                  5       5      $ r   r.  r  s    r   ry  LazyList.__str__  s    DLLN##r   )r  r  r	  )r   r   r   r   r1  r  r  r  r  r  r  r  r  r   r#  r(  r+  rv  ry  r   r   r   r   r  r    sh    AZ  -2$ !

> ) ),: ZV$$r   r  c                   \    \ rS rSr " S S\5      rS rSS jrS rSS jrS	 r	S
 r
S rSrg)	PagedListi  c                       \ rS rSrSrg)PagedList.IndexErrori  r   Nr   r   r   r   r  r6    r  r   r  c                 4    [        U R                  5       5      $ r   )r   getslicer  s    r   r#  PagedList.__len__  s    4==?##r   c                 V    Xl         X l        [        S5      U l        X0l        0 U l        g )Ninf)	_pagefunc	_pagesizer-  
_pagecount
_use_cacher  )r  pagefuncpagesize	use_caches       r   r  PagedList.__init__  s#    !!,#r   c                     U R                   R                  U5      nUc+  XR                  :  a  / O[        U R	                  U5      5      nU R
                  (       a  X R                   U'   U$ r   )r  r  r>  r  r<  r?  )r  pagenumpage_resultss      r   getpagePagedList.getpage	  sR    {{w/!(??!:2T^^T[E\@]L??#/KK r   Nc                 6    [        U R                  X5      5      $ r   )r  	_getsliceri  s      r   r8  PagedList.getslice		  s    DNN5.//r   c                     [        S5      e)Nz-This method must be implemented by subclasses)r  ri  s      r   rJ  PagedList._getslice	  s    !"QRRr   c                     U R                   (       d   S5       e[        U[        5      (       a  US:  a  [        S5      eU R	                  XS-   5      nU(       d  U R
                  eUS   $ )Nz!Indexing PagedList requires cacher   z%indices must be non-negative integersr   )r?  r   r  r  r8  r  )r  r  entriess      r   r  PagedList.__getitem__	  s\    C CC#s##sQwCDD--1W-//!qzr   c                 8    [        U R                  SS5      5      $ Nr   r   )r  r8  r  s    r   r   PagedList.__bool__	  s    DMM!Q'((r   )r  r>  r<  r=  r?  Tr  )r   r   r   r   r  r#  r  rG  r8  rJ  r  r   r   r   r   r   r4  r4    s2    Z $0S)r   r4  c                       \ rS rSrSrS rSrg)OnDemandPagedListi	  z:Download pages until a page with less than maximum resultsc              #      #    [         R                  " XR                  -  5       H  nX0R                  -  nX0R                  -  U R                  -   nX:  a  M3  XAs=::  a  U:  a  O  OXR                  -  OSnUb$  XBs=::  a  U::  a  O  OUS-
  U R                  -  S-   OS n U R                  U5      nUS:w  d  Ub  XU nU S h  vN   [        U5      U-   U R                  :  a    g X%:X  d  M    g    g ! [         a    US-
  U l        e f = f NG7frR  )r  countr=  rG  rh   r>  r   )	r  r  rg  rE  firstidnextfirstidstartvendvrF  s	            r   rJ  OnDemandPagedList._getslice	  s     u'>?G.G!NN2T^^CK# 1k1 &  O(E+(E 'T^^+q0 
#||G4 {d.+48### < 6)DNN: !E @"  ")A+
 $s0   BD!C32DD%D.D3D		Dr>  N)r   r   r   r   r1  rJ  r   r   r   r   rV  rV  	  s
    D#r   rV  c                   $    \ rS rSrSrS rS rSrg)InAdvancePagedListiE	  z5PagedList with total number of pages known in advancec                 >    [         R                  XUS5        X l        g NT)r4  r  r>  )r  r@  	pagecountrA  s       r   r  InAdvancePagedList.__init__H	  s    48T:#r   c              #     #    XR                   -  nUc  U R                  O$[        U R                  X R                   -  S-   5      nXU R                   -  -
  nUc  S OX!-
  n[        X45       H[  nU R	                  U5      nU(       a  XS  nS nUb-  [        U5      U:  a  U[        U5      -  nOUS U  S h  vN     g U S h  vN   M]     g  N N7frZ  )r=  r>  rR  r  rG  r   )	r  r  rg  
start_pageend_page
skip_elems	only_morerE  rF  s	            r   rJ  InAdvancePagedList._getsliceL	  s     nn,
&)k4??s4??CSaSaLadeLe7f$..88
KDS[	Z2G<<0L+K8!
$|$y0\!22I+JY777### 3 8#s$   B2C4C
5C C
CCr^  N)r   r   r   r   r1  r  rJ  r   r   r   r   r`  r`  E	  s    ?$$r   r`  c                       \ rS rSr\" 5       rSrS r\R                  " S5      r
\S 5       rS rS r\R                   S 5       rS	 rS
 r " S S\5      rSrg)PlaylistEntriesi_	  Fc                    Xl         UR                  S5      nUc  [        S5      e[        U[        5      (       a  SU l        UR                  S5      nUS LU l        U R                  (       aa  U R
                  (       d   eU R                  /[        U=(       d    S/5      -  U l	        [        XC5       H  u  pVX`R                  US-
  '   M     g [        U[        [        [        45      (       a  X0l	        g [        U5      U l	        g )NrO  zThere are no entriesTrequested_entriesr   r   )ydlr  r  r   r  is_exhaustedis_incompleteMissingEntryrh  _entrieszipr4  r  )r  ro  	info_dictrO  rn  r+  entrys          r   r  PlaylistEntries.__init__c	  s     --	*?$%;<<&& $D%MM*=>.d:$$$$!../#6G6NA32OODM 1;',a!e$ <$	8!<==#M$W-DMr   z(?x)
        (?P<start>[+-]?\d+)?
        (?P<range>[:-]
            (?P<end>[+-]?\d+|inf(?:inite)?)?
            (?::(?P<step>[+-]?\d+))?
        )?c              #     #    UR                  S5       H  nU(       d  [        S5      eU R                  R                  U5      nU(       d  [        U< S35      eUR	                  SSSS5      u  pEpg[        U5      S:X  a  [        S	U< S
35      eU(       a(  [        [        U5      [        U5      [        U5      5      O
[        U5      v   M     g 7f)Nru  z'There is two or more consecutive commasz is not a valid specificationr  rg  r  r  r   zStep in z cannot be zero)	r   r6  PLAYLIST_ITEMS_RErM  r  r  r  r,  r  )r[  stringsegmentr  r  rg  r  	has_ranges           r   parse_playlist_items$PlaylistEntries.parse_playlist_items	  s     ||C(G !JKK((227;D G;.K!LMM*.**WeVW*U'E4 A% 8G;o!FGGV_%E*M#,>D@QRehineoo )s   CCc              #     #    U R                   R                  R                  S5      nU R                   R                  R                  SS5      nU R                   R                  R                  S5      nUS;   a  SnU(       d  U SU 3nO'US:w  d  U(       a  U R                   R                  SS	S
9  U R	                  U5       Hf  nX    H[  u  pVXV4v   U(       d  M   U R                   R                  R                  S5      (       d  U R                   R                  US	S	S9  M[  M]     Mh     g ! [        [        4 a         g f = f7f)Nplaylist_itemsplayliststartr   playlistend)rv  Nr  r   zFIgnoring playliststart and playlistend because playlistitems was givenT)	only_oncelazy_playlist)
incompletesilent)ro  paramsr  report_warningr}  _match_entryr  r  )r  r  playlist_startplaylist_endr5  r+  rv  s          r   get_requested_items#PlaylistEntries.get_requested_items	  s    ,,-=>,,_a@xx**=9:%L ./q?Nq LHH##$lx|#}..~>E Kh88??..??--eT-R @ ( ? -.BC s+   CEAD-"E-E=EEEc                     U R                   (       a  U R                  (       d  [        U 5      $ [        U R                  [
        5      (       a1  U R                  R                  S:X  a  U R                  R                  $ g g rZ  )rp  rq  r   r   rs  r`  r=  r>  r  s    r   get_full_countPlaylistEntries.get_full_count	  s[    T%7%7t9'9::}}&&!+}}/// , ;r   c                 b   ^  [        T R                  [        5      (       a  U 4S jnU$ U 4S jnU$ )Nc                    >  TR                   U    nUTR                  L a  [	        SU S-    S35      eU$ ! [         a,    TR                  nTR                  (       d  TR                  e NXf = f)NzEntry r   z cannot be found)rs  r  rr  rq  r  )r+  rv  r  s     r   	get_entry*PlaylistEntries._getter.<locals>.get_entry	  sx    . MM!,E
 D---,va!eW<L-MNN " . --E--"oo- ..s   5 3A+*A+c                    >  [        TR                  5      R                  U4S j5      " TR                  U 5      $ ! [        R                  [
        R                  4 a    TR                  ef = f)Nc                 "   > TR                   U   $ r   )rs  )r   r+  r  s     r   r  <PlaylistEntries._getter.<locals>.get_entry.<locals>.<lambda>	  s    UYUbUbcdUer   )r  ro  _handle_extraction_exceptionsr  r  r4  )r+  r  s    r   r  r  	  s[    *>GGHefgkgogoqrss ++Y-A-AB *//)*s	   8< 1A-)r   rs  r  )r  r  s   ` r   _getterPlaylistEntries._getter	  s.    dmmT**	  *
 r   c              #     #    [        U[        5      (       a  [        X5      nUR                  c  SOUR                  nUR                  c  US:  a  SO[        U 5      S-
  nO7UR                  S:  a  UR                  S-
  O[        U 5      UR                  -   nUR                  c  US:  a  SO
[        S5      nO7UR                  S:  a  UR                  S-
  O[        U 5      UR                  -   nUSS/US:     -  n[        X4U5       H&  nUS:  a  M   U R                  U5      nUS-   U4v   M(     g ! U R                   a    SU l        US:  a     g  MN  f = f7f)Nr   r   r;  rv  T)r   r  r  r  r  r   r  r-  r  r  r  rp  )r  r  r  r  r  r+  rv  s          r   r  PlaylistEntries.__getitem__	  s6    c3/C HH$q#((99As4y1}E%(YY!^CIIMTSYY9NE 88q1eElD#&88q=388a<c$i#((6JDQq!!T*A1uQ a%, +
 ?? $(!!8	s*   DED5'E5EEEEc                 0    [        [        U S S  5      5      $ r   )r   tupler  s    r   r#  PlaylistEntries.__len__	  s    5a>""r   c                       \ rS rSrSrg)PlaylistEntries.IndexErrori	  r   Nr   r   r   r   r  r  	  r  r   r  )rs  rp  rq  ro  N)r   r   r   r   objectrr  rp  r  r   compilery  re  r}  r  r  r   cached_propertyr  r  r#  r  r   r   r   r   rl  rl  _	  sy    8LL., 

 $  
p 
p20  (<#Z r   rl  c                 h   ^ [         R                  " S5      m[        R                  " SU4S jU 5      $ )Nunicode_escapez\\U[0-9a-fA-F]{8}c                 8   > T" U R                  S5      5      S   $ r   r  r  r  s    r   r  "uppercase_escape.<locals>.<lambda>	      .,Q/r   codecs
getdecoderr   r	  r  r  s    @r   uppercase_escaper  	  .    &&'78N66/	 r   c                 h   ^ [         R                  " S5      m[        R                  " SU4S jU 5      $ )Nr  z\\u[0-9a-fA-F]{4}c                 8   > T" U R                  S5      5      S   $ r   r  r  s    r   r  "lowercase_escape.<locals>.<lambda>	  r  r   r  r  s    @r   lowercase_escaper  	  r  r   c                     [         R                  R                  " [         R                  R                  U 5      R                  40 UD6$ r   )r  r  r   r  query)r  r   s     r   r   r   	  s1    <<  !6!6s!;!A!ALVLLr   c                     S n[         R                  " U 5       n[        X5       Vs/ s H  o3(       d  M  UPM     snsS S S 5        $ s  snf ! , (       d  f       g = f)Nc                 \   [        U [        5      (       d  U R                  SS5      n SnU H)  nU R                  U5      (       d  M  U [	        U5      S  n M+     U R                  5       n U (       a  U R                  S5      (       a  g[        R                  " SU SS9S	   R                  5       $ )
Nrm   r  )u   ï»¿u   ﻿)r  r  r   Fz\s#r   )maxsplitr   )	r   r   r  rz  r   r  r   r   r  )r  BOM_UTF8boms      r   r  read_batch_urls.<locals>.fixup	  s    #s##**Wi0C-C~~c""#c()n  jjlcnn_55 xxa03::<<r   )r   closingr  )batch_fdr  fdr  s       r   read_batch_urlsr  	  sE    = 
		H	%"5~5~~5 
&	%5 
&	%s    A
AAAA
Ac                  `    [         R                  R                  " U 0 UD6R                  S5      $ rg  )r  r  r  rg   )r   r   s     r   urlencode_postdatar  
  s'    <<!!415188AAr   query_updatec                   [        U [        5      (       a/  U(       d	  U(       d  U $ [        R                  R	                  U 5      n U(       a[  SU;  d   S5       e[        R                  R                  0 [        R                  R                  U R                  5      EUES5      US'   [        R                  R                  U R                  " S0 UD65      $ )zReplace URL components specified by kwargs
@param url           str or parse url tuple
@param query_update  update query
@returns             str
r  z;query_update and query cannot be specified at the same timeTr   )
r   r   r  r  r  r  r   r  
urlunparser  )r  r  r   s      r   
update_urlr  
  s     #slJ,,'',Cf$c&cc$ ,,00 2
ll##CII.2
2
 w <<""3<<#9&#9::r   c                     [        XS9$ )Nr  )r  )r  r  s     r   update_url_queryr  '
  s    c..r   c                    SU 3nSnU R                  5        H  u  pEUSUR                  S5      -   S-   -  n[        U[        5      (       a  UR                  5       n[        U[        5      (       a  UR                  5       nSU-   S-   U-   S-   nUR                  S5      U;   a  [	        S5      eX6-  nM     USUR                  S5      -   S	-   -  nX24$ )
Nzmultipart/form-data; boundary=r   s   --rh  s   
s&   Content-Disposition: form-data; name="s   "

zBoundary overlaps with datas   --
)rS  rg   r   r   r6  )r  boundarycontent_typer  r*  r  r   s          r   _multipart_encode_implr  ,
  s    3H:>L
C

uxw//'99a
Aa
A <a?,NQRRU\\??7#w.:;;  58??7++i77Cr   c                     USLn Uc#  S[        [        R                  " SS5      5      -   n [        X5      u  p4 X44$ ! [         a    U(       a  e Sn Of = fMT  )a.  
Encode a dict to RFC 7578-compliant form-data

data:
    A dict where keys and values can be either Unicode or bytes-like
    objects.
boundary:
    If specified a Unicode object, it's used as the boundary. Otherwise
    a random boundary is generated.

Reference: https://tools.ietf.org/html/rfc7578
Nz---------------ir  )r   random	randranger  r6  )r  r  has_specified_boundaryr  r  s        r   multipart_encoder  B
  su     &T1
(3v/?/?
J/W+XXH	 6t FC   	%H	 s   > AAc                     U[         L a%  [        [        [        R                  R
                  4n[        X5      =(       a    [        X5      (       + $ r   )r   r   r  r  abcMappingr   )r   allowed_typesblocked_typess      r   is_iterable_liker  `
  s8    
"e[__%<%<=a'L
10L,LLr   c                     [        U[        [        45      (       d  [        S5        [        U5      n[	        XS9(       a  U $ U 4$ )Nz)allowed_types should be a tuple or a type)r  )r   r  r  r  r  )r   r  s     r   r  r  f
  s:    meT]33GHm, @1KqeKr   )expected_typer   r   c           	          U H#  n U" U0 UD6nU b  [        XP5      (       a  Us  $ M%     g ! [        [        [        [        [
        [        4 a     MO  f = fr   )r   r  KeyErrorr  r  r6  ZeroDivisionError)r  r   r   funcsr  r   s         r   try_callr  m
  s_    	T$V$C $
3(F(F
 )G  )ZM^_ 		s   +$AAc                 .    [        [        U5      U 4US.6$ )N)r   r  )r  r  )srcgetterr  s      r   try_getr  x
  s    Xf%SF-PPr   c                 
    US L$ r   r   )r   r  s     r   r  r  |
  s    q}r   c                 v    U R                  5        VVs0 s H  u  p#U" X#5      (       d  M  X#_M     snn$ s  snnf r   )rS  )dctcndnr*  r  s       r   filter_dictr  |
  s,     YY[7[TQDJDAD[777s   55c                      0 nU  HI  nUR                  5        H2  u  p4Ub  X1;  d!  [        U[        5      (       d  M$  X   S:X  d  M.  XAU'   M4     MK     U$ Nr  )rS  r   r   )dictsmergeda_dictr*  r  s        r   merge_dictsr  
  sO    FLLNDA1?"1c**vyBq	 # 
 Mr   rO  c                 H    [        U [        5      (       a  U $ [        XU5      $ r   )r   r   )rz  rs   r4  s      r   encode_compat_strr  
  s     ,,6O#f2OOr   r     r     )GPGzPG-13RNCrB        )zTV-YzTV-Y7zTV-GzTV-PGzTV-14zTV-MAc                    [        U 5      [        L a  SU s=::  a  S::  a  U $   S $ [        U [        5      (       d  g [        R
                  " SU 5      nU(       a  [        UR                  S5      5      $ U R                  5       n U [        ;   a	  [        U    $ [        R
                  " SR                  SR                  S [         5       5      5      U 5      nU(       a  [        SUR                  S	5      -      $ g )
Nr      z^(?P<age>\d{1,2})\+?$agez^TV[_-]?({})$r  c              3   *   #    U  H	  oS S v   M     g7f)r  Nr   )r  r*  s     r   r  "parse_age_limit.<locals>.<genexpr>
  s     1XAWAAB%AW   zTV-r   )r  r  r   r   r   r   r  rH  
US_RATINGSr  r   TV_PARENTAL_GUIDELINES)r  r  s     r   parse_age_limitr  
  s    Aw#~LbLq*Ld*3
)1-A1775>""		AJ!}
!((1XAW1X)XY[\]A%eaggaj&899r   c                 2    [         R                  " SSU 5      $ )Nz(?sx)^
            (?:window\.)?(?P<func_name>[a-zA-Z0-9_.$]*)
            (?:\s*&&\s*(?P=func_name))?
            \s*\(\s*(?P<callback_data>.*)\);?
            \s*?(?://[^\n]*)*$z\g<callback_data>r  )r  s    r   strip_jsonpr  
  s    66	"
 	d$ $r   rf  c                ,  ^^^^	^
^ Sm	SR                  S T	 5       5      nSnSU S3nSU S3S	4S
U S3S44mS m
UU4S jmUU	U
UUU4S jnU4S jn[        R                  " SSU 5      n [        R                  " SXp5      n T(       de  [        R                  " SU S3SU 5      n [        R                  " SS U 5      n [        R                  " SSU 5      n [        R                  " SSU 5      n [        R                  " SU SU SU SU SU S 3X`5      $ )!Nz'"`r  c              3   4   #    U  H  o S U SU 3v   M     g7f)z(?:\\.|[^\\z])*Nr   )r  qs     r   r  js_to_json.<locals>.<genexpr>
  s     LmC{1#S4ms   z/\*(?:(?!\*/).)*?\*/|//[^\n]*\nz\s*(?:z)?\s*z(?s)^(0[xX][0-9a-fA-F]+)z:?$r  z(?s)^(0+[0-7]+)   c                     SnU R                  S5      =(       d    U R                  S5      nX!;   a  SU 3$ US:X  a  S$ US:X  a  S$ U$ )	Nz"\bfnrtur   r   r  r   z\u00re  r  r  )r   JSON_PASSTHROUGH_ESCAPESr   s      r   process_escape"js_to_json.<locals>.process_escape
  s[    #. Q15;;q>!'!C1VH 	 &#W	!T>R	 	r   c                    > [        U R                  S5      TTS9nUS   S:X  aD  [        R                  " [        R
                  5         [        R                  " U5      sS S S 5        $ U$ ! , (       d  f       U$ = f)Nr   rf  r   r  )
js_to_jsonr  r   r   r}   r  r!  )r   	evaluatedrO  varss     r   template_substitute'js_to_json.<locals>.template_substitute
  sb    u{{1~tFC	Q<3$$T%9%9:zz), ;: ;:s   	A++
A:c                   > U R                  S5      nUS;   a  U$ US;   a  gUR                  S5      (       d  US:X  a  gUS   T;   aG  US   S:X  a  [        R                  " S	TUS
S 5      OUS
S n[        R                  " ST	U5      nSU S3$ T Hh  u  p4[        R                  " X15      nU(       d  M$  [        UR                  S
5      U5      nUR                  S5      (       a  SU S3s  $ [        U5      s  $    UT;   a&   T
(       d  [        R                  " TU   5        TU   $ T
(       d  SU S3$ [        SU 35      e! [        R                   a    [        R                  " TU   5      s $ f = f)Nr   )truefalsenull)	undefinedzvoid 0r  )z/*r  r  ru  r  `z(?s)\${([^}]+)}r   rv  z(?s)(")|\\(.)r  r   z":zUnknown value: )r  rz  r   r	  r   r  r{  r   r}   r!  r  r  r6  )r  r  escapedregexr  imr+  INTEGER_TABLESTRING_QUOTESr  rO  r  r  s          r   fix_kvjs_to_json.<locals>.fix_kv
  so   GGAJ))H))\\+,,SQ4= LMaDTWK)+>!BH]^_`ac]dAff-~qAGwiq>!(KE%#BrT*$%JJsOO1#Ry?Q?	 ) 9JJtAw' Awqc8O?1#.// '' +zz$q'**+s    E -E43E4c                    > [         R                  " [        [         R                  " [	        U R                  S5      =(       d    STS95      5      5      $ )Nr   z[])r  )r}   r  rM  r!  r  r  )r  r  s    r   
create_mapjs_to_json.<locals>.create_map
  s5    zz$tzz*TZZ]5JdQU*VWXYYr   z(?:new\s+)?Array\((.*?)\)z[\g<1>]znew Map\((\[.*?\])?\)znew Date\((z)\)r  znew \w+\((.*?)\)c                 L    [         R                  " U R                  S5      5      $ r   )r}   r  r  r  s    r   r  js_to_json.<locals>.<lambda>  s    TZZ
5Kr   zparseInt\([^\d]+(\d+)[^\d]+\)r  zB\(function\([^)]*\)\s*\{[^}]*\}\s*\)\s*\(\s*(["\'][^)]*["\'])\s*\)z(?sx)
        z
|
        z|,(?=zw[\]}])|
        void\s0|(?:(?<![0-9])[eE]|[a-df-zA-DF-Z_$])[.a-zA-Z_$0-9]*|
        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:z:)?|
        [0-9]+(?=z:)|
        !+
        )r   r   r	  )r  r  rO  	STRING_RE
COMMENT_RESKIP_REr  r"  r  r  r  r  s    ``     @@@@r   r  r  
  sA   MLmLLI3J
|5)G$WIS	126G9C	(!,M
 0  0DZ 66.
DAD66*J=DvvYKs3XtDvv)+KTRvv6tDvv[]bdhi66 		 		E' #,,39 5 	  r   c                    ^  U 4S jnU$ )z=Get a numeric quality value out of a list of possible values c                 H   >  TR                  U 5      $ ! [         a     gf = f)Nrv  r4  )qidquality_idss    r   r  qualities.<locals>.q  s+    	$$S)) 		s    
!!r   )r,  r  s   ` r   	qualitiesr.    s    
 Hr   )pre_processafter_filtervideo	before_dlpost_process
after_moveafter_videoplaylistz%(title)s [%(id)s].%(ext)szC%(title)s - %(section_number)03d %(section_title)s [%(id)s].%(ext)s)r   chapterdescriptionzannotations.xmlz	info.json)r7  subtitle	thumbnailr8  
annotationinfojsonlinkpl_videopl_thumbnailpl_descriptionpl_infojsona  (?x)
    (?<!%)(?P<prefix>(?:%%)*)
    %
    (?P<has_key>\((?P<key>{0})\))?
    (?P<format>
        (?P<conversion>[#0\-+ ]+)?
        (?P<min_width>\d+)?
        (?P<precision>\.\d+)?
        (?P<len_mod>[hlL])?  # unused in python
        {1}  # conversion type
    )
diouxXeEfFgGcrsac                 X    U c  gSn[        U 5      U:  a  U SU[        U5      -
   U-   $ U $ )z$Add ellipses to overly long strings N...r  )r  lengthELLIPSESs      r   limit_lengthrG  B  s;    yH
1v(&3x=()H44Hr   c                 P    [        S [        R                  " SU 5       5       5      $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr   r  )r  r  s     r   r   version_tuple.<locals>.<genexpr>M  s     6!5AQ!5s   z[-.])r  r   r   r  s    r   r  r  L  s    6'1!5666r   c                 |    U (       d  U(       + $  [        U 5      [        U5      :  $ ! [         a
    U(       + s $ f = fr   )r  r6  )versionlimit
assume_news      r   is_outdated_versionrQ  P  s>    ~W%e(<<< ~s   ' ;;c                  &    SSK Jn   U " 5       (       + $ )z)Returns if yt-dlp can be updated with -U r   is_non_updateable)r  rT  rS  s    r   ytdl_is_updateablerU  Y  s     + """r   c                     [        U 5      $ r   )r?  )r   s    r   args_to_strrW  a  s    tr   c                 6    [        U 5      R                   SU  3$ r  )r  r   )r|  s    r   error_to_strrY  f  s    3i  !C5))r   c                    [        U [        5      (       d  U[        La  U$ g 0 SS_SS_SS_SS_SS_S	S
_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_0 SS_SS _S!S"_S#S"_S$S_S%S&_S'S_S(S)_S*S+_S,S_S-S._S/S0_S1S2_S3S3_S4S5_S6S6_S7S7_E0 S8S7_S9S2_S:S3_S;S)_S<S=_S>S7_S?S?_S@S@_SASA_SBSC_SDSD_SESF_SGSH_SISJ_SKSK_SLSM_SNSO_ES@SPSQSRSSSTSUSVSWSXSY.
EnU R                  SZ5      S[   R	                  5       R                  5       nUR                  S\5      u    pE[        R                  " X#XUR                  S]5      S^   5      nU(       a  U$ U[        La  U$ UR                  S]S_5      $ )`N3gpp3gpmp2ttsmp4mpegmpegurlm3u8	quicktimemovwebmvp9z	video/oggogvzx-flvflvzx-m4vm4vz
x-matroskamkvzx-mngmngzx-mp4-fragmentedzx-ms-asfasfzx-ms-wmvwmvz	x-msvideoavizvnd.dlna.mpeg-ttszdash+xmlmpdzf4m+xmlf4mzhds+xmlzvnd.apple.mpegurlzvnd.ms-sstr+xmlismz	x-mpegurlz	audio/mp4m4az
audio/mpegmp3z
audio/webmzaudio/x-matroskamkazaudio/x-mpegurlm3uaacpaacflacmidimidoggwavwavezx-aaczx-flaczx-m4azx-realaudiorazx-wavavifbmpgifjpegjpgpngzsvg+xmlsvgtifftifzvnd.wap.wbmpwbmpwebpzx-iconicozx-jngjngfsttdfxpttmlsamigzr}   xmlrt  )
zx-ms-bmpzfilmstrip+jsonzsmptett+xmlzttaf+xmlzttml+xmlz	x-ms-samigzipr}   r  rt  r  r   r   r  rv  r   )r   r   r   r)  rf  lowerr*  r   traverse_objrsplitr  )mtr   MAPmimetyper   subtyper  s          r   mimetype2extr  j  s   b#*$NKK 	K 	u	K
 	K 	6K 	UK 	K 	uK 	UK 	K 	K 	eK 	K 	EK  	E!K" 	E#K$ 	U%K& 	V'K, 	E-K. 	5/K0 	51K2 	V3K4 	55K6 	V7K< 	U=KB 	eCKD 	fEKF 	EGKH 	5IKJ 	KKL 	MKN 	OKP 	uQKR 	uSKT 	UKV 	WKX 	&YKZ 	[K\ 	t]K^ 	_Kd 	eKf 	ugKh 	uiKj 	kKl 	umKn 	5oKp 	qKr 	sKt 	uKv 	%wKx 	yKz   UKCZ ||C #))+113H'',MAq

 
 9LR9P
QC

	
	"??3$$r   c                 Z    U (       d  g SU ;  a  SU  3n [         R                  " U 5      S   $ )Nr   zfile.r   )	mimetypes
guess_type)
ext_or_urls    r   ext2mimetyper    s2    
*ZL)

+A..r   c                 2   U (       d  0 $ [        [        S [        [        R                  U R	                  5       R	                  S5      R                  S5      5      5      5      nSu  p#pEU H  n[        R                  " SS U5      n[        R                  " SSU5      R                  S5      nUS   S	;   aQ  U(       a  MU  UnUS   S
;   a  SnMd  US   S:X  a  [        R                  " US5      S:X  a  SnM  US S SS/:X  a  SnM  M  US   S;   a  U=(       d    UnM  US   S;   a  U=(       d    UnM  [        SU S35        M     U(       d  U(       d  U(       a"  U=(       d    SU=(       d    SUS.Ub  SU0E$ 0 E$ [        U5      S:X  a  US   US   S.$ 0 $ )Nru  )NNNNz^([^.]+)c                 @    U R                  S5      R                  5       $ rZ  )r  r  r  s    r   r  parse_codecs.<locals>.<lambda>  s    1771:3C3C3Er   z0+(?=\d)r  r   r   )avc1avc2avc3avc4rf  vp8hev1hev2h263h264mp4vhvc1av1theoradvh1dvhe)r  r  DVr  r  10HDR10r   rf  2)rx  mp4aopusvorbisrs  rw  ac-4zac-3ec-3eac3dtscdtsedtshdtsl)stppwvttzWARNING: Unknown codec re  none)vcodecacodecdynamic_rangescodecr   r  r  )r  filterr  r   rf  r   r   r	  r   r  r  r   )
codecs_strsplit_codecsr  r  r  hdr
full_codecr  s           r   parse_codecsr    s   	tS		:##%++C066s;&= > ?L"8FF"
VVK)EzR
{B
399#>8 Y YFQx++qU"y'='=eQ'G4'Orucl* +1X R R)zF1X)))zF2:,bAB) #* 6&& 
 &,%7&!	
 	
 >@	
 	
 
\	a	"1o"1o
 	
 Ir   )preferencesc                   ^ [        U 5      [        U5      :X  a  [        U5      [        U5      :X  d   eU(       + =(       d    SU;   nU(       a#  [        [        U5      [        U 5      5      S:  a  g1 Sk1 SkS.n[        R                  " [        S S9nU" U 5      U" U5      pU=(       d    UR                  5        H>  n
UR                  U
[        5       5      nU
S:X  d  UR                  X45      (       d  M<  U
s  $    1 SkS	S
14nU=(       d    U H5  n
U
1UkUkmU
S:X  d#  TU
1:X  d  [        U4S jU 5       5      (       d  M3  U
s  $    U(       a  S$ US   $ )Nrj  r   >   r  aaclr  r  hevcr  r  r  >   r  r  rf  r  vp8xvp9xvrbs)r_  re  c                 l    U S   R                  S5      S   R                  SS5      R                  5       $ )Nr   r   r  r  )r   r  r  r   s    r   r  $get_compatible_ext.<locals>.<lambda>  s+    !A$**S/!"4"<"<S""E"K"K"Mr   )r  >
   rr  m4bm4pm4rri  rd  rs  r_  ismaismvre  webac              3   D   >#    U  H  oR                  T5      v   M     g 7fr   )
issuperset)r  ext_setscurrent_extss     r   r  %get_compatible_ext.<locals>.<genexpr>  s!      8SBQh##L11/s    rv  )
r   rh  r   r   r  keysr  r   r  r  )vcodecsacodecsvextsaextsr  	allow_mkvCOMPATIBLE_CODECSsanitize_codecr  r  r  	codec_setCOMPATIBLE_EXTSr  s                @r   get_compatible_extr    s`   w<3u:%#g,#e**DDD75K#7ISWs7|4q8

	 &&MON#G,nW.EF6/4466%))#su5	%<9//0@AAJ 7 	Q	O #e#,e,e,%<<C50C 8SBQ8S 5S 5SJ	 $
 52;r?2r   c                 8   U R                   R                  nU" S5      =n(       a@  [        R                  " SU5      =n(       a"  [	        UR                  S5      S S9=n(       a  U$ [	        U" S5      S S9=(       d    U" S5      =(       d    [        U" S5      US9$ )	NzContent-Dispositionz,attachment;\s*filename="(?P<filename>[^"]+)"r  )r,  zx-amz-meta-namezx-amz-meta-file-typezContent-Typer   )headersr  r   r   r.  r  r  )
url_handler   	getheadercdr  r  s         r   urlhandle_detect_extr  %  s    ""&&I,--r-H"MM1M#AGGJ$7TJJsJ
 	i 12E 	D+,	D	.17CEr   c                 l    SR                  U[        R                  " U 5      R                  S5      5      $ )Nzdata:{};base64,{}rh  )r  r  r  r  )r  	mime_types     r   encode_data_urir  3  s+    %%i1A1A$1G1N1Nw1WXXr   c                     Uc  gU c  gX:  $ )z/Returns True iff the content should be blocked Fr   )content_limit	age_limits     r   age_restrictedr  7  s     $$r   ))s   ﻿rm   )s     z	utf-32-be)s     z	utf-32-le)s   z	utf-16-le)s   z	utf-16-bec                     Sn[          HC  u  p#U R                  U5      (       d  M  X0[        U5      S pU R                  U5      (       a  M&  ME     [        R                  " SU R                  US5      5      $ )zBDetect whether a file contains HTML by examining its first bytes. rm   Nz\s*<r  )BOMSrz  r   r   r   r  )first_bytesrs   r  r  s       r   is_htmlr  K  si     H$$S))$'SXY)?k $$S))  88G[//)DEEr   c                    U R                  S5      nUb  U$ [        U S   5      nUR                  S5      (       a  gUR                  S5      (       a  gUR                  S5      (       a  g[        U5      nUS:X  a  U R                  S5      (       a  S$ S$ US	:X  a  g	[        R
                  R                  U5      R                  $ )
Nprotocolr  rtmpmmsrtsprb  is_livem3u8_nativerp  )r  r  rz  r.  r  r  r  r  )ru  r  r  r  s       r   determine_protocolr  V  s    }}Z(H
y'
(C
~~f						

C
f}"y11vD}D	<<  %,,,r   c           
      H  ^ S mU4S jnS nU(       a  U" U5      O/ nU" X5      n U Vs/ s H
  o" X5      PM     nnU /UQn	U" U	5      nUS-  nU(       a8  X V
s/ s H	  oX-   -  PM     sn
/UQn	U	S   S   SU* [        U5      -   U	S   S'   U	 Hm  n[        [        [        U5      5       HM  u  pSU;   a*  UR	                  SSX{   T" U5      -
  -  5      SU-  -   X'   M5  USX{   T" U5      -
  U-   -  -   X'   MO     Mo     S	R                  S
 U	 5       5      $ s  snf s  sn
f )z\Render a list of rows, each as a list of values.
Text after a         will be right aligned c                 J    [        [        U 5      R                  SS5      5      $ )N	r  )r   remove_terminal_sequencesr  rz  s    r   r  render_table.<locals>.widtho  s     ,V4<<T2FGGr   c                 f   > [        U 6  Vs/ s H  n[        U4S jU 5       5      PM     sn$ s  snf )Nc              3   F   >#    U  H  nT" [        U5      5      v   M     g 7fr   r  )r  r  r  s     r   r  5render_table.<locals>.get_max_lens.<locals>.<genexpr>s  s     /3aE#a&MM3s   !)rt  rh  )tablecolr  s     r   get_max_lens"render_table.<locals>.get_max_lensr  s*    ;>;G;C/3//;GGGs   .c                 t    [         R                  " XSS9 VVs/ s H  u  p#U(       d  M  UPM     snn$ s  snnf )NT)	fillvalue)r  zip_longest)rowfilter_arraytaker  s       r   filter_using_list'render_table.<locals>.filter_using_listu  s/    %.%:%:<X\%]f%]	ae%]fffs   44r   rv  Nr
  rd  re  c              3   `   #    U  H$  nS R                  U5      R                  5       v   M&     g7f)r  N)r   r  )r  r  s     r   r  render_table.<locals>.<genexpr>  s$     <esRWWS\((**es   ,.)r   rG  r  r   r  r   )
header_rowr  r{  	extra_gap
hide_emptyr  r  max_lensr  r  mlrx  r   r  s                @r   render_tabler$  l  sP   HHg &0|D!RH":8J8<=c,D=$EE"HNIJ2r~6JRTRQx|$<iZ#e*%<=a"3sC=1ICt|<<cX]U4[5P.QRUX[dUdd#t)Dy)P"QQ	 2  99<e<<< > Ks   DDc                 p  ^^ [         R                  S S S S.n0 UE[         R                  [         R                  [         R                  [         R
                  [         R                  S.En[        T[        5      (       a  U4S jnOU4S jn[        R                  " SR                  S	R                  [        [        R                  UR                  5       5      5      5      5      nUR!                  U R#                  5       5      nU(       a  UR%                  5       nXGS
      mUS   (       a  U4S jnOTnUS   =(       d    US   n	US   (       a'  U	R'                  SR                  US   5      US   5      n	UR)                  US   5      n
S n[        U
[*        [,        45      (       a   [+        U	5      nUb&  US
   U;   a  [/        SR                  US
   5      5      eU
c  U" US   5      =(       d    US   $ U" Xc  U	5      $ U5      $ S S S.n[        R                  " SR                  S	R                  [        [        R                  UR                  5       5      5      5      5      nUR!                  U R#                  5       5      nU(       a[  XR5                  S
5         nUR)                  UR5                  S5      5      n
U" UR5                  S5      5      (       a  U
c  gU" U
5      $ [/        SU < 35      e! [.         a.    [1        U	5      nUc  [1        U	 S35      nUc  [3        U	5      n GN|f = f)Nc                 $    U R                  U5      $ r   )rz  r  r   s     r   r  _match_one.<locals>.<lambda>  s    $//%"8r   c                 $    U R                  U5      $ r   )r{  r'  s     r   r  r(    s    $--"6r   c                 .    [         R                  " X5      $ r   )r   r  r'  s     r   r  r(    s    "))E"8r   )z*=z^=z$=z~=)z<=r>  z>=r=  r9  c                    > T$ r   r   )r   r  s    r   r  r(    s    *r   c                    > U T;   $ r   r   )r*  r  s    r   r  r(    s	    !z/r   z(?x)
        (?P<key>[a-z_]+)
        \s*(?P<negation>!\s*)?(?P<op>{})(?P<none_inclusive>\s*\?)?\s*
        (?:
            (?P<quote>["\'])(?P<quotedstrval>.+?)(?P=quote)|
            (?P<strval>.+?)
        )
        r  opnegationc                    > T" X5      (       + $ r   r   )r  r   unnegated_ops     r   r  r(    s    d)B%Br   quotedstrvalstrvalr  z\{}r   rK  z(Operator {} only supports string values!none_inclusivec                 <    [        U [        5      (       a  U SL $ U S L$ rb  r  rL  s    r   r  r(    s     Z4%8%8qDyMq}Mr   c                 <    [        U [        5      (       a  U SL $ U S L $ r  r  rL  s    r   r  r(    s     z!T':':U
KdKr   )r  r  z3(?x)
        (?P<op>{})\s*(?P<key>[a-z_]+)
        TzInvalid filter part )r  containsleltgegteqr   r  r   r  r  r   r  r   r  rM  rf  	groupdictr  r  r  r-  r6  r  r  r  )filter_partr  r  STRING_OPERATORSCOMPARISON_OPERATORSrq  operator_rexr  r-  comparison_valueactual_valuenumeric_comparisonUNARY_OPERATORSr0  s     `          @r   
_match_onerE    s    868	
kk[[kk[[[[ *d##,1::  F388C		+?+D+D+FGHIKL 	{0023AKKM+dG4Z=BBB^,;(W:/77aj8QSTU\S]^wwqx(!lS%L11
J%()9%:" )ag9I.IGNNqQUwWXX 5*Aa0@.AA,4N 0ggTfgg NKO :: F388C		?+?+?+ABCDFL 	{0023AWWT]+wwqwwu~.((\-A,
+K?;
<<7  J%34D%E"%-)7;K:LA8N)O&%-)78H)I&Js   -K= =4L54L5c                 \   ^^ [        UU4S j[        R                  " SU 5       5       5      $ )aL  Filter a dictionary with a simple string syntax.
@returns           Whether the filter passes
@param incomplete  Set of keys that is expected to be missing from dct.
                   Can be True/False to indicate all/none of the keys may be missing.
                   All conditions on incomplete keys pass if the key is missing
c              3   ^   >#    U  H"  n[        UR                  S S5      TT5      v   M$     g7f)z\&r  N)rE  r  )r  r=  r  r  s     r   r  match_str.<locals>.<genexpr>  s1      ><K 	;&&uc2CDD<s   *-z(?<!\\)&)allr   r   )
filter_strr  r  s    ``r   	match_strrK    s*      >88K<> > >r   c                 `  ^ ^^ T (       d  T(       d  g [         R                   S[         R                   ST  ST S3n[        T5      =(       d    S m[        [	        T =(       d    / 5      5      m ST ;   mT(       a  T R                  S5        [        R                  U5      SUU U4S jj5       nU$ )	Nr   rr  rs  rt  c                     g r   r   )r   r  s     r   r  #match_filter_func.<locals>.<lambda>  s    Tr   r  c                 l  >^ ^ T" T T5      nUb  [        U5      eT(       a  [        UU 4S jT 5       5      (       a  T(       a  T(       d  [        $ S $ T R                  S5      =(       d    T R                  S5      =(       d    SnSR	                  [        [        R                  T5      5      nU SU S3$ )Nc              3   >   >#    U  H  n[        UTT5      v   M     g 7fr   )rK  )r  r  r  ru  s     r   r  9match_filter_func.<locals>._match_func.<locals>.<genexpr>  s     S7ai9jAA7s   r  r   rv  z) | (z does not pass filter (z), skipping ..)r  r  r   r  r   r  r   rf  )ru  r  r}  video_titlerJ  breaking_filtersfiltersinteractives   ``   r   _match_func&match_filter_func.<locals>._match_func  s    y*5?&s++#S7SSS!,Z:ITI#--0RIMM$4GR7K c#))W&=>J!]"9*^TTr   r  )match_filter_funcr   r   r   r  r   function_with_reprset_repr)rT  rS  repr_rV  rU  s   ``  @r   rX  rX    s    + ++,A.?.L.L-MQwiWYZjYkklmE()9:R?Q(7=b)*G.Ks  '
U 
U (
U r   c                   @    \ rS rSrS	S jrS r\S 5       rS rS r	Sr
g)
download_range_funci  c                 .    XUsU l         U l        U l        g r   )chaptersranges	from_info)r  r_  r`  ra  s       r   r  download_range_func.__init__  s    5=y2t{DNr   c              #   ^  #    UR                  S5      (       a  SOSnU R                  =(       d    /  H[  n[        UR                  S5      =(       d    / 5       H1  u  pV[        R                  " XFS   5      (       d  M%  S n0 UESU0Ev   M3     M]     U R                  (       a!  U(       a  UR                  SUS    SU 35        U R                  =(       d    /  H*  u  pxU R                  Xq5      U R                  X5      S	.v   M,     U R                  (       am  UR                  S
5      (       d  UR                  S5      (       aA  UR                  S
5      =(       d    SUR                  S5      =(       d    [        S5      S	.v   g U R                  (       d  U R                  (       d  0 v   g g g 7f)Nr_  z(There are no chapters matching the regexz>Cannot match chapters since chapter information is unavailabler  r5  z[info] r   r  )rI  end_timerI  rd  r   r;  )
r  r_  rG  r   r  	to_screenr`  _handle_negative_timestampra  r-  )	r  ru  ro  warningr  r+  r7  r  rg  s	            r   __call__download_range_func.__call__  sW    AJzAZAZ=X 	]](b(E'	j(A(GRH
99UG$455"G1W1gq11 I )
 ==WMMGIdO#4Bwi@A++++JE"==eO ;;CK  , >>y}}\::immJ>W>W'mmL9>Q%MM*5Eu  T]]H &3s   A7F-=D0F-c                 b    UR                  S5      (       a  U S:  a  [        US   U -   S5      $ U $ )Ndurationr   )r  rh  )r|  infos     r   rf  .download_range_func._handle_negative_timestamp   s4    26((:2F2F4RS8s4
#d*A.]Y]]r   c                     [        U[        5      =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ r   )r   r]  r_  r`  r|  s     r   r~  download_range_func.__eq__$  s?    5"56 TMMU^^3T8<u||8S	Ur   c                 t    [          S[        U 5      R                    SU R                   SU R                   S3$ rq  )r   r  r_  r`  r  s    r   rv  download_range_func.__repr__(  s5    1T$Z0014==/DKK=PQRRr   )r_  ra  r`  Nr  )r   r   r   r   r  rh  r  rf  r~  rv  r   r   r   r   r]  r]    s/    Q4 ^ ^USr   r]  c                    U (       d  g [         R                  " S[         S3U 5      nU(       a  [        UR	                  S5      5      $ [         R                  " SU 5      nU(       af  S[        UR	                  S5      5      -  S[        UR	                  S5      5      -  -   [        UR	                  S	5      R                  S
S5      5      -   $ g )Nz^(?P<time_offset>z)s?$time_offsetz%^(\d+):(\d\d):(\d\d(?:(?:\.|:)\d+)?)$r$  r   rq  r   r  r   r   )r   r   r>  r-  r  r  r  )	time_exprr  s     r   parse_dfxp_time_exprru  ,  s    88(48)DDTZZ.//88<iHDc$**Q-((2DJJqM0B+BBU4::VW=K`K`adfiKjEkkk r   c                 $    S[        U S-  5      -  $ )Nz%02d:%02d:%02d,%03drp  )rx  )rm  s    r   srt_subtitles_timecoderw  9  s     #6w~#FFFr   c                 R    [        U S-  5      nS/ US S QUR                  S-  P7-  $ )Nrp  z%01d:%02d:%02d.%02drv  r  )rx  rn  )rm  r|  s     r   ass_subtitles_timecodery  =  s7    w~.D #GT#2Y#G0A0AB0F#GGGr   c           
        ^^^^^ S/ SQ4SS/44n/ SQm[         R                  " [        SSSS	.S
9m0 m0 m " UUUU4S jS5      mU R                  SS5      n U4S jnU H  u  p4U H  nU R                  XS5      n M     M!     [	        U 5      n/ nUR                  T" S5      5      =(       d    UR                  S5      nU(       d  [        S5      eSn	 UR                  T" S5      5       H  n
U
R                  S5      =(       d    U
R                  T" S5      5      nU(       d  M;  U
R                  S5      nU(       a   UT;  a  Sn	M]  TU   R                  5       TU'   T H;  nU
R                  T" SU-   5      5      nU(       d  M&  UTR                  U0 5      U'   M=     M     U	(       a  Sn	OOM  S H\  n[        UT" SU-   5      SU-   /5      nUc  M"  TR                  UR                  S5      5      n
U
(       d  MK  TR                  U
5        M^     [        U[        R                  " S5      5       H  u  nn[        UR                   R                  S5      5      n[        UR                   R                  S5      5      n[        UR                   R                  S 5      5      nUc  Mw  U(       d  U(       d  M  UU-   nUR#                  S!U[%        U5      [%        U5      U" U5      4-  5        M     S"R'                  U5      $ )#zs
@param dfxp_data A bytes-like object containing DFXP data
@returns A unicode object containing converted SRT data
s   http://www.w3.org/ns/ttml)s   http://www.w3.org/2004/11/ttaf1s   http://www.w3.org/2006/04/ttaf1s   http://www.w3.org/2006/10/ttaf1s!   http://www.w3.org/ns/ttml#stylings   http://www.w3.org/ns/ttml#style)color
fontFamilyfontSize	fontStyle
fontWeighttextDecorationz$http://www.w3.org/XML/1998/namespacezhttp://www.w3.org/ns/ttmlz!http://www.w3.org/ns/ttml#styling)r  r  tts)r   c                   L   > \ rS rSrSr/ r/ rU UUU4S jrU4S jrS r	S r
Srg)	$dfxp2srt.<locals>.TTMLPElementParserid  r  c                   > UT" S5      S4;   a  U =R                   S-  sl         g / n0 nUR                  S5      nT(       a  UR                  T5        U(       a!  UR                  TR                  U0 5      5        T H*  nUR                  T" SU-   5      5      nU(       d  M&  XtU'   M,     U(       Ga  Sn[        UR	                  5       5       GH  u  pU R
                  (       a$  U R
                  S   R                  U	5      U
:X  a  M;  U	S:X  a  US	U
 S
3-  nML  U	S:X  a  USU
 S
3-  nM]  U	S:X  a  USU
 S
3-  nMn  U	S:X  a.  U
S:X  a(  U =R                   S-  sl         UR                  S5        M  U	S:X  a.  U
S:X  a(  U =R                   S-  sl         UR                  S5        M  U	S:X  d  M  U
S:X  d  M  U =R                   S-  sl         UR                  S5        GM     U(       a,  U =R                   SU-   S-   -  sl         UR                  S5        0 nU R
                  (       a  UR                  U R
                  S   5        UR                  U5        U R
                  R                  U5        U R                  R                  U5        g )Nttml:brbrre  styletts:r  rv  r{  z color="r  r}  z size="r|  z face="r  boldz<b>r  r~  italicz<i>r+  r  	underlinez<u>r;  z<fontr=  font)_outr  r  sortedrS  _applied_stylesr   _unclosed_elements)r  r   r   unclosed_elementsr  element_style_idpropprop_valr  r*  r  applied_styleSUPPORTED_STYLING_xdefault_stylestyless               r   r  *dfxp2srt.<locals>.TTMLPElementParser.starti  s3   r)}d++		T!	$&!#)::g#6  LL/#LL,<b!AB-D%zz"Vd]*;<Hx&.d . D &u{{} 5//D4H4H4L4P4PQR4SWX4X$< hqcO3D*_ gaSN2D,. gaSN2D,.1; II.I-44S9+-!x- II.I-44S9"22qK7G II.I-44S9# !6$ 		Wt^c%99	)008$&M++%,,T-A-A"-EF!((/((//>''../@Ar   c                   > UT" S5      S4;  az  U R                   R                  5       n[        U5       H  nU =R                  SU S3-  sl        M     U(       a-  U R                  (       a  U R                  R                  5         g g g g )Nr  r  r<  r=  )r  r-  reversedr  r  )r  r   r  elementr  s       r   rg  (dfxp2srt.<locals>.TTMLPElementParser.end  sy    2i=$//$($;$;$?$?$A!'(9:GII2gYa0I  ;$)=)=((,,. *>$	 0r   c                 .    U =R                   U-  sl         g r   )r  )r  r  s     r   r  )dfxp2srt.<locals>.TTMLPElementParser.data  s    IIIr   c                 6    U R                   R                  5       $ r   )r  rf  r  s    r   r"  *dfxp2srt.<locals>.TTMLPElementParser.close  s    99??$$r   r   N)r   r   r   r   r  r  r  r  rg  r  r"  r   )r  r  r  r  s   r   TTMLPElementParserr  d  s/    +	B +	BZ	/		%r   r  s   encoding='UTF-16's   encoding='UTF-8'c                    > T" 5       n[         R                  R                  R                  US9nUR	                  [         R                  R                  R                  U 5      5        UR                  5       $ )N)target)r  etreeElementTree	XMLParserr?  tostringr"  )r   r  r  r  s      r   
parse_nodedfxp2srt.<locals>.parse_node  sU    #%&&000?CII))22489||~r   z	.//ttml:pz.//pzInvalid dfxp/TTML subtitleFTz.//ttml:styler   zxml:idr  r  )bodydivz.//ttml:z.//r   beginrg  durz%d
%s --> %s
%s

r  )r   r   r   r  r   findallr6  r  r<  r>  r   r  rt  r  rX  ru  r   r   rw  r   )	dfxp_dataLEGACY_NAMESPACESr  r*  r  r   r  r  parasrepeatr  style_idparent_style_idr  r  peleparar5  
begin_timerd  r  r  r  r  r  r  s                         @@@@@r   dfxp2srtr  B  s    
& (
 	
 
..0
 		 
		=5+22 
B FM>% >%D !!"8:OPI "B!))"0I  " #9-D
CLLK)AT\\&-AE566F
\\"_"56EyyA%))BxL*AH#ii0O"&0!F#)/#:#?#?#Ax ) 99R%678<DF%%h3D9 * 7 F% ( D2j1n#5uqy"AB;

3777+,U#  5)//!"45e)$++//'*BC
'(>?"4;;??5#9:!C'H

*":."8,t	.  	 6  773<r   c                 `    U R                  U5      nUc  / $ Uc  U[        U5      /$ U U U 3/$ r   )r  r   )r  command_optionr   	separators       r   
cli_optionr    sK    JJuE-B :1:1B.#e*-:#$YKw78:r   c                 R    U R                  U5      nUS;   d   e[        X4S.XU5      $ )N)TFN)TF)r  r  )r  r  r   
true_valuefalse_valuer  s         r   cli_bool_optionr    s2    JJuE''''Z<nU^__r   c                 6    U R                  U5      U:X  a  U/$ / $ r   r  )r  r  r   expected_values       r   cli_valueless_optionr    s     %zz%0NBNJJr   c                    [        U [        [        45      (       a  U(       a  U $ S n U c  U$ [        U [        5      (       d   e[        U[        [        45      (       d   eU Hu  n[        [	        S [        U5       Vs/ s H!  oPR                  UR                  5       5      PM#     sn5      5      nU(       d  MX  U VVs/ s H  ow  H  oPM     M     snns  $    U$ s  snf s  snnf )Nc                 
    U S L$ r   r   r   s    r   r  (cli_configuration_args.<locals>.<lambda>  s    atmr   )r   r  r  rM  r  r  r  r  )	argdictr  r   
use_compatkey_listr   arg_listr   args	            r   cli_configuration_argsr    s    'D%=))NGgt$$$$dT5M****#19(1CD1C#[[%1CDF G 8$,=HDCCH==  N E=s   >(C?C"c                    U R                  5       UR                  5       p X:X  a  UOU  SU 3nU=(       d    S/ Vs/ s H  ov U 3PM
     nnXc;   a)  X:w  a  UR                  X45        UR                  S5        OSn[        XXE5      $ s  snf )Nr  r  r   F)r  r   r  )main_keyr  r  r  r   r  root_keyr*  s           r   _configuration_argsr    s    NN$ciikcoshZq+>H'+|t|5|j|D5?KK(I
!'EE 6s   B	c                      \ rS rSr0 SS_SS_SS_SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_0 S$S%_S&S'_S(S)_S*S+_S,S-_S.S/_S0S1_S2S3_S4S5_S6S7_S8S9_S:S;_S<S=_S>S?_S@SA_SBSC_SDSE_E0 SFSG_SHSI_SJSK_SLSM_SNSO_SPSQ_SRSS_STSU_SVSW_SXSY_SZS[_S\S]_S^S__S`Sa_SbSc_SdSe_SfSg_E0 ShSi_SjSk_SlSm_SnSo_SpSq_SrSs_StSs_SuSv_SwSx_SySz_S{S|_S}S~_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_GS GS_GSGS_GSGS_GSGS_GSGS	_GS
GS_GSGS_GSGS_E0 GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GS GS!_GS"GS#_GS$GS%_GS&GS'_GS(GS)_GS*GS+_GS,GS-_GS.GS/_GS0GS1_E0 GS2GS3_GS4GS5_GS6GS7_GS8GS9_GS:GS;_GS<GS=_GS>GS?_GS@GSA_GSBGSC_GSDGSE_GSFGSG_GSHGSI_GSJGSK_GSLGSM_GSNGSO_GSPGSQ_GSRGSS_E0 GSTGSU_GSVGSW_GSXGSY_GSZGS[_GS\GS]_GS^GS__GS`GSa_GSbGSc_GSdGSe_GSfGSg_GShGSi_GSjGSk_GSlGSm_GSnGSm_GSoGSp_GSqGSr_GSsGSt_EGSuGSv0Er\GSw 5       r\GSx 5       rGSyrGgz({  ISO639Utilsi  aaaarr  abkr[   aveafafrakakaamamhanr  araraasasmavavaayaymazazebabakbebelbgbulbhbihbibisbmbambnbenbobodr  brebsboscacatcechechchacocoscrcrecscescuchucvchvcycymdadandedeudvr  dzdzoeeeweelellr?   engeoepoesspaetesteueusfafasfffulfifinfjfijfofaor@   frafyfrygaglegdglaglglggngrngugujgvglvhahauhehebiwhihinhohmohrhrvhthathuhunhyhyehzheriainar   indinr  ileigiboiiiiiikipkr  idoisislititaiuikujajpnjvjavkakatkgkonkikikkjkuar  kazklkalkmkhmknkankokorkrkaukskaskukurkvkomkwcorkykirlalatlbltzlglugrW  limlnlinlolaor8  litlulublvlavmgmlgmhmahmimrimkmkdr#  malmnmonmrmarr  msar  mltmymyananaunbnobndndenenepngndonlnldnnnnononornrnblnvnavnynyaocociojojiomormororiry   osspapanpeperpiplirA   polpspusptporququermrohrnr^  roronrurusrwkinsasanscsrdsdsndsesmesgsagsisinskslkslslvsmsmosnsnasosomsqsqisrsrprY   sswstsotsusunsvsweswswatatamteteltgtgkr_   thatitirtktuktltgltntsntotontrturr^  tsor  tattwtwitytahuguigukukrururduzuzbvevenvivievovolwawlnwowolxhxhoyiyidjiyoyorzazhazhzhozuzulc                 >    U R                   R                  USS 5      $ )z3Convert language code from ISO 639-1 to ISO 639-2/TNr   )	_lang_mapr  r[  r  s     r   
short2longISO639Utils.short2long  s     }}  bq**r   c                 \    U R                   R                  5        H  u  p#X1:X  d  M  Us  $    g)z3Convert language code from ISO 639-2/T to ISO 639-1N)r6	  rS  )r[  r  
short_name	long_names       r   
long2shortISO639Utils.long2short  s*     &)]]%8%8%:!J !! &;r   r   N)	r   r   r   r   r6	  re  r8	  r=	  r   r   r   r   r  r    s
   }e}e} 	e} 	e	}
 	e} 	e} 	e} 	e} 	e} 	e} 	e} 	e} 	e} 	e} 	e}  	e!}" 	e#}$ 	e%}& 	e'}( 	e)}* 	e+}, 	e-}. 	e/}0 	e1}2 	e3}4 	e5}6 	e7}8 	e9}: 	e;}< 	e=}> 	e?}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}z 	e{}| 	e}}~ 	e}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}z 	e{}| 	e}}~ 	e}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}z 	e{}| 	e}}~ 	e}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}z 	e{}| 	e}}~ 	e}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}I~ + + " "r   r  c                      \ rS rSr0 SS_SS_SS_SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_0 S$S%_S&S'_S(S)_S*S+_S,S-_S.S/_S0S1_S2S3_S4S5_S6S7_S8S9_S:S;_S<S=_S>S?_S@SA_SBSC_SDSE_E0 SFSG_SHSI_SJSK_SLSM_SNSO_SPSQ_SRSS_STSU_SVSW_SXSY_SZS[_S\S]_S^S__S`Sa_SbSc_SdSe_SfSg_E0 ShSi_SjSk_SlSm_SnSo_SpSq_SrSs_StSu_SvSw_SxSy_SzS{_S|S}_S~S_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_GS GS_GSGS_GSGS_GSGS_GSGS	_GS
GS_GSGS_GSGS_GSGS_E0 GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GS GS!_GS"GS#_GS$GS%_GS&GS'_GS(GS)_GS*GS+_GS,GS-_GS.GS/_GS0GS1_GS2GS3_E0 GS4GS5_GS6GS7_GS8GS9_GS:GS;_GS<GS=_GS>GS?_GS@GSA_GSBGSC_GSDGSE_GSFGSG_GSHGSI_GSJGSK_GSLGSM_GSNGSO_GSPGSQ_GSRGSS_GSTGSU_E0 GSVGSW_GSXGSY_GSZGS[_GS\GS]_GS^GS__GS`GSa_GSbGSc_GSdGSe_GSfGSg_GShGSi_GSjGSk_GSlGSm_GSnGSo_GSpGSq_GSrGSs_GStGSu_GSvGSw_E0 GSxGSy_GSzGS{_GS|GS}_GS~GS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_E0 GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_E0 GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_EGSGSGSGSGSGSGSGSGSGSGSGSGSGS.Er\GS 5       rGSrGg(  ISO3166Utilsi  AFAfghanistanAXu   Åland IslandsALAlbaniaDZAlgeriaASzAmerican SamoaADAndorraAOAngolaAIAnguillaAQ
AntarcticaAGzAntigua and BarbudaAR	ArgentinaAMArmeniaAWArubaAU	AustraliaATAustriaAZ
AzerbaijanBSBahamasBHBahrainBD
BangladeshBBBarbadosBYBelarusBEBelgiumBZBelizeBJBeninBMBermudaBTBhutanBOzBolivia, Plurinational State ofBQz Bonaire, Sint Eustatius and SabaBAzBosnia and HerzegovinaBWBotswanaBVzBouvet IslandBRBrazilIOzBritish Indian Ocean TerritoryBNzBrunei DarussalamBGBulgariaBFzBurkina FasoBIBurundiKHCambodiar  CameroonCACanadaCVz
Cape VerdeKYzCayman IslandsCFzCentral African RepublicTDChadCLChileCNChinaCXzChristmas IslandCCzCocos (Keeling) IslandsCOColombiaKMComorosCGCongoCDz%Congo, the Democratic Republic of theCKzCook IslandsCRz
Costa RicaCIu   Côte d'IvoireHRCroatiaCUCubaCWu   CuraçaoCYCyprusCZzCzech RepublicDKDenmarkDJDjiboutiDMDominicaDOzDominican RepublicECEcuadorEGEgyptSVzEl SalvadorGQzEquatorial GuineaEREritreaEEEstoniaETEthiopiaFKzFalkland Islands (Malvinas)FOzFaroe IslandsFJFijiFIFinlandFRFranceGFzFrench GuianaPFzFrench PolynesiaTFzFrench Southern TerritoriesGAGabonGMGambiaGEGeorgiaDEGermanyGHGhanaGI	GibraltarGRGreeceGL	GreenlandGDGrenadaGP
GuadeloupeGUGuamGT	GuatemalaGGGuernseyGNGuineaGWzGuinea-BissauGYGuyanaHTHaitiHMz!Heard Island and McDonald IslandsVAzHoly See (Vatican City State)HNHondurasHKz	Hong KongHUHungaryISIcelandINIndiaID	IndonesiaIRzIran, Islamic Republic ofIQIraqIEIrelandIMzIsle of ManILIsraelITItalyJMJamaicaJPJapanJEJerseyJOJordanKZ
KazakhstanKEKenyaKIKiribatiKPz&Korea, Democratic People's Republic ofKRzKorea, Republic ofKWKuwaitKG
KyrgyzstanLAz Lao People's Democratic RepublicLVLatviaLBLebanonLSLesothoLRLiberiaLYLibyaLILiechtensteinLT	LithuaniaLU
LuxembourgMOMacaoMKz*Macedonia, the Former Yugoslav Republic ofMG
MadagascarMWMalawiMYMalaysiaMVMaldivesMLMaliMTMaltaMHzMarshall IslandsMQ
MartiniqueMR
MauritaniaMU	MauritiusYTMayotteMXMexicoFMzMicronesia, Federated States ofMDzMoldova, Republic ofMCMonacoMNMongoliaME
MontenegroMS
MontserratMAMoroccoMZ
MozambiqueMMMyanmarNANamibiaNRNauruNPNepalNLNetherlandsr  zNew CaledoniaNZzNew ZealandNI	NicaraguaNENigerNGNigeriaNUNiueNFzNorfolk IslandMPzNorthern Mariana IslandsNONorwayOMOmanPKPakistanPWPalauPSzPalestine, State ofPAPanamar  zPapua New GuineaPYParaguayPEPeruPHPhilippinesPNPitcairnPLPolandPTPortugalPRzPuerto RicoQAQatarREu   RéunionRORomaniaRUzRussian FederationRWRwandaBLu   Saint BarthélemySHz,Saint Helena, Ascension and Tristan da CunhaKNzSaint Kitts and NevisLCzSaint LuciaMFzSaint Martin (French part)PMzSaint Pierre and MiquelonVCz Saint Vincent and the GrenadinesWSSamoaSMz
San MarinoSTzSao Tome and PrincipeSAzSaudi ArabiaSNSenegalRSSerbiaSC
SeychellesSLzSierra LeoneSG	SingaporeSXzSint Maarten (Dutch part)SKSlovakiaSISloveniaSBzSolomon IslandsSOSomaliaZAzSouth AfricaGSz,South Georgia and the South Sandwich IslandsSSzSouth SudanESSpainLKz	Sri LankaSDSudanSRSurinameSJzSvalbard and Jan MayenSZ	SwazilandSESwedenCHSwitzerlandSYzSyrian Arab RepublicTWzTaiwan, Province of ChinaTJ
TajikistanTZzTanzania, United Republic ofrX   ThailandTLzTimor-LesteTGTogoTKTokelauTOTongaTTzTrinidad and TobagoTNTunisiaTRTurkeyTMTurkmenistanTCzTurks and Caicos IslandsTVTuvaluUGUgandaUAUkrainerT   zUnited Arab Emiratesr[  zUnited KingdomUSzUnited StatesUMz$United States Minor Outlying IslandsUYUruguay
UzbekistanVanuatuz!Venezuela, Bolivarian Republic ofzViet NamzVirgin Islands, BritishzVirgin Islands, U.S.zWallis and FutunazWestern SaharaYemenZambiaZimbabwezAsia/Pacific RegionEurope)UZVUVEVNVGVIWFEHYEZMZWAPEUc                 T    U R                   R                  UR                  5       5      $ )zAConvert an ISO 3166-2 country code to the corresponding full name)_country_mapr  rH  r7	  s     r   
short2fullISO3166Utils.short2full  s!     ##DJJL11r   r   N)r   r   r   r   r
  re  r
  r   r   r   r   r@	  r@	    s6   }m}} 	i} 	i	}
 	} 	i} 	h} 	j} 	l} 	#} 	k} 	i} 	g} 	k} 	i}  	l!}" 	i#}$ 	i%}& 	l'}( 	j)}* 	i+}, 	i-}. 	h/}0 	g1}2 	i3}4 	h5}6 	/7}8 	09}: 	&;}< 	j=}> 	o?}@ 	hA}B 	.C}D 	!E}F 	jG}H 	nI}J 	iK}L 	jM}N 	jO}P 	hQ}R 	lS}T 	U}V 	(W}X 	fY}Z 	g[}\ 	g]}^ 	 _}` 	'a}b 	jc}d 	ie}f 	gg}h 	5i}j 	nk}l 	lm}n 	o}p 	iq}r 	fs}t 	ju}v 	hw}x 	y}z 	i{}| 	j}}~ 	j}@ 	"A}B 	iC}D 	gE}F 	mG}H 	!I}J 	iK}L 	iM}N 	jO}P 	+Q}R 	oS}T 	fU}V 	iW}X 	hY}Z 	o[}\ 	 ]}^ 	+_}` 	ga}b 	hc}d 	ie}f 	ig}h 	gi}j 	kk}l 	hm}n 	ko}p 	iq}r 	ls}t 	fu}v 	kw}x 	jy}z 	h{}| 	o}}~ 	h}@ 	gA}B 	1C}D 	-E}F 	jG}H 	kI}J 	iK}L 	iM}N 	gO}P 	kQ}R 	)S}T 	fU}V 	iW}X 	mY}Z 	h[}\ 	g]}^ 	i_}` 	ga}b 	hc}d 	he}f 	lg}h 	gi}j 	jk}l 	7m}n 	"o}p 	hq}r 	ls}t 	1u}v 	hw}x 	iy}z 	i{}| 	i}}~ 	g}@ 	oA}B 	kC}D 	lE}F 	gG}H 	:I}J 	lK}L 	hM}N 	jO}P 	jQ}R 	fS}T 	gU}V 	 W}X 	lY}Z 	l[}\ 	k]}^ 	i_}` 	ha}b 	/c}d 	$e}f 	hg}h 	ji}j 	lk}l 	lm}n 	io}p 	lq}r 	is}t 	iu}v 	gw}x 	gy}z 	m{}| 	o}}~ 	m}@ 	kA}B 	gC}D 	iE}F 	fG}H 	I}J 	(K}L 	hM}N 	fO}P 	jQ}R 	gS}T 	#U}V 	hW}X 	 Y}Z 	j[}\ 	f]}^ 	m_}` 	ja}b 	hc}d 	je}f 	mg}h 	gi}j 	jk}l 	im}n 	"o}p 	hq}r 	!s}t 	<u}v 	%w}x 	my}z 	*{}| 	)}}~ 	0}@ 	gA}B 	lC}D 	%E}F 	nG}H 	iI}J 	hK}L 	lM}N 	nO}P 	kQ}R 	)S}T 	jU}V 	jW}X 	Y}Z 	i[}\ 	n]}^ 	<_}` 	ma}b 	gc}d 	ke}f 	gg}h 	ji}j 	&k}l 	km}n 	ho}p 	mq}r 	$s}t 	)u}v 	lw}x 	,y}z 	j{}| 	m}}~ 	f}@ 	iA}B 	gC}D 	#E}F 	iG}H 	hI}J 	nK}L 	(M}N 	hO}P 	hQ}R 	iS}T 	$U}V 	W}X 	oY}Z 	4[}\ 	i]}^ 1'$!#y}L~ 2 2r   r@	  c                      \ rS rSr0 SS_SS_SS_SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_0 S$S%_S&S'_S(S)_S*S+_S,S-_S.S/_S0S1_S2S3_S4S5_S6S7_S8S9_S:S;_S<S=_S>S?_S@SA_SBSC_SDSE_E0 SFSG_SHSI_SJSK_SLSM_SNSO_SPSQ_SRSS_STSU_SVSW_SXSY_SZS[_S\S]_S^S__S`Sa_SbSc_SdSe_SfSg_E0 ShSi_SjSk_SlSm_SnSo_SpSq_SrSs_StSu_SvSw_SxSy_SzS{_S|S}_S~S_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_GS GS_GSGS_GSGS_GSGS_GSGS	_GS
GS_GSGS_GSGS_GSGS_E0 GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GS GS!_GS"GS#_GS$GS%_GS&GS'_GS(GS)_GS*GS+_GS,GS-_GS.GS/_GS0GS1_GS2GS3_E0 GS4GS5_GS6GS7_GS8GS9_GS:GS;_GS<GS=_GS>GS?_GS@GSA_GSBGSC_GSDGSE_GSFGSG_GSHGSI_GSJGSK_GSLGSM_GSNGSO_GSPGSQ_GSRGSS_GSTGSU_E0 GSVGSW_GSXGSY_GSZGS[_GS\GS]_GS^GS__GS`GSa_GSbGSc_GSdGSe_GSfGSg_GShGSi_GSjGSk_GSlGSm_GSnGSo_GSpGSq_GSrGSs_GStGSu_GSvGSw_E0 GSxGSy_GSzGS{_GS|GS}_GS~GS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_E0 GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_E0 GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_EGSGSGS.Er\GS 5       rGSrGg(  GeoUtilsi  rI	  z46.172.224.0/19rT   z94.200.0.0/13rA	  z149.54.0.0/17rQ	  z209.59.64.0/18rM	  z204.14.248.0/21rD	  z46.99.0.0/16rT	  z46.70.0.0/15rK	  z105.168.0.0/13r
  z182.50.184.0/21rO	  z23.154.160.0/24rR	  z181.0.0.0/12rH	  z202.70.112.0/20rZ	  z77.116.0.0/14rX	  z1.128.0.0/11rV	  z181.41.0.0/18rC	  z185.217.4.0/22r\	  z5.197.0.0/16rt	  z31.176.128.0/17rd	  z65.48.128.0/17rb	  z114.130.0.0/16rh	  z
57.0.0.0/8r~	  z102.178.0.0/15r|	  z95.42.0.0/15r`	  z37.131.0.0/17r	  z154.117.192.0/18rl	  z137.255.0.0/16r{
  z185.212.72.0/23rn	  z196.12.64.0/18r{	  z156.31.0.0/16rr	  z161.56.0.0/16rs	  z161.0.80.0/20rx	  z191.128.0.0/12r^	  z24.51.64.0/18rp	  z119.2.96.0/19ru	  z168.167.0.0/16rf	  z178.120.0.0/13rj	  z179.42.192.0/18r	  z99.224.0.0/11r	  z41.243.0.0/16r	  z197.242.176.0/21r	  z160.113.0.0/16r
  z85.0.0.0/13r	  z102.136.0.0/14r	  z202.65.32.0/19r	  z152.172.0.0/14r  z102.244.0.0/14r	  z36.128.0.0/10r	  z181.240.0.0/12r	  z201.192.0.0/12r	  z152.206.0.0/15r	  z165.90.96.0/19r	  z190.88.128.0/17r	  z31.153.0.0/16r	  z88.100.0.0/14r	  z
53.0.0.0/8r	  z197.241.0.0/17r	  z87.48.0.0/12r	  z192.243.48.0/20r	  z152.166.0.0/15rF	  z41.96.0.0/12r	  z186.68.0.0/15r	  z90.190.0.0/15r	  z156.160.0.0/11r	  z196.200.96.0/20r
  z88.0.0.0/11r	  z196.188.0.0/14r
  z2.16.0.0/13r	  z91.152.0.0/13r	  z144.120.0.0/16r	  z80.73.208.0/21r8
  z119.252.112.0/20r	  z88.85.32.0/19r	  z
90.0.0.0/9r	  z41.158.0.0/15r[  z
25.0.0.0/8r	  z74.122.88.0/21r	  z31.146.0.0/16r	  z161.22.64.0/18r	  z62.68.160.0/19r	  z154.160.0.0/12r	  z95.164.0.0/16r	  z88.83.0.0/19r	  z160.182.0.0/15r	  z197.149.192.0/18r	  z104.250.0.0/19r	  z105.235.224.0/20r	  z94.64.0.0/13r	  z168.234.0.0/16r	  z168.123.0.0/16r	  z197.214.80.0/20r	  z181.41.64.0/18r	  z113.252.0.0/14r	  z181.210.0.0/16r	  z93.136.0.0/13r	  z148.102.128.0/17r	  z84.0.0.0/14r	  z39.192.0.0/10r	  z87.32.0.0/12r	  z79.176.0.0/13r	  z5.62.80.0/20r	  z117.192.0.0/10rz	  z203.83.48.0/21r	  z37.236.0.0/14r	  z2.176.0.0/12r	  z82.221.0.0/16r	  z79.0.0.0/10r	  z87.244.64.0/18r	  z72.27.0.0/17r	  z176.29.0.0/16r	  z133.0.0.0/8r
  z105.48.0.0/12r
  z158.181.128.0/17r	  z36.37.128.0/17r
  z103.25.140.0/22r	  z197.255.224.0/20r}
  z198.167.192.0/19r
  z175.45.176.0/22r
  z175.192.0.0/10r	
  z37.36.0.0/14r	  z64.96.0.0/15r
  z2.72.0.0/13r
  z115.84.64.0/18r
  z178.135.0.0/16r~
  z24.92.144.0/20r
  z82.117.0.0/19r
  z112.134.0.0/15r
  z102.183.0.0/16r
  z129.232.0.0/17r
  z78.56.0.0/13r
  z188.42.0.0/16r
  z46.109.0.0/16r
  z41.252.0.0/14rB
  z105.128.0.0/11r:
  z88.209.64.0/18r9
  z37.246.0.0/16r>
  z178.175.0.0/17r
  z74.112.232.0/21r!
  z154.126.0.0/17r-
  z117.103.88.0/21r 
  z77.28.0.0/15r)
  z154.118.128.0/18rF
  z37.111.0.0/17r<
  z49.0.128.0/17r
  z60.246.0.0/16rZ
  z202.88.64.0/20r.
  z109.203.224.0/19r0
  z41.188.64.0/18r@
  z208.90.112.0/22r+
  z46.11.0.0/16r2
  z105.16.0.0/12r'
  z27.114.128.0/18r#
  z102.70.0.0/15r6
  z187.192.0.0/11r%
  z175.136.0.0/13rD
  z197.218.0.0/15rH
  z41.182.0.0/16r  z101.101.0.0/18rS
  z197.214.0.0/18rY
  z203.17.240.0/22rU
  z105.112.0.0/12rQ
  z186.76.0.0/15rN
  z145.96.0.0/11r[
  z84.208.0.0/13rL
  z36.252.0.0/15rJ
  z203.98.224.0/19rW
  z49.156.48.0/22rP
  z49.224.0.0/14r]
  z5.36.0.0/15rd
  z186.72.0.0/15rh
  z186.160.0.0/14r	  z123.50.64.0/18r  z124.240.192.0/19rj
  z49.144.0.0/13r_
  z39.32.0.0/11rn
  z83.0.0.0/11r
  z70.36.0.0/20rr
  z66.50.0.0/16rc
  z188.161.0.0/16rp
  z85.240.0.0/13ra
  z202.124.224.0/20rf
  z181.120.0.0/14rs
  z37.210.0.0/15ru
  z102.35.0.0/16rv
  z79.112.0.0/13r
  z93.86.0.0/15rx
  z5.136.0.0/13ry
  z41.186.0.0/16r
  z188.48.0.0/13r
  z202.1.160.0/19r
  z154.192.0.0/11r
  z102.120.0.0/13r
  z78.64.0.0/12r
  z8.128.0.0/10r
  z188.196.0.0/14r
  z78.98.0.0/15r
  z102.143.0.0/17r
  z89.186.32.0/19r
  z41.82.0.0/15r
  z154.115.192.0/18r
  z186.179.128.0/17r
  z105.235.208.0/21r
  z197.159.160.0/19r	  z168.243.0.0/16r
  z190.102.0.0/20r
  z
5.0.0.0/16r
  z41.84.224.0/19r
  z65.255.48.0/20r	  z154.68.128.0/19r
  z196.168.0.0/14rX   z171.96.0.0/13r
  z85.9.128.0/18r
  z27.96.24.0/21r
  z180.189.160.0/20r
  z95.85.96.0/19r
  z197.0.0.0/11r
  z175.176.144.0/21r
  z78.160.0.0/11r
  z186.44.0.0/15r
  z202.2.96.0/19r
  z120.96.0.0/11r
  z156.156.0.0/14r
  z37.52.0.0/14r
  z102.80.0.0/13r
  z	6.0.0.0/8r
  z167.56.0.0/13r
  z84.54.64.0/18r	  z212.77.0.0/19r
  z207.191.240.0/21r
  z186.88.0.0/13r
  z66.81.192.0/20r
  z146.226.0.0/16r
  z14.160.0.0/11r
  z202.80.32.0/20r
  z117.20.32.0/21r
  z202.4.32.0/19r
  z134.35.0.0/16r4
  z41.242.116.0/22r
  z41.0.0.0/11z102.144.0.0/13z102.177.192.0/18)r
  r
  c                    [        U5      S:X  a2  U R                  R                  UR                  5       5      nU(       d  g OUnUR	                  S5      u  p4[
        R                  " S[        R                  " U5      5      S   nUS[        U5      -	  -  n[        [        R                  " [
        R                  " S[        R                  " XV5      5      5      5      $ )Nr   r   z!Lr   r  )r   _country_ip_mapr  rH  r   structunpacksocket	inet_atonr  r   	inet_ntoapackr  randint)r[  code_or_blockr  addrpreflenaddr_minaddr_maxs          r   random_ipv4GeoUtils.random_ipv4  s    }"''++M,?,?,ABE  "EC(==v'7'7'=>qAzS\9:6##KKfnnX@AC D 	Dr   r   N)r   r   r   r   r
  re  r
  r   r   r   r   r
  r
    s\   qqoq 	oq 		q
 	q 	nq 	nq 	q 	q 	q 	nq 	q 	oq 	nq 	oq  	!q" 	n#q$ 	%q& 	'q( 	)q* 	l+q, 	-q. 	n/q0 	o1q2 	 3q4 	5q6 	7q8 	9q: 	o;q< 	o=q> 	o?q@ 	AqB 	oCqD 	oEqF 	GqH 	IqJ 	KqL 	oMqN 	oOqP 	 QqR 	SqT 	mUqV 	WqX 	YqZ 	[q\ 	]q^ 	o_q` 	aqb 	cqd 	eqf 	gqh 	iqj 	okql 	omqn 	loqp 	qqr 	nsqt 	uqv 	wqx 	nyqz 	o{q| 	o}q~ 	q@ 	AqB 	mCqD 	EqF 	mGqH 	oIqJ 	KqL 	MqN 	 OqP 	oQqR 	lSqT 	oUqV 	lWqX 	YqZ 	o[q\ 	]q^ 	_q` 	aqb 	ocqd 	neqf 	gqh 	 iqj 	kql 	 mqn 	noqp 	qqr 	sqt 	uqv 	wqx 	yqz 	{q| 	o}q~ 	 q@ 	mAqB 	oCqD 	nEqF 	oGqH 	nIqJ 	KqL 	MqN 	oOqP 	nQqR 	oSqT 	mUqV 	WqX 	nYqZ 	o[q\ 	m]q^ 	o_q` 	 aqb 	cqd 	eqf 	 gqh 	 iqj 	kql 	mqn 	noqp 	nqqr 	msqt 	uqv 	wqx 	yqz 	o{q| 	}q~ 	q@ 	AqB 	nCqD 	oEqF 	oGqH 	oIqJ 	KqL 	MqN 	oOqP 	QqR 	SqT 	UqV 	WqX 	nYqZ 	 [q\ 	o]q^ 	o_q` 	oaqb 	cqd 	 eqf 	gqh 	iqj 	nkql 	omqn 	oqp 	oqqr 	sqt 	uqv 	wqx 	oyqz 	{q| 	}q~ 	q@ 	AqB 	oCqD 	oEqF 	oGqH 	oIqJ 	KqL 	MqN 	oOqP 	mQqR 	oSqT 	UqV 	WqX 	 YqZ 	o[q\ 	n]q^ 	m_q` 	naqb 	ncqd 	eqf 	ogqh 	 iqj 	kql 	omqn 	ooqp 	oqqr 	nsqt 	nuqv 	owqx 	oyqz 	{q| 	}q~ 	q@ 	nAqB 	nCqD 	EqF 	nGqH 	IqJ 	KqL 	nMqN 	 OqP 	 QqR 	 SqT 	 UqV 	WqX 	YqZ 	l[q\ 	]q^ 	_q` 	aqb 	cqd 	oeqf 	ogqh 	oiqj 	 kql 	omqn 	noqp 	 qqr 	osqt 	ouqv 	owqx 	oyqz 	{q| 	n}q~ 	oq@ 	kAqB 	oCqD 	oEqF 	oGqH 	 IqJ 	oKqL 	MqN 	OqP 	oQqR 	SqT 	UqV 	oWqX 	oYqZ 	[q\ 	m]q^  aqOf D Dr   r
  c                 :   Sn[        U 5      n U S:  a*  [        R                  " SU S-  5      U-   nU S-	  n U S:  a  M*  [        [	        U5      5       H  nX#   S:w  d  M    O   SnSnX#S nUS:  a*  [	        U5      U-  (       a  U[	        U5      U-  -
  S-  U-   nU$ )zlong_to_bytes(n:long, blocksize:int) : string
Convert a long integer to a byte string.

If optional blocksize is given and greater than zero, pad the front of the
byte string with binary zeros so that the length is a multiple of
blocksize.
r   r   >Ir  r      N)r  r
  r
  r  r   )r   	blocksizer  r+  s       r   long_to_bytesr
    s     	AAA
a%KKa*n-1G a% 3q6]4: 
 	"A 1}Q)+Q)++w6:Hr   c           	          Sn[        U 5      nUS-  (       a  SUS-  -
  nSU-  U -   n X#-   n[        SUS5       H(  nUS-  [        R                  " SXUS-    5      S   -   nM*     U$ )z}bytes_to_long(string) : long
Convert a byte string to a long integer.

This is (essentially) the inverse of long_to_bytes().
r   r  r
  r  r
  )r   r  r
  r
  )r  accrE  extrar+  s        r   bytes_to_longr
    sy     CVFzVaZeOa1fa byFMM$AE
;A>> !Jr   c                 n    [        [        R                  " U SSS2   5      S5      n[        X1U5      nUS $ )a  
Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/

Input:
    data: data to encrypt, bytes-like object
    exponent, modulus: parameter e and N of RSA algorithm, both integer
Output: hex string of encrypted data

Limitation: supports one block encryption only
Nrv  r  r   )r  binasciihexlifypow)r  r3  moduluspayload	encrypteds        r   ohdave_rsa_encryptr  (  s9     (""4":.3GGw/I]r   c                     [        U 5      US-
  :  a  [        S5      e[        U[        U 5      -
  S-
  5       Vs/ s H  n[        R                  " SS5      PM     nnSS/UQSPU Q$ s  snf )z
Padding input data with PKCS#1 scheme

@param {int[]} data        input data
@param {int}   length      target length
@returns {int[]}           padded data
   z&Input data too long for PKCS#1 paddingr  r      r   )r   r6  r  r  r
  )r  rE  r   pseudo_randoms       r   pkcs1padr  9  su     4y6B;ABB5:6CI;MPQ;Q5RS5RV^^As+5RMSq+=+!+d++ Ts   !A'c                     U(       d  U (       d  [        S5      eU=(       d    SS U  nU (       a)  U [        U5      :w  a  [        SU  S[        U5       35      eU$ )Nz#Either table or n must be specified>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZzbase z exceeds table length )r6  r   )r   r  s     r   _base_n_tabler	  H  sV    >??VVXZYZ[EQ#e*_5#9#e*FGGLr   c                     [        X5      nU (       d  US   $ S[        U5      pCU (       a  X U-     U-   nX-  n U (       a  M  U$ )z$Convert given int to a base-n stringr   r  )r	  r   )r0  r   r  r  r  s        r   encode_base_nr  R  sL    !#EQxs5zD
Tz"V+k # Mr   c                     [        [        X5      5       VVs0 s H  u  p4XC_M	     nnnS[        U5      peU  H  nXV-  X$   -   nM     U$ s  snnf )z"Convert given base-n string to intr   )rG  r	  r   )rz  r   r  r5  r  r  r  s          r   decode_base_nr  _  sT    ,5mA6M,NO,N[UT[,NEOc%jD, M	 Ps   A	c                 J  ^ [         R                  " [        U 5      nUR                  5       u  p#pE[	        U5      n[	        U5      nUR                  S5      n0 mU(       a)  US-  n[        XC5      nXT   =(       d    UTU'   U(       a  M)  [         R                  " SU4S jU5      $ )Nr  r   z	\b(\w+)\bc                 ,   > TU R                  S5         $ r   r  )r  symbol_tables    r   r  %decode_packed_codes.<locals>.<lambda>v  s    <

1#>r   )r   r  PACKED_CODES_REra  r  r   r  r	  )r  r  obfuscated_coder  rX  symbolsbase_n_countr  s          @r   decode_packed_codesr  h  s    99_d+D,0KKM)O5t9DJEmmC GL

$U1%,^%C|\" %
 66> r   c                 h   ^^^ TS:X  a  U $ [        T5      mSR                  UUU4S jU  5       5      $ )Nr   r  c              3   h   >#    U  H'  nUT;   a  TTR                  U5      T-   T-     OUv   M)     g 7fr   )r5  )r  r   alphabetlshifts     r   r  caesar.<locals>.<genexpr>~  s;      A 67(](..#e+q01Is   /2)r   r   )r  r  r  r  s    ``@r   caesarr  z  s6    zHA77   r   c                     [        U SS5      $ )Nz^!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~/   )r  r  s    r   rot47r     s    !z|~r   c                     0 n[         R                  " SU 5       H$  u  p#UR                  S5      (       a  USS nX1U'   M&     U$ )Nz2(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)r  r   rv  )r   r  rz  )r   rl  r   r   s       r   parse_m3u8_attributesr"    sI    Djj!VX^_
>>#a)CS	 ` Kr   c                 &    U S:  a  X-	  $ U S-   U-	  $ )Nr   l        r   )r   r   s     r   urshiftr$    s    ax38=cK&7A%==r   c                    [         R                  S:X  a[  SU;  d   e[         R                  R                  U 5      (       d   e [	        U  SU 3S5       nUR                  U5        S S S 5        g S n[        [        [         SS 5      5      (       a  [         R                  nO^[        [        SS 5      S:X  a.  [        [        R                  5      S:  a  [        R                   nO[        (       a  [        R                  nU(       a   U" XU5        g [#        SS	/5      (       a  SO[#        S
S/5      (       a  S
OS nU(       d*  [%        S[&        R(                  S:w  a  S-   5      eS-   5      eUR+                  5       n [,        R/                  US
:X  a  USXU /OUSUSX /S[0        R2                  [0        R2                  [0        R2                  S9u  pxn	U	(       a  [        X5      eg ! , (       d  f       g = f! [         a%  n[        UR                  UR                  5      eS nAff = f! [         a%  n[        UR                  UR                  5      eS nAff = f! [         a%  n[        UR                  UR                  5      eS nAff = f)Nr6  r   r  setxattr_yt_dlp__identifierpyxattr)r   r  r   setfattrr  r
   z-hzfCouldn't find a tool to set the xattrs. Install either the "xattr" or "pyxattr" Python modules or the linuxz"xattr" binaryz7GNU "attr" package (which contains the "setfattr" tool)z-wz-nz-vT)r   r  r]  r  )ry   r   rz   existsr  r  r   r  r  strerrorcallabler  r&  r
   r  __version__r   r  r  r   r   r  r#  r^  ra  r  )
rz   r   r   r  r  r&  r  r   r]  rZ  s
             r   write_xattrr/    s?    
ww$#~~ww~~d####	:auot, - 	 HJ-..;;	-t	4		A **+y8yyH	>>	:T& 	 **{mDD:+GdV<<$ #u#&<<7#:{| 	|@y{| 	| LLNE6 %		-0G^S$D)#tSRVX]AdjoojooZ__ !* !^:
  44 S -, 	  	:$QWWajj99	:(  	:$QWWajj99	:"  6 !**556sg   G7 G&'G7 	H) >AI &
G40G7 4G7 7
H& H!!H&)
I3 II
J
% JJ
c                 \   [         R                  " SSS5      n[         R                  " SSS5      n[        R                  " SXC-
  R                  5      nU[         R
                  " U5      -   nU [        UR                  5      U[        UR                  5      U[        UR                  5      0$ )Ni  r   i  r#     r   )
r  rN  r  r
  r<  r  r   r?  r>  r@  )
year_fieldmonth_field	day_field
start_dateend_daterC  random_dates          r   random_birthdayr8    s    q!$JwwtR$H^^A 5;;<Fr||F33KC(()S**+3{' r   r  c                      [         R                   " 5        nUR                  U S45        UR                  5       S   sS S S 5        $ ! , (       d  f       g = f! [         a     g f = frR  )r
  bindgetsocknamer   )	interfacesocks     r   find_available_portr>    sP    ]]_IIy!n%##%a( __  s-   A &A	A 
AA A 
A%$A%z[InternetShortcut]
URL=%(url)s
z<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>URL</key>
	<string>%(url)s</string>
</dict>
</plist>
zV[Desktop Entry]
Encoding=UTF-8
Name=%(filename)s
Type=Link
URL=%(url)s
Icon=text-html
)r  desktopweblocc                    [         R                  R                  U 5      nSUR                  ;   a  [	        S5      eSnUR
                  (       ak  U[         R                  R                  UR
                  SS9-  nUR                  b.  US[         R                  R                  UR                  SS9-   -  nUS-  nX!R                  R                  S5      R                  5       -  nUR                  b+  UR                  S	:w  a  US[        UR                  5      -   -  n[         R                  R                  UR                  U[         R                  R                  UR                   S
S9[         R                  R                  UR"                  S
S9[         R                  R                  UR$                  SS9[         R                  R                  UR&                  SS945      $ )aq  
Converts an IRI (Internationalized Resource Identifier, allowing Unicode characters) to a URI (Uniform Resource Identifier, ASCII-only).

The function doesn't add an additional layer of escaping; e.g., it doesn't escape `%3C` as `%253C`. Instead, it percent-escapes characters with an underlying UTF-8 encoding *besides* those already escaped, leaving the URI intact.
[z"IPv6 URIs are not, yet, supported.r  z!$%&'()*+,~)safer   @idnaP   z!$%&'()*+,/:;=@|~z!$%&'()*+,/:;=?@{|}~z!#$%&'()*+,/:;=?@{|}~)r  r  r  r  r6  r  r  r  r  rg   r  r  r   r  r  
quote_plusrz   r  r  fragment)iri	iri_partsnet_locations      r   
iri_to_urirL    s    %%c*I
i=>>
 L**9+=+=N*SS)C&,,"4"4Y5G5Gn"4"]]]L&&--f5<<>>L~~!inn&:c)..111<<""			LL##INN9M#N LL##I$4$4;O#P LL##IOO:Q#RLL##I$6$6=U#V	XY Yr   c                 r    [         R                  S;   a"  S[        R                  R	                  U 5      -   $ U $ )N)ru   cygwin\\?\)r   r   ry   rz   abspath)rz   s    r   to_high_limit_pathrQ  +  s,    
||**277??4000Kr   z%sc                     [         R                  " U /[        U5      Q76 nU[        L a
  U(       d   U$ U[        U5      ;   a  U$ X%" U5      -  $ r   )r   r  r  r   )r   fieldtemplater  r   r   r   s          r   r  r  3  sM    

 
 
7x
7CJ&3 -08F3C,Cd3ir   c                 b    [         R                  " SSU 5      n [         R                  " SSU 5      $ )Na  (?x)
        (?:
            (?:
                chtbl\.com/track|
                media\.blubrry\.com| # https://create.blubrry.com/resources/podcast-media-download-statistics/getting-started/
                play\.podtrac\.com|
                chrt\.fm/track|
                mgln\.ai/e
            )(?:/[^/.]+)?|
            (?:dts|www)\.podtrac\.com/(?:pts/)?redirect\.[0-9a-z]{3,4}| # http://analytics.podtrac.com/how-to-measure
            flex\.acast\.com|
            pd(?:
                cn\.co| # https://podcorn.com/analytics-prefix/
                st\.fm # https://podsights.com/docs/
            )/e|
            [0-9]\.gum\.fm|
            pscrb\.fm/rss/p
        )/r  z^\w+://(\w+://)r  r  r  s    r   clean_podcast_urlrV  ;  s2    
&& " 3#C$ 66$eS11r   0123456789abcdefc                  4    [         R                  " SS S5      $ )Nz[xy]c                 >    [         [        R                  " SS5         $ )Nr   r  )
_HEX_TABLEr  r
  r   s    r   r  random_uuidv4.<locals>.<lambda>U  s    Zq"0E%Fr   z$xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxr  r   r   r   random_uuidv4r\  T  s    66'FHnoor   c                      [         R                  R                  U 5      nU(       a  [         R                  " USS9  g! [         a!  n[        U5      b  U" SU 35         S nAgS nAff = f)NT)exist_okzunable to create directory F)ry   rz   r|   makedirsr   r-  )rz   re  dnr|  s       r   make_dirra  X  s[    WW__T"KKT* I*3C59:s   ;> 
A)A$$A)c                      SSK Jn   [        R                  R	                  [        R                  R                  U " 5       S   5      5      $ )Nr    _get_variant_and_executable_pathr   )r  rd  ry   rz   r|   rP  rc  s    r   get_executable_pathre  d  s.    977??277??+K+Ma+PQRRr   c              #   v  #    [         R                  " S5      =(       d    [        S5      n[         R                  R	                  X5      v   [         R                  " S5      nU(       a!  [         R                  R	                  X 5      v   [         R                  R	                  [        S5      SU  35      v   g 7f)NXDG_CONFIG_HOMEz	~/.configappdata~r   )ry   getenvr   rz   r   )package_namexdg_config_homeappdata_dirs      r   get_user_config_dirsrn  j  s|     ii 12T6G6TO
'',,
55 ))I&Kggll;55 '',,(-<./A
BBs   B7B9c              #   P   #    [         R                  R                  SU 5      v   g 7f)Nz/etc)ry   rz   r   )rk  s    r   get_system_config_dirsrp  x  s     
'',,v|
,,s   $&c                  v    [         R                   " 5       [        R                  " S0 U D6R                  5       -   $ )zI
Returns TZ-aware time in seconds since the epoch (1970-01-01T00:00:00Z)
r   )r|  r  r  r%  )r   s    r   time_secondsrr  }  s*     99;//==???r   HS256)algr  c                   US;   d   SU S35       eS nS nUSS.nU(       a   SU;   a	  S	U;   a  UnOUR                  U5        U" U" U5      5      nU" U" U 5      5      n[        R                  " UR                  5       US
-   U-   [        R
                  5      n	U" U	R                  5       5      n
US
-   U-   S
-   U
-   R                  5       $ )N)rs  zUnsupported algorithm "r  c                 H    [         R                  " U SS9R                  5       $ )N)ru  r   )
separators)r}   r  rg   )r   s    r   jwt_json_bytes"jwt_encode.<locals>.jwt_json_bytes  s    zz#*5<<>>r   c                 L    [         R                  " U 5      R                  S5      $ )N   =)r  urlsafe_b64encoder  )
bytestrings    r   jwt_b64encode!jwt_encode.<locals>.jwt_b64encode  s    ''
3::4@@r   JWT)rt  typrt  r     .)r  hmacnewrg   hashlibsha256digestr  )payload_datar   rt  r  rx  r~  header_data
header_b64payload_b64r  signature_b64s              r   
jwt_encoder    s    *> 7uA>>?A K G 0!Kw'~k:;J| <=K 	zD0;>OA!!((*-M+d2]BJJLLr   c                     U R                  S5      u  pn[        R                  " [        R                  " U S35      5      $ )Nr   z===)r   r}   r!  r  urlsafe_b64decode)jwt_header_b64r  _signature_b64s       r   jwt_decode_hs256r    s5    /2yy~,Kn::f..+c/BCDDr   c                     [         R                  S:X  a  [        R                  (       d  gO[         R                  " S5      (       d  g U R                  5       $ ! [         a     gf = f)Nr6  FTERM)ry   r   r   r   rj  isattyrQ  )r  s    r   r  r    sS    	ww$$$ %YYv}} s   	A 
A&%A&c                     [        5       S:  a  gSSKn SSKn SSKnSnU R                  " SSS9n[
        R                  " S[
        R                  5      n U R                  R                  UR                  " U5      5      nU R                  R                  5       nUR                  XPR                  " U5      5      nU(       d  [        S	5      eUR                  XPR                  R                  UR                   U-  5      5      nU(       d  [        S
5      e [
        R"                  " U5        S[$        l        [&        R)                  5         g! [
        R"                  " U5        f = f)z(Ref: https://bugs.python.org/issue30075 )r  r   iZ)  Nr   r  r  F)use_last_errorzCONOUT$zGetConsoleMode failedzSetConsoleMode failedT)r  r  ctypes.wintypesr  WinDLLry   r  r  r  r  r  r  GetConsoleModebyrefrh   SetConsoleModer   r"  r   r  cache_clear)r  r  "ENABLE_VIRTUAL_TERMINAL_PROCESSINGdllr  h_outdw_original_modesuccesss           r   windows_enable_vt_moder    s   ~-)/&
--
5
9CWWY		*F&&v';';F'CD!??002$$ULL9I,JK344$$UOO,A,A""%GG-I J344  	 O++- 	s   CE E%z	\[[^m]+mc                 .    [         R                  SU 5      $ r  )_terminal_sequences_rer	  r  s    r   r  r    s    !%%b&11r   c                     [        SU -  5      $ )Nrz  r  )numbers    r   number_of_digitsr    s    tf}r   r  )r{  	from_dictc           	      t   ^ Tb  U4S jU 5       nU R                  [        [        [        S U5      5      5      $ )Nc              3   d   >#    U  H%  n[         R                  " T[        U5      5      v   M'     g 7fr   )r   r  r  )r  r  r  s     r   r   join_nonempty.<locals>.<genexpr>  s%     Q&Q)((HQK@@&s   -0)r   r  r   r  )r{  r  r   s    ` r   r  r    s0    Q&Q::c#vdF3455r   c                   ^ Sm[        U4S jU  5       SS9nUS   (       d  U$ U Vs/ s HJ  n[        S[        R                  " U[	        US   5      US   5      0[        [        TU5      5      U5      PML     sn$ s  snf )a  
Find the largest format dimensions in terms of video width and, for each thumbnail:
* Modify the URL: Match the width with the provided regex and replace with the former width
* Update dimensions

This function is useful with video services that scale the provided thumbnails on demand
r  c              3   P   >^#    U  H  m[        U4S  jT 5       5      v   M     g7f)c              3   X   >#    U  H  nTR                  U5      =(       d    S v   M!     g7fr  r  )r  r*  r1  s     r   r  Ascale_thumbnails_to_max_format_width.<locals>.<genexpr>.<genexpr>  s     .1swwqzQs   '*N)r  )r  r1  _keyss    @r   r  7scale_thumbnails_to_max_format_width.<locals>.<genexpr>  s     B'3..	.	.'s   "&)r   r   r  r   r  )rh  r  r   r	  r   rM  rt  )formats
thumbnailsurl_width_remax_dimensionsr:  r  s        @r   $scale_thumbnails_to_max_format_widthr    s      EB'BN !
 $	 $I 	BFF<^A->)?5AQRSUN+,i	9 $	  s   AA<c                     U (       d  g[         R                  " SU 5      nU(       d  g[        UR                  S5      5      [	        UR                  S5      5      [	        UR                  S5      5      4$ )zBParse value of "Range" or "Content-Range" HTTP header into tuple. )NNNz bytes[ =](\d+)-(\d+)?(?:/(\d+))?r   r   r  )r   r  r  r  r  )r  crgs     r   parse_http_ranger    sS    
))7
?Csyy|k#))A,7SYYq\9RRRr   c                     U (       a*  [         R                  S:X  a  SOSn[        SU  SU S35        [        R                  $ )Nr6  zCtrl+ZzCtrl+DzReading z from STDIN - EOF (z
) to end:
)ry   r   r  r   r  )whateofs     r   
read_stdinr    s8    ''T/hxxv%8[IJ99r   c                    [          H*  u  pU R                  U5      (       d  M  U[        U5      4s  $    U R                  SS5      n [        R
                  " SU 5      nU(       a!  UR                  S5      R                  5       S4$ SS4$ )zB
Detect the text encoding used
@returns (encoding, bytes to skip)
r
  r   s   (?m)^#\s*coding\s*:\s*(\S+)\s*$r   Nr   )r  rz  r   r  r   r   r  r  )r  r  r  r  s       r   determine_file_encodingr    sx     ??3C=   <<s#D887>D%)4::a=!Q66tQ66r   c                       \ rS rSrSrSrSrSrSS jrSS jr	S r
S r\/ 4S j5       r\S	 5       rSS
.S jr\S 5       rS rS rSrg)Configi!  NFc                 N    XsU l         U l        [        5       / sU l        U l        g r   )r  labelr   _loaded_pathsconfigs)r  r  r  s      r   r  Config.__init__'  s#    "(TZ+.5"(DLr   c                 d    U R                   (       a   eXsU l        U l        U R                  5       $ r   )_Config__initializedown_argsr  load_configs)r  r   r  s      r   initConfig.init+  s.    %%%%'+$t}  ""r   c                 ,   SnU R                   (       as  [        R                  R                  U R                   5      n[        R                  R	                  U5      nX R
                  ;   a  gU R
                  R                  U5        SU l        U R                  R                  U R                  5      u  p4U R                  U l        UR                  =(       d    /  GH5  nUS:X  aZ  X R
                  ;   a  M  U R
                  R                  U5        U R                  [        R                  " [!        S5      SS9SS9  Md  [        R                  R#                  U[%        U5      5      n[        R                  R'                  U5      (       a   [        R                  R#                  US	5      n[        R                  R)                  U5      (       d  U R                  R+                  S
U S35        U R                  U R-                  U5      U5        GM8     g)Nr  FTr  optionscommentsr  r  zyt-dlp.confzconfig location z does not exist)r  ry   rz   realpathr|   r  r  r  r  parse_known_argsr  parsed_argsconfig_locationsappend_configr  r   r  r   r  isdirr+  error	read_file)r  	directorylocationoptsr   s        r   r  Config.load_configs0  s   	==ww''6H1I---""8,!++..t}}===--33H3111""&&x0""5;;z)/Dt#T\c"dww||I{8/DEHww}}X&&77<<-@77>>(++!!$4XJo"NOt~~h7B 4 r   c                 B   [        U R                  SU R                  (       a  SU R                   S3OSSS9n[        U R                  S L=(       a6    US   R	                  5        USS   SU R                  U R                  5       3/S	 U R                   5       Q7S
S06$ )Nconfigr  r  rd  r  r   r   r  c              3   R   #    U  H  nS U 3R                  S S5      SS v   M     g7f)re  z
| r   Nr  )r  r   s     r   r  !Config.__str__.<locals>.<genexpr>Q  s*     G,Q1#htV,QR0,s   %'r{  re  )r  r  r  r  rH  hide_login_infor  )r  r  s     r   ry  Config.__str__K  s    JJ$--Admm_A"6R MM%qU1X^^-=,>uQRykDL`L`aeananLoKp*qG$,,G  	r   c                      [        U S5      n [        UR                  S5      5      u  p4UR	                  U[
        R                  5         UR                  5       R                  U=(       d
    [        5       5      n[        R                  " USS9n UR                  5         U$ ! [         a    Us $ f = f! [         a    S n Nyf = f! [         a  n[        SU  SU 35      eS nAff = f! UR                  5         f = f)Nr  i   Tr  zUnable to parse "z": )r  r   r  readseekr  SEEK_SETr  rj   r  r   rh   r6  r"  )r  r   optionfr  skipcontentsresr|  s           r   r  Config.read_fileT  s    	8T*G	/S0ABICLLr{{+	||~,,S-G4E4GHH++h6C MMO
  	N	
  	C	  	E0
#cUCDD	E MMOsG   B$ <B6 AC $B32B36CC
C(C##C((C+ +C=c                   ^ 1 Skn[         R                  " SSR                  S U 5       5      -   S-   5      mU4S jn[        [	        X 5      5      n [        U 5       H'  u  p4XA;   d  M  US-   [        U 5      :  d  M   SXS-   '   M)     U $ )	N>   -p-u
--password
--username--ap-password--ap-username--video-passwordz	^(?P<key>r  c              3   N   #    U  H  n[         R                  " U5      v   M     g 7fr   r:  )r  pos     r   r  )Config.hide_login_info.<locals>.<genexpr>l  s     1W,B"))B--,r=  z)=.+$c                 `   > TR                  U 5      nU(       a  UR                  S5      S-   $ U $ )Nr   z=PRIVATE)r   r  )or  eqres     r   	_scrub_eq)Config.hide_login_info.<locals>._scrub_eqn  s+    

1Awwu~
22r   r   PRIVATE)r   r  r   r  r  rG  r   )r  PRIVATE_OPTSr  r  optr  s        @r   r  Config.hide_login_infoi  s}    uzz+1W,1W)WX[bbc	 C	()!$HC"sQwT': )1W ( r   r  c                    [        U 5      " U R                  U5      nU R                  Ul        UR                  " U6 (       a  U R                  R                  U5        g g r   )r  r  r  r  r  r   )r  r  r   r  s       r   r  Config.append_config{  sG    dDKK/#11;;LL' r   c              #      #    [        U R                  5       H  nUR                   S h  vN   M     U R                  =(       d    /  S h  vN   g  N& N7fr   )r  r  all_argsr  )r  r  s     r   r  Config.all_args  sA     t||,F&& -##)r)) ')s!   (AA AAAAc                 P    U R                   R                  " U R                  40 UD6$ r   )r  r  r  )r  r   s     r   r  Config.parse_known_args  s     {{++DMMDVDDr   c                 L    U R                   R                  U R                  5      $ r   )r  
parse_argsr  r  s    r   r  Config.parse_args  s    {{%%dmm44r   )__initializedr  r  r  r  r  r  r  r   r  )r   r   r   r   r  r  r  r  r  r  r  ry  r  r  r  r  r  r  r  r  r   r   r   r   r  r  !  s~    HKHM5#
6 $&  (  " *. ( * *
E5r   r  c                      [         R                  R                  [        [        R
                  U 5      5       VVs0 s H  u  pUR                  5       U_M     snn$ s  snnf )zLMerge dicts of http headers case insensitively, prioritizing the latter ones)r  chainfrom_iterabler  rM  rS  r  )r  r*  r  s      r   merge_headersr    sC    %.__%B%B3tzzSXCY%Z[%ZTQAGGIqL%Z[[[s   Ac                 v   ^ ^ [         R                  " T 5      m[        R                  " T 5      U U4S j5       nU$ )zCache a methodc                 4  > TR                   " U /UQ70 UD6nUR                  5         [        UR                  R	                  5       5      SS  n[        U 5      R                  S0 5      R                  TR                  0 5      nXE;  a  T" U /UQ70 UD6XT'   XT   $ )Nr   _cached_method__cache)r:  apply_defaultsr  	argumentsr   r  r>  r   )r  r   r   
bound_argsr   cacher  r   s         r   wrappercached_method.<locals>.wrapper  s    ^^D:4:6:
!!#J((//12126T
%%&=rBMMajjZ\]41$1&1EJzr   )r   r   r   r   )r  r  r   s   ` @r   cached_methodr    s5    !!!$I__Q  Nr   c                   D   ^  \ rS rSrSrS	U 4S jjrSS.S jrS rSrU =r	$ )
classpropertyi  z7property access for class methods with optional cachingc                 d   > U(       d  [         R                  " U /UQ70 UD6$ [        TU ]  U 5      $ r   )r   r   rq  __new__)r[  r   r   r   rr  s       r   r  classproperty.__new__  s0    $$S:4:6::ws##r   F)r  c                h    [         R                  " X5        Xl        U(       a  0 U l        g S U l        g r   )r   update_wrapperr   r  )r  r   r  s      r   r  classproperty.__init__  s$      ,	!btr   c                     U R                   c  U R                  U5      $ X R                   ;  a  U R                  U5      U R                   U'   U R                   U   $ r   r  r   )r  r   r[  s      r   __get__classproperty.__get__  sI    ;;99S>!##yy~DKK{{3r   r%  r   )
r   r   r   r   r1  r  r  r&  r   r  r  s   @r   r  r    s    A$
 ', ,
   r   r  c                   :    \ rS rSrSS jrS r\S 5       rS rSr	g)	rY  i  Nc                 L    [         R                  " X5        XsU l        U l        g r   )r   r"  r   _function_with_repr__repr)r  r   r[  s      r   r  function_with_repr.__init__  s      ,!%	4;r   c                 &    U R                   " U0 UD6$ r   )r   rS  s      r   rh  function_with_repr.__call__  s    yy$)&))r   c                 *    [         R                  " XS9$ )N)r[  )r   r   )r[  r[  s     r   rZ  function_with_repr.set_repr  s      22r   c                     U R                   (       a  U R                   $ U R                  R                   SU R                  R                   3$ r0  )r*  r   r   r   r  s    r   rv  function_with_repr.__repr__  s:    ;;;;))&&'q)?)?(@AAr   )__reprr   r   )
r   r   r   r   r  rh  re  rZ  rv  r   r   r   r   rY  rY    s&    -* 3 3Br   rY  c                   .    \ rS rSrSrS r\S 5       rSrg)	Namespacei  zImmutable namespacec                 H    [        U R                  R                  5       5      $ r   )r  __dict__r   r  s    r   r  Namespace.__iter__  s    DMM((*++r   c                 6    U R                   R                  5       $ r   )r6  rS  r  s    r   items_Namespace.items_  s    }}""$$r   r   N)	r   r   r   r   r1  r  r  r9  r   r   r   r   r4  r4    s    , % %r   r4  )rn  rh  rj  rd  r_  re  )	3g2r\  f4vmk3ddivxmpgrg  ri  rm  )	aiffalacrx  rr  rt  rs  r{  r  r|  )rw  aperl  f4af4br  r  ogaogxspxr  wmar  )r  r  r  )mhtml)srtvttasslrc)f4frp  rb  smilro  )common_videor1  common_audioaudior  storyboards	subtitles	manifestsc                   4  ^  \ rS rSrSr\" / SPSPSPSPSPSPS	PS
PSP\R                  QSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPS PS!PS"P\R                  QS#PS$PS%PS&PS'PS(PS)PS*PS+PS,PS-PS.PS/PS0PS1PS2PS3PS4P\R                  QS5PS6PS7PS8PS9PS:PS;PS<PS=PS>PS?PS@PSAPSBPSCP\R                  QSDPSEPSFPSGPSHPSIPSJPSKPSLPSMPSNPSOPSPP\R                  Q\R                  QSQPSRPSSPSTPSUPSVP5      rU 4SW jr\SXSY.SZ j5       rS[rU =r$ )\r  i  z
Mitigation exception for uncommon/malicious file extensions
This should be caught in YoutubeDL.py alongside a warning

Ref: https://github.com/yt-dlp/yt-dlp/security/advisories/GHSA-79w7-vh3h-8g4j
r8  r}   metar*  r  tempuncutunknown_videoytdlasxr  m2tm2tsm2vm4srk  mp2vr  mper`  mpeg1mpeg2mpeg4mxfogmqtr  swfr^  vidvobrf  3gaac3adtsaifaudtsr  r_  rz  modmpgamp1mp2r  mpar~  shnxmr  r  r  heicr  imagejfifr  jper  jxlr  r  r  r  r  r  ismtjson3r  sccsrv1srv2srv3ssar  r  r  r?  rq  ru  sbvr  r@  c                8   > [         TU ]  SU< 35        Xl        g )Nzunsafe file extension: )rq  r  	extension)r  r  rr  s     r   r  _UnsafeExtensionError.__init__T  s    29-@A"r   Fr  c                   Uc  g SU;   d  SU;   a  U " U5      eU(       dC  UR                  S5      u    p4US:X  a  S=pUR                  5       U R                  ;  a  U " U5      eU$ )Nr   r  r   binrZ  )r*  r  ALLOWED_EXTENSIONS)r[  r  r  r   lasts        r   r  (_UnsafeExtensionError.sanitize_extensionX  sn    )ty0i. "--c2JAqu}#22	zz|3#9#99)n$r   )r  )r   r   r   r   r1  	frozensetMEDIA_EXTENSIONSr1  rR  r  rT  rU  rS  r  r  re  r  r   r  r  s   @r   r  r    s    # f$f$ 	f$ 		f$
 	f$ 	f$ 	f$ 	f$ 	f$ 	f$ 
		f$ 	f$ 	f$  	!f$" 	#f$$ 	%f$& 	'f$( 	)f$* 	+f$, 	-f$. 	/f$0 	1f$2 	3f$4 	5f$6 	7f$8 	9f$: 	;f$< 	=f$> 	?f$@ 	Af$B 	Cf$D 	Ef$F 	Gf$H 	If$N 
		Of$P 	Qf$R 	Sf$T 	Uf$V 	Wf$X 	Yf$Z 	[f$\ 	]f$^ 	_f$` 	af$b 	cf$d 	ef$f 	gf$h 	if$j 	kf$l 	mf$n 	of$p 	qf$r 	sf$x 
	$	$yf$z 	{f$| 	}f$~ 	f$@ 	Af$B 	Cf$D 	Ef$F 	Gf$H 	If$J 	Kf$L 	Mf$N 	Of$P 	Qf$R 	Sf$T 	Uf$V 	Wf$\ 
	#	#]f$^ 	_f$` 	af$b 	cf$d 	ef$f 	gf$h 	if$j 	kf$l 	mf$n 	of$p 	qf$r 	sf$t 	uf$v 	wf$| 
	#	#}f$~ 
	%	%f$@ 	Af$B 	Cf$D 	Ef$F 	Gf$H 	If$J 	Kf$ fP# 9>  r   r  c                       \ rS rSrSrSu  rrS rS r\	S 5       r
\
R                  S 5       r
S r\S	S	S
.S j5       rSrg	)RetryManagerij  zUsage:
for retry in RetryManager(...):
    try:
        ...
    except SomeException as err:
        retry.error = err
        continue
r  c                 \    U=(       d    SU l         [        R                  " U40 UD6U l        g r   )retriesr   r   error_callback)r  _retries_error_callbackr   s       r   r  RetryManager.__init__u  s%    }1'//J6Jr   c                 f    U R                   [        L=(       a    U R                  U R                  :*  $ r   )_errorr   r  r  r  s    r   _should_retryRetryManager._should_retryy  s#    {{*,M1MMr   c                 B    U R                   [        L a  g U R                   $ r   )r  r   r  s    r   r  RetryManager.error|  s    ;;*${{r   c                     Xl         g r   )r  )r  r   s     r   r  r    s    r   c              #   2  #    U R                  5       (       a~  [        U l        U =R                  S-  sl        U v   U R                  (       a1  U R	                  U R                  U R                  U R
                  5        U R                  5       (       a  M}  g g 7frZ  )r  r   r  r  r  r  r  s    r   r  RetryManager.__iter__  sd       ""#DJLLALJzz##DJJdllK   ""s   BBBN)r  rp   c          
         X:  a1  U(       a(  US:  a  U" U  SUS-
   S35      $ U" [        U 5      5      $ U eU(       d  U" U 5      $ [        U [        5      (       a2  [        [	        U R
                  5      =(       d    U R                  S5      n U" U  S[        USS5       SU S	U S
35        [        U5      (       a  [        U" US-
  S95      OUnU(       a$  U" SUS S35        [        R                  " U5        gg)z&Utility function for reporting retriesr   z. Giving up after z retriesr   z
. RetryingNz %sz (r   z)...)r   z	Sleeping z.2fz seconds ...)r   r   r   r  r  r  r  r  r-  r,  r|  sleep)	r  rX  r  
sleep_funcrl  r  r  rp   delays	            r   report_retryRetryManager.report_retry  s     ?MRUVYus"4UQYKxHIi\abefgbh\iiG7N>**;qww/=1::sCAs*\&$>?r%'RVWX:B::N:Nj51956T^9U3K|45JJu r   )r  r  r  r  )r   r   r   r   r1  r  r  r  r  r  r  setterr  r  r  r   r   r   r   r  r  j  sj     OGVKN  
 \\ L IMVZ  r   r  c                 z    [        U [        5      (       a  U OU R                  5       nUR                  5        SU 3$ )Nrd  )r   r   ie_keyr  )r  r  r  s      r   make_archive_idr    s3    b#&&RBIIKFllnQxj))r   c                     US:  a  US:  d   eU b  [        U 5      X-   ::  a  U $ U S US-
    SU(       a  X* S   3$ S 3$ )Nr  r   rD  r  r  )r  leftrights      r   truncate_stringr    s[    !8
""yCFdl*	l^3Uqz;<<;<<r   )	use_regexr  c                   SU;   d   S5       e[        U=(       d    / 5      nU  GH  nUR                  S5      nU(       a  USS  nXQ;   aI  U(       d  X   O1X    Vs/ s H"  owR                  S5      (       a  USS  OSU 3PM$     snn[        XQUS9nMo  U(       a<  [        [        R
                  " U[        R                  5      R                  US   5      OXQS   ;   a  U/OS nUc  [        U5      eU(       a*  U H"  n	X;   d  M
  UR                  U	5        X;   a  M  M$     M  UR                  U5        GM     [        U5      $ s  snf )NrI  z"all" alias is requiredr  r   )r  )r  rz  orderedSet_from_optionsr  r   r  IrM  r6  r   r  r  )
r  
alias_dictr  r  	requestedr   discardr+  currentr  s
             r   r  r    s9   J9 99U[b!I..%ab'C)0*/AK7RAPAc**!"!A377RC 0yQIQZ6"**S"$$/99:e;LM!$5(9!9t 	?S/!'$$T* '   W%- 0 i  %7Rs   )Ec            
       r   \ rS rSrSrSrSrSr0 SSS/ S	QS
._SSS/ SQS
._SSSS/ SQS._SSSS/ SQS._SSSSSS._SSSSSSS._SSSS S!S"._S#SSS$S%S& S'._S(SS S)._S*SSS+S,S-._S.SS+S,S/._S0S1S2S3S4._S5S1S3S6._S7S8S90_S:S9S;S<._S=S>S?S<._S@S8SA0_0 SBS8SA0_SCS8SA0_SDSASES<._SFS8SA0_SGS8SA0_SHS8SA0_SIS8SA0_SJS1SKS3S4._SLSMS%SN._SOS$SPSASQ SR._SSS$STS9SU SR._SVSMSWSN._SXS$SYSZ S[._S?S\S=SN._S]S\S(SN._S2S\S0SN._SKS\SJSN._E0 SS\SSN._S;S\S:SN._SES\SDSN._S^S\SXSS_._S`S\SXSS_._SaS\SVSS_._SbS\SOSS_._ScS\SFSS_._SdS\SGSS_._SeS\SHSS_._SfS\SCSS_._SgS\SSSS_._ShS\SISS_._SS\SSS_._SS\SSS_._SiS\SSS_._SjS\SSS_._ES\S*SS_.S\S*SS_.S\S.SS_.S\S.SS_.S\S(SS_.S\S(SS_.Sk.ErSl r	Sm r
SwSn jrSo rSp rSq rSr r\Ss 5       rSt rSurgv)xFormatSorteri  zT *((?P<reverse>\+)?(?P<field>[a-zA-Z0-9_]+)((?P<separator>[~:])(?P<limit>.*?))?)? *$)hidden
aud_or_vidhasvidie_prefr  qualityr  fpshdr:12r  channelsr  sizer  asrprotor  hasaudsourcer   )r  r  r  r  r  r  r  r  r  zvcodec:vp9.2r  r  r  r  r  r  r  r  r  r   )r  r  r  tbrfilesizevbrr  r  r  vextabraextr  	fs_approxr  r   r  orderedT)zav0?1z
vp0?9\.0?2zvp0?9[hx]265|he?vc?z[hx]264|avczvp0?8z	mp4v|h263r  r  Nr  )r  r  orderr  )z[af]laczwav|aiffr  z
vorbis|oggrw  zmp?4a?rs  zac-?4z	e-?a?c-?3zac-?3rq  r  Nr  r  r  )r  z(hdr)?12z
(hdr)?10\+z(hdr)?10hlgr  sdrN)r  r  rS  r  r  r  )
z	(ht|f)tpsz	(ht|f)tp$zm3u8.*z.*dashwebsocket_fragzrtmpe?r  zmms|rtspzws|websocketf4r  	video_ext)r_  rd  re  rh  r  r  )re  r_  rd  rh  r  r  )r  rS  r  
order_freer  	audio_ext)rr  rw  rs  r{  r  web[am]r  r  )r{  r  r  rs  rr  rw  r  r  )r  r  rS  r  r  r  F	extractori)visibleforcedr  rh  r  multipler  c                 8    [        [        S U  5       5      5      $ )Nc              3   *   #    U  H	  oS :g  v   M     g7f)r  Nr   )r  r  s     r   r  (FormatSorter.<lambda>.<locals>.<genexpr>  s     5N2a6k2r  )r  r  r_  s    r   r  FormatSorter.<lambda>  s    c#5N25N2N.Or   )r  r  r  rS  functionr  )priorityr  r  boolean)r  )r  rS  r  not_in_listr  )rS  r  r  r  r-  language_preferencerv  )convertrS  r   r  )r  r   r  r  r  r  filesize_approx)r  rS  r   rz  	format_idr  
float_noner  r  r  audio_channelsr  r  r  r  r  source_preferencecodeccombined)r  rS  r  )r  r  r  c                 .    [        [        S U 5      S 5      $ r   nextr  r  s    r   r  r    s    d6$+;T&Br   )r  rS  r  r  r  )r  r  c                 .    [        [        S U 5      S 5      $ r   r  r  s    r   r  r    s    VD"-=t(Dr   r  )r  r  r  )r  r  c                 *    [        [        S U 5      SS9$ )Nr   r  )rR  r  r  s    r   r  r    s    s6$+;Q'Gr   )r  rS  r  alias
preference	dimension)r  rS  
deprecated
resolutionr  bitratetotal_bitratevideo_bitrateaudio_bitrate	frameratefilesize_estimate
sampleratevideo_codecaudio_codec)r1  	has_videorR  	has_audior  extractor_preferencec                     Xl         / U l        U R                  U R                   R                  U5        UR                  R	                  S5      (       a&  U R                  U R                   R                  5        g g )Nverbose)ro  _orderevaluate_paramsr  r  print_verbose_infowrite_debug)r  ro  field_preferences      r   r  FormatSorter.__init__*  sW    TXX__.>?::>>)$$##DHH$8$89 %r   c                 x   XR                   ;  a5  US;   a  gU R                  R                  SU S35        0 U R                   U'   U R                   U   nX#;  a_  UR                  S5      nUS:X  a  US:X  a  SO
US	;   a  U4OUnO0US
:X  a  US:X  a  SO
U(       a  SOSnOSS/ SS.R                  U5      nXSU'   X2   $ )N)r  r  FzUsing arbitrary fields (zI) for format sorting is deprecated and may be removed in a future versionr  rS  r  r  )r  r  r  r  r  float_stringr  Tr   )r  r  r  r  )settingsro  deprecated_featurer  )r  rS  r   prop_objtype_r   s         r   _get_field_settingFormatSorter._get_field_setting1  s    %,,HH''*B5' J\ )\ ]#%DMM% =='LL(Eg~*/;*>,PUYqPqUHw|	!%*i%7'u^Zb#*tbY`aeefij#SM}r   c                    Uc	  U(       d  g OUR                  5       nU R                  US5      nUS:X  a  g US:X  a  U$ US:X  a  [        U5      $ US:X  a  [        U5      $ US:X  a  U R                  =(       a    U R                  US5      =(       d    U R                  US5      nU R                  US5      n[        U5      nS	U;   a  UR                  S	5      OUS
-   nU(       aE  UbB  [        U5       H/  u  pU
(       d  M  [        R                  " X5      (       d  M+  Xy-
  s  $    Xx-
  $ XrU;   a  UR                  U5      -
  $ U-
  $ UR                  5       (       a  [        U5      $ SU R                  U   S'   U$ )Nr  r  rz  r  r  r  r  r  r  r   )r  r  r,  rI  _use_free_orderr   r5  rG  r   r   	isnumericr-  r  )r  rS  r   convert_none
conversion
order_listr  list_length	empty_posr+  r  s              r   _resolve_field_value!FormatSorter._resolve_field_valueD  s   =   KKME,,UI>
!!L<' ''7"u%%7".._43J3J5R^3_  Ldhd{d{  }B  DK  eLJ//w?Ij/K02j0@
((,kTUoIU. )* 5HAu%!7!7*. !6 #.."*ATj&6&6u&=ddZcdd  U|#2:e$Y/r   c           	        ^  UR                  SS5      T l        UR                  S/ 5      T l        UT l        U 4S jn[	        U 4S jT R
                   5       5      UR                  SS5      (       a
  [	        5       O[	        U 4S jT R
                   5       5      -   [	        T R                  5      -   [	        U5      -   T R
                  -   nU GH  n[        R                  " T R                  U5      nUc  [        SU S	35      eUR                  S
5      nUc  MM  T R                  US5      S:X  aL  UT R                  US
5      pxT R                  US5      (       a"  T R                  R                  SU SU S35        UR                  S5      S Ln	UR                  S5      S:H  n
UR                  S5      nUS LnT R                  US5      S:H  nU=(       a     U=(       a    T R                  US5      (       + nU(       a  T R                  US
5      OU4nU(       a  UR                  S5      OU(       a  U4O	[	        5       n[        U5      n[!        U5       H.  u  nnU" UXUU:  a  UU   OU(       a  U(       d  US   OS 5        M0     GM     g )Nprefer_free_formatsFformat_sortc                 4  > U R                  5       n U TR                  ;   a  g TR                  R                  U 5        TR                  X5      nUUc  SOUUUS.nU TR                  ;   a  TR                  U    R                  U5        g UTR                  U '   g )NF)r  closest
limit_textrO  )r  r  r   r  r  r  )rS  r  r"  r#  rO  r  r  s         r   add_item.FormatSorter.evaluate_params.<locals>.add_itemk  s    KKME#KKu%--e@E"$)M5w(	 D
 %e$++D1'+e$r   c              3   Z   >#    U  H   nTR                  US 5      (       d  M  Uv   M"     g7f)r  Nr  r  rS  r  s     r   r  /FormatSorter.evaluate_params.<locals>.<genexpr>|  s#     ^\ET5L5LUT\5]%%\   +	+format_sort_forcec              3   Z   >#    U  H   nTR                  US 5      (       d  M  Uv   M"     g7f)r  Nr'  r(  s     r   r  r)  ~  s$     ilUd>U>UV[]g>h55lr*  zInvalid format sort string "z" given by extractorrS  r  r  r  zFormat sorting alias zB is deprecated and may be removed in a future version. Please use z insteadr  r  ri  rO  r  
same_limitr   r   )r  r  
_sort_user_sort_extractorr  r   r   r   r  r   r  r  ro  r  r   r   rG  )r  r  sort_extractorr$  	sort_listr  r   rS  r  r  r"  r#  	has_limithas_multiple_fieldshas_multiple_limitsfieldslimitslimit_countr+  r  s   `                   r   r  FormatSorter.evaluate_paramsf  sc   %zz*?G **]B7-	," ^T\\^^ **%8%@@uwidlliik DOO$% (-^'<= @D||L 	 DHHTZZ.E}$'CD6I]%^__KK(E}&&uf5@$d&=&=eW&Mu**5,??HH//2Gw O^^c]ddl1n okk),D8Gkk+.#5GW-J"$.I"&"9"9%"HJ"V"+"x0C"xDLcLcdikwLxHx@ST,,UG<Z_YaF.AZ%%c*Xa
}glgnFf+K#F+AG&'+o+4=PfQi"$ ,/ r   c                    U R                   (       a0  U" SR                  SR                  U R                   5      5      5        U R                  (       a0  U" SR                  SR                  U R                  5      5      5        U" SR                  SR                  U R                   Vs/ s H  o R                  US5      (       d  M  SR                  U R                  US5      (       a  SOS	UU R                  US
5      bL  SR                  U R                  US5      (       a  SOSU R                  US
5      U R                  US5      5      OS	5      PM     sn5      5      5        g s  snf )NzSort order given by user: {}rs  z!Sort order given by extractor: {}zFormats sorted by: {}r  z{}{}{}r  r  r  r#  z{}{}({})r"  ri  r   rO  )r.  r  r   r/  r  r  )r  r	  rS  s      r   r  FormatSorter.print_verbose_info  s>   ??6==dii>XYZ;BB499TMaMaCbcd+22499 >S %(?(?y(Q?Qhoo**5)<<C"e &&ul;G T%<%<UI%N%NcTW"55e\J"55eWEG NP?Q %>S 4T U 	V >Ss   )E&BE&c                    U R                  US5      nU R                  US5      nU R                  US5      nUS:X  a   U R                  US5      nUb  Ub  XH:  a  SnOWUS:X  a9  U R                  US5      n	U R                  US	5      n
U	b  XI;   a
  U
b  XJ;  a  S
OSnOUS:X  a  U R                  X$S5      n[        X@R                  US5      S9nU R                  US5      S:g  =(       a    US LnU(       a  UnUc  S$ U(       d  SUS
4$ U(       a  S
[        XG-
  5      * U(       a  XG-
  4$ Xt-
  4$ U(       d  Ub  XG::  a  S
US
4$ Ub  U(       a  XG:X  d  XG:  a  S
U* S
4$ SUS
4$ )Nr  r"  rO  r  rh  rv  r  in_listr  r   r  Tr   r  r  rz  )ir   r   )r  r  r,  abs)r  format_rS  r  r   r  r"  rO  maximumr<  r  val_numis_nums                r   &_calculate_field_preference_from_value3FormatSorter._calculate_field_preference_from_value  s   ))%;))%;''w7K--eU;G}!49Ii--eY?G11%GK"?e.>[EX\a\tA|~Ei--eDAE  /F/Fui/XY((	:hF^7Z^K^E!M 	%*0a]	%^ea#em,,wemZ	%LQMZ	% +2u}a]	% (-}U^X]Xea%^		%
 %^	%r   c                    ^ ^^ T R                  US5      nUU 4S jmUS:X  a7  SnT R                  US5      nT R                  US5      " U4S jU 5       5      nOT" U5      nT R                  TX#U5      $ )Nr  c                 F   > TR                  TR                  U S5      5      $ )NrS  )r  r  )r  r>  r  s    r   r  :FormatSorter._calculate_field_preference.<locals>.<lambda>  s    gkk$*A*A!W*MNr   r  rS  r  c              3   4   >#    U  H  nT" U5      v   M     g 7fr   r   )r  r  	get_values     r   r  ;FormatSorter._calculate_field_preference.<locals>.<genexpr>  s     >cUbPQy||Ubs   )r  rB  )r  r>  rS  r  actual_fieldsr   rH  s   ``    @r   _calculate_field_preference(FormatSorter._calculate_field_preference  sw    ''v6N	JE 33E7CM++E:>>cUb>ccEe$E::7ERWXXr   c                   ^  T R                  S5      (       d  [        T 5      T S'   T R                  S5      (       d%  ST ;   a  [        T S   5      R                  5       T S'   T R                  S5      S:X  a%  T R                  S5      S:w  a  T S   OST S'   ST S'   OT S   T S'   ST S'   T R                  S	5      cN  T R                  S5      S
:X  a9  [        R
                  " ST R                  S5      =(       d    S5      (       a  ST S	'   T R                  S5      S:X  a  ST S'   T R                  S5      S:X  a  ST S'   T R                  S5      (       d0  T R                  S5      S:w  a  [        U 4S j5      =(       d    S T S'   T R                  S5      (       d0  T R                  S5      S:w  a  [        U 4S j5      =(       d    S T S'   T R                  S5      (       d  [        U 4S j5      =(       d    S T S'   g g )Nr  r  r  r  r  r  r  r  r  rh  r  r  ir   r  r  c                     > T S   T S   -
  $ )Nr  r  r   r  s   r   r  3FormatSorter._fill_sorting_fields.<locals>.<lambda>      VE]VE]-Jr   c                     > T S   T S   -
  $ )Nr  r  r   rO  s   r   r  rP    rQ  r   r  c                     > T S   T S   -   $ )Nr  r  r   rO  s   r   r  rP    rQ  r   )r  r  r.  r  r   r   r  rO  s   `r   _fill_sorting_fields!FormatSorter._fill_sorting_fields  s    zz*%%!3F!;F: zz%  Uf_)&-8>>@F5M::h6)39::h3G63Q&-W]F;"(F;"(-F;"(F; ::l#+

50AU0JrxxXhjpjtjtu}j~  kE  CE  PF  PF $(F<  ::h6)F5M::h6)F5Mzz%  VZZ%9V%C$%JKStF5Mzz%  VZZ%9V%C$%JKStF5Mzz%  $%JKStF5M !r   c                 h   ^ ^ T R                  T5        [        UU 4S jT R                   5       5      $ )Nc              3   H   >#    U  H  nTR                  TU5      v   M     g 7fr   )rK  )r  rS  r  r  s     r   r  4FormatSorter.calculate_preference.<locals>.<genexpr>  s#     ^R]T55feDDR]s   ")rT  r  r  )r  r  s   ``r   calculate_preference!FormatSorter.calculate_preference  s)    !!&)^RVR]R]^^^r   )r  r/  r.  r  ro  Nr  )r   r   r   r   r  r   _prefer_vp9_sortytdl_defaultr  r  r  r  r  r  rB  rK  r  rT  rY  r   r   r   r   r  r    s   cENGW8LL9t QRL 	9t Z[L
 		D?^`L 	)dZ LML 	[CHJL 	TKUZ\L 	et[QVWL  	%4 4#OQ!L& 	k:'L( 	th	Zcd)L* 	Hi	R+L, 	G.CPRS-L. 	w26/L0 	Y(1L2 	3DE3L4 	([95L6 	9l+7L8 	)\*9L: 		<(;L< 	7GH=L> 		<(?L@ 		<(ALB 		<(CLD 		<(ELF 	g0CPRSGLJ 	*/CDKLL 	z,AlBDMLP 	.GT[DFQLT 	
-=>ULV 	
-@GIWL^ 	g5_L` 	w;aLb 	&AcLd 	gAeLf 	Ww7gLh 	GkBiLj 	7Z@kLp 	gTJqLr 	wdKsLt 	gTJuLv 	Gd$GwLx 	'ENyLz 	'EN{L| 	'EN}L~ 	gTJL@ 	gdSALB 	wdKCLD 	gdKELF 	gdKGLH 	($OILJ 	($OKLL "HDI%M!HDI%M%	N)09TX YWLH\:& D6$pV%:
Y !T !TF_r   r  c                 0    U b  Uc  g[        X-  S-  5      $ )z
@param tbr:      Total bitrate in kbps (1000 bits/sec)
@param duration: Duration in seconds
@returns         Filesize in bytes
Ng     @_@rJ  )r  rk  s     r   filesize_from_tbrr^    s#     {h&x~*++r   c                    Ub$  [         R                  " U5      R                  5       n[        XU SS9nU=(       d    Sn[	        U5      U:  aI  S[         R                  " UR                  5       5      R                  5       -   nUS U[	        U5      -
   U-   n[        U S3SS9n[        R                  S:X  a3  [        R                  R                  U5      n[	        U5      S	:  a  S
U 3nU$ )Nr   r     ___z.dumpT)r  r6  i  rO  )r  md5	hexdigestr  r   rg   r  ry   r   rz   rP  )r  r  r  trim_lengthbasenr  r  absfilepaths           r   _request_dump_filenamerg    s    {{4 **,(#S9E$K
5zKGKK/99;;+{SV+,q0 E7%TBH 
ww$ggooh/{c!{m,HOr   c                   R    \ rS rSrSS jrS rS rSS.S jrS	S
.S jrS r	S r
Srg)
_YDLLoggeri  Nc                     Xl         g r   _ydl)r  ro  s     r   r  _YDLLogger.__init__  s    	r   c                 ^    U R                   (       a  U R                   R                  U5        g g r   )rl  r	  r  messages     r   debug_YDLLogger.debug  s     99II!!'* r   c                 ^    U R                   (       a  U R                   R                  U5        g g r   )rl  re  ro  s     r   rl  _YDLLogger.info#       99II( r   F)oncec                ^    U R                   (       a  U R                   R                  X5        g g r   )rl  r  )r  rp  rv  s      r   rg  _YDLLogger.warning'  s     99II$$W3 r   Tis_errorc                Z    U R                   (       a  U R                   R                  XS9  g g )Nry  )rl  report_error)r  rp  rz  s      r   r  _YDLLogger.error+  s#    99II""7"> r   c                 ^    U R                   (       a  U R                   R                  U5        g g r   )rl  	to_stdoutro  s     r   r  _YDLLogger.stdout/  ru  r   c                 ^    U R                   (       a  U R                   R                  U5        g g r   )rl  	to_stderrro  s     r   r]  _YDLLogger.stderr3  ru  r   rk  r   )r   r   r   r   r  rq  rl  rg  r  r  r]  r   r   r   r   ri  ri    s/    +) (- 4 *. ?))r   ri  c                   F    \ rS rSrSrSrSrSrSrSr	\
S 5       rSS
 jrSrg	)_ProgressStatei8  zs
Represents a state for a progress bar.

See: https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC
r   r  r   r  r   c                    US   S:X  a  U R                   $ US   S:X  a  U R                  $ UR                  S5      c  U R                   $ U R                  $ )Nstatusfinishedr  _percent)INDETERMINATEERRORr  VISIBLE)r[  r  s     r   r  _ProgressState.from_dictE  sU    X;*$$$$ X;'!99$%EE*$5$=s  N3;;Nr   Nc                H    Uc  SO
[        U5      nSU R                   SU S3$ )Nr   z]9;4;r  )r  r   )r  percents     r   get_ansi_escape_ProgressState.get_ansi_escapeP  s*    !CL4::,ay55r   r   r   )r   r   r   r   r1  HIDDENr  r  WARNINGr  re  r  r  r   r   r   r   r  r  8  s;     FMGGEO O6r   r  r   r  )r   F)r  )TNrT  )rZ  )r7  rb   )rb   F)r@  r  )z%d%s)r?   )r   NNr   N)r   r   N)rb   N)Nr  )r   Nr   )Fr   F)r  r  N)r   )r  ({  r  r
  r  r  r  collections.abcr   r  r  email.headerr  email.utilsenumr  r   r  r  html.entitiesr   html.parserr   r  r  r}   re   r.  r  netrcr  ry   r   r  r   r  r
  r  r
  ra  r   rw   r|  r  typesr  urllib.errorr  urllib.parseurllib.requestxml.etree.ElementTreer  r  r   compatr   r   r   r	   dependenciesr
   globalsr   r   r   r  r   r   r  r  r  rM  rt  r  r  DATE_FORMATSr  r  r  r  r  
JSON_LD_REr>  r  rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  rG  rQ  r^  ra  rg  JSONDecoderri  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  ri  
namedtuplers  rx  r~  r  rh   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r'  r.  r5  rE  rP  rF  rC  rb  rd  r  r  r  r  r   r  r   r  r  r  r  	Structurer  r  r  r  r  r  r  POINTERargtypesBOOLrestyper  r  r  r  r  r  r  r  r  r   	maketransr  r  r?  r  r  r5  r7  rD  rI  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r,  r  r  r  r  r  r  r   prepend_extensionr1  r  r  r  r  r  r  Sequencer  r4  rV  r`  rl  r  r  r   r  r  r  r  r  r  Iterabler  r  r  r  r  r  r  r   r  r  r  r  r.  POSTPROCESS_WHENDEFAULT_OUTTMPLOUTTMPL_TYPESSTR_FORMAT_RE_TMPLSTR_FORMAT_TYPESrG  r  rQ  rU  rW  rY  r  r  r  r  r  r  r  r  r  r  r$  rE  rK  rX  r]  ru  rw  ry  r  r  r  r  r  r  r  r@	  r
  r
  r
  r  r  r	  r  r  r  r  r   r"  r$  r/  r8  r>  DOT_URL_LINK_TEMPLATEDOT_WEBLOC_LINK_TEMPLATEDOT_DESKTOP_LINK_TEMPLATELINK_TEMPLATESrL  rQ  r  rV  rZ  r\  ra  re  rn  rp  rr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rY  SimpleNamespacer4  r  r1  rP  rR  rQ  rU  r+  r  r  r  r  r  r  r^  rg  ri  Enumr  r   r   r   <module>r     sp                     	        	   	   
   
            ! -??3"1%	 	F 
 MV
 Aaabbbbb C  c!4&:NQUPVX`cgimbn(04&:NQUPVX`cgbhjmop q+Z l+     	 	  -     !  Ds
	  4"	 %)z . "&UJ  '+% 
>
C
)))
)
""`
\
 LWei 
6'6$++"8"8 '6V >F	,$++00 	,$++00 "* %9)) %9P$N %* 4n(0< !' (	14
 "' 	.:G, ,KIJ KI\: ##F,[\
-A
2	#Y 	#)%^ )%X~ 	 	

# 
#O. O!N !$ $#N #. ' '
d, d
`, `
Q+ Q
!N !3 3#N #!> !* * 	N 	4D 0 0 M 0\B 
 
W'MT	V)5&#I #IL  &  . )- 
J !U  #g # <<7
V%% 
 }}Z(H$$Jz"J  --J((Lz"L "??//LIJiN*		&	A > >B 9 9
 }}c5\2 ==	 
 

" 
   % 
%T %I
 D-N): $) <"8JMK*
6 , , 	 	,$ 	 	18o5Gp	I %%&7> %%&7?   "   +m#2G	HV${'' V$r() ()V&	 &R$ $4E EPM6&B $( ; ;( / /,< '2oo&>&>j M ) L $(b Q 5 8 (9':8 P
 

	

  $$  O O Od B  ,T
  ##"  & 7#
* ' [% [%|/(V GK &3 &3R .8 EY%F-,=>M=`	>6'S 'ST
lGH
eP:`K 35 ( 6:2RV 
FK" K"\D2 D2NAD ADP<"",
$@>25j	 
	   !(&'YX  4
BU]    2,  
p	SC-
@ *1$ M M>E 	 	.> O4 2 "% 6 6,S7$j5 j5Z\
"   (B B$%%% % <
KT
i%*3	    *77 7    *77 7 b%++b.>.D.DbGWGaGab BI BJ5 5p * *
 = = ?D4 ! !>k_ k_\	,&) ):6TYY 6}  *	*	**s   

o o$#o$