U
    g_                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZddlmZm	Z	m
Z
mZmZmZmZmZ dd Zdd Zdd	 Zd
d Zdd Zdd Zdd Zd2ddZddddeejeejeejejejeejeejeejeej eej!eej"eej#eej$eej%eej&eej'eeedZ(ddddddddhZ)dZ*e+e,e,d d!d" Z-d#Z.G d$d% d%Z/G d&d' d'e	Z0G d(d) d)e	Z1G d*d+ d+e	Z2G d,d- d-e j3Z4G d.d/ d/Z5G d0d1 d1Z6dS )3    N   )
NO_DEFAULTExtractorErrorfunction_with_repr
js_to_jsonremove_quotestruncate_stringunified_timestampwrite_stringc                    s   dd  fdd}|S )Nc              	   S   sB   | d t fkrdS tt t| r4W 5 Q R  dS W 5 Q R X | S Nr   JS_Undefined
contextlibsuppress	TypeErrormathisnan)x r   3/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/jsinterp.pyzeroise   s    
z_js_bit_op.<locals>.zeroisec                    s    | |d@ S )Nl    r   abopr   r   r   wrapped   s    z_js_bit_op.<locals>.wrappedr   r   r   r   r   r   
_js_bit_op   s    r   c                    s    fdd}|S )Nc                    s&   t | |fkrtdS  | pd|p"dS Nnanr   r   floatr   r   r   r   r   &   s    z_js_arith_op.<locals>.wrappedr   r   r   r#   r   _js_arith_op$   s    r$   c                 C   s4   t | |fks| s|stdS |r,| p&d| S tdS )Nr    r   infr!   r   r   r   r   _js_div.   s    r&   c                 C   s$   t | |fks|stdS | pd| S r   r!   r   r   r   r   _js_mod4   s    r'   c                 C   s(   |sdS t | |fkrtdS | p"d| S )Nr   r    r   r!   r   r   r   r   _js_exp:   s
    r(   c                    s    fdd}|S )Nc                    s$   | |hd t hkr | | S  | |S N)r   r   r#   r   r   r   D   s    
z_js_eq_op.<locals>.wrappedr   r   r   r#   r   	_js_eq_opB   s    r*   c                    s    fdd}|S )Nc                    sP   t | |fkrdS t| ts$t|tr> t| p.dt|p8dS  | pFd|pLdS )NFr   )r   
isinstancestrr   r#   r   r   r   N   s
    z_js_comp_op.<locals>.wrappedr   r   r   r#   r   _js_comp_opL   s    r-   TFc              
   C   sJ   | ddddt fkr|S tt  t| r<|W  5 Q R  S W 5 Q R X |S )z6Simulate JS's ternary operator (cndn?if_true:if_false)FNr    r   )cndnif_trueif_falser   r   r   _js_ternaryX   s    
r2   )???||&&|^&===!====!=<=>=<>z>>z<<+-*%/z**r:   r;   r<   r=   r>   r?   r@   rA   z[a-zA-Z_$][\w$]*z()z{}[]z'"/c                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__r   r   r   r   r      s   r   c                   @   s   e Zd Zdd ZdS )JS_Breakc                 C   s   t | d d S )NzInvalid breakr   __init__selfr   r   r   rM      s    zJS_Break.__init__NrH   rI   rJ   rM   r   r   r   r   rK      s   rK   c                   @   s   e Zd Zdd ZdS )JS_Continuec                 C   s   t | d d S )NzInvalid continuerL   rN   r   r   r   rM      s    zJS_Continue.__init__NrP   r   r   r   r   rQ      s   rQ   c                   @   s   e Zd Zdd ZdS )JS_Throwc                 C   s   || _ t| d|  d S )NzUncaught exception )errorr   rM   )rO   er   r   r   rM      s    zJS_Throw.__init__NrP   r   r   r   r   rR      s   rR   c                   @   s   e Zd Zdd Zdd ZdS )LocalNameSpacec                 C   s4   | j D ]}||kr|||<  d S q|| j d |< d S r   )maps)rO   keyvalueZscoper   r   r   __setitem__   s
    
zLocalNameSpace.__setitem__c                 C   s   t dd S )NzDeleting is not supported)NotImplementedError)rO   rW   r   r   r   __delitem__   s    zLocalNameSpace.__delitem__N)rH   rI   rJ   rY   r[   r   r   r   r   rU      s   rU   c                   @   s@   e Zd ZddlZdodejkZeddddZed	d
 Z	dS )Debuggerr   NFZpytestd   levelc                 G   s0   t ddd|    ddd |D  d d S )Nz[debug] JS: z  r]    c                 s   s   | ]}t t|d d V  qdS )2   N)r   r,   .0r   r   r   r   	<genexpr>   s     z!Debugger.write.<locals>.<genexpr>
)r
   join)r_   argsr   r   r   write   s    zDebugger.writec                    s    fdd}|S )Nc           	   
      s    j r| r j||d z| |||f||\}}W nN tk
r } z0 j rvt|trb|j} jd|d||d  W 5 d }~X Y nX  j r| r|st||krȈ jddg| t|d||d ||fS )Nr^   z
=> Raises:z<-|z->z=>)ENABLEDstriprh   	Exceptionr+   r   Zorig_msgrepr)	rO   stmt
local_varsallow_recursionrg   kwargsretZ
should_retrT   clsfr   r   interpret_statement   s    
 z6Debugger.wrap_interpreter.<locals>.interpret_statementr   )rs   rt   ru   r   rr   r   wrap_interpreter   s    zDebugger.wrap_interpreter)
rH   rI   rJ   sysmodulesri   staticmethodrh   classmethodrv   r   r   r   r   r\      s   r\   c                   @   s   e Zd ZdZddejejejejddZ	d,ddZ
G d	d
 d
eZdd Zedd Zed-ddZed.ddZdd Zd/ddZdd Zejd0ddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ ZdS )1JSInterpreterr   i   i   i   )dgimsuyNc                 C   s$   |i  | _ | _|d kri n|| _d S r)   )code
_functions_objects)rO   r   Zobjectsr   r   r   rM      s    zJSInterpreter.__init__c                       s   e Zd Zd fdd	Z  ZS )zJSInterpreter.ExceptionNc                    s:   |d k	r"|   dt|dd }t j|f|| d S )Nz in: ra   )rstripr   superrM   )rO   msgexprrg   rp   	__class__r   r   rM      s    z JSInterpreter.Exception.__init__)N)rH   rI   rJ   rM   __classcell__r   r   r   r   rk      s   rk   c                 C   sL   |  j d7  _ d| j  }t|r@t|ts@t|d| j  d}|||< |S )Nr   Z__yt_dlp_jsinterp_objF<rA   )$_JSInterpreter__named_object_countercallabler+   r   )rO   	namespaceobjnamer   r   r   _named_object   s    zJSInterpreter._named_objectc                 C   sR   d}|s||fS t |D ]$\}}|| jkr. q>|| j| O }q|||d d  fS )Nr   r   )	enumerate	_RE_FLAGS)rs   r   flagsidxchr   r   r   _regex_flags   s    
zJSInterpreter._regex_flags,c                 c   s  d}| sd S dd t  D }dddt|d f\}}}}d\}	}
}}t| D ]z\}}|	sz|t krz|t |   d7  < nx|	s||kr|| r||  d8  < nR|
s|tkr|	|d fkr|	s|s|dkr|	r|sd n|}	n|	dkr|dkr|d	k}|
 o|	o|d
k}
|	 o(| o(|dko(|dk}|	s>||kr>|n| oJ|}||| kstt| st|	st|r|d}qNn||kr|d7 }qN| |||  V  |d d }}|d7 }|rN||krN qqN| |d  V  d S )Nz+-*/%&|^=<>!,;{}:[c                 S   s   i | ]
}|d qS )r   r   )rc   kr   r   r   
<dictcomp>   s      z+JSInterpreter._separate.<locals>.<dictcomp>r   r   )NFTFrF   rG   [\)TFz-+)_MATCHING_PARENSvalueslenr   _QUOTESisspaceany)r   delimZ	max_splitZOP_CHARSZcountersstartsplitsposZ	delim_lenZin_quoteZescapingZafter_opZin_regex_char_groupr   charZin_unary_opr   r   r   	_separate   sJ    "(
zJSInterpreter._separatec                 C   sh   |d kr|ot |d  }t| ||d}t|dk rH| d| ||d dd   |d  fS )Nr   r      zNo terminating paren )r   listr   r   rk   rj   )rs   r   r   	separatedr   r   r   _separate_at_paren  s    z JSInterpreter._separate_at_parenc           	   
   C   s   |dkr|dkt |A rX|S n:|dkr8|d tfkrX|S n |dkrXt |f| |dd }| |||}t|st|S zt| ||W S  tk
r } z&| jd|d| d|||d	W 5 d }~X Y nX d S )
N)r5   r6   r6   r4   r3   :r   zFailed to evaluate r`   cause)r2   r   r   interpret_expression
_OPERATORSgetrk   )	rO   r   left_val
right_exprr   rn   ro   Z	right_valrT   r   r   r   	_operator$  s    
zJSInterpreter._operatorFc              
   C   s   |dkrt |S z t|tr(|t| n|| W S  tk
r| } z.|rRt W Y  S | jd| t||dW 5 d }~X Y nX d S )NlengthzCannot get index r   )r   r+   r   intrk   r   rl   )rO   r   r   Zallow_undefinedrT   r   r   r   _index7  s     zJSInterpreter._indexc                 C   s2   zt |W S  tk
r,   | || Y S X d S r)   )jsondumpsr   r   )rO   r   r   r   r   r   _dumpA  s    zJSInterpreter._dumpr]   c           5         s*   dk r d d8  d}t|dp2dg}|   }|D ]&}| \}}|rH||f  S qHtd|}|r|t|	dd   |	drt
 |	d	 }sd |fS d tkrZd d\}	}
d d
kr|
\}}
|	 d
| }	ntt|	 d  dd}	|
sJ|	|fS |	|
 drdd  }|drވ|dd  \}}t| d}|d krĈ d|t|d | n d| drdd   }d |fS drƈ\}	}
fdd|	D }tdd |D r fddtfdd|D |fS |	 \}	}|
r|r|	|p|fS |	|
 dr\}	}
|	 \}	}|
r|r|	|p|fS |	|
 drb\}	}
 fdd|	D }||
 td }|r|| ni }|d!r,| d d  \} \}d }td"}|r| d d  \}t| }|r|n| \}}|r,|dfS |d#r| d d  \}d }z&| \}}|r~|dfW S W n( t k
r } z|}W 5 d }~X Y nX d$}td%t d&}|r:| d d  \}|r:i }|	d'rt|t
r|j n|||	d'< !|}d ||  }}td(}|r| d d  \}| \}}|r|dfS |\}}|r|dfS |r$|nv|d)r| d d  \}}|dr|\}nXtd*|} | rB||  d d  \}!}|d+\}d,|!|f }n
|d }|d\}"}}#|"  t| sq$z&| \}}|r|dfW S W n0 t"k
r   Y q$Y n t#k
r   Y nX |#  qln2|d-r$| d d  \}!}|! }!|d+\}|$d.d/%d0dd  }$d1D ]}%d}&|$D ]}'d2d |'d3dD \}(}|%r|&p|(d4k}&n"|&s|(d4ko|!|( k}&|&sƐqdz*| \}}|r|W     S W n t"k
r   Y  qY nX qd|&rX q$qX|rJ \}}||pF|fS t}t|dkr|D ]*}| \}}|rj|df  S qj|dfS t&d5t d6t d7D ]}|	d8p|	d9})|' \}"}*|	d:p|	d;}+|) }|)  |+d d<k	rdnd=7  < |	d:	r2|) }d |" | |*d   q	shd |fS td>t d?d@(t)tj*t+t,t-  dAt dBt dCt dDt dE}|
r|	dF
r|	dG},|	dH
s.|	dI|,|	dJ |	dG< |	dG |fS |,d t/fk
r@ dK|	dG |	dH }-t|-tt0f
sx dL|- dMt|-}-.|	dI1|,|-|	dJ |,|-< |,|- |fS 2 
rt|fS dNk
rt"n`dOk
rt#nPdPkr t/|fS dQkrt0dQ|fS |r>|	dRr>|	dSt/|fS t34t5$ ttdd|fW  5 Q R  S Q R X |r|	dTr|	dU }.|	dV }-1|.|-|fS t,D ]}/t|/}0|0 }1|/dWkrt|0dkr|0d=  s|0  n |0rT|/dXkrT|1dYs&qT|/ |1 }1|/dZkr|0  |/ |1 }1q|0s^q|/(|0 },.|/|,|1 |f  S |rp|	d[rp|	d	d\d]\	sΈ|	d^ | d  dr\}n
d  }fd_d` 	f	dadb}2|rd|2 |  \}}||p`|fS |2 |fS n|r|	dcr|	dd}3 fded|	dfD }4|3kr̈|3 |4 dg|fS |3j6kr7|3j6|3< j6|3 |4 dg|fS  dh|krt8didind |d S )jNr   zRecursion limit reachedr   F;r.   zJ(?P<var>(?:var|const|let)\s)|return(?:\s+|(?=["\'])|$)|(?P<throw>throw\s+)throwvarrF   T)strictznew    zDate(zFailed to parse date i  zUnsupported object zvoid    {c                    s"   g | ]}t  | d dqS )r   r   )r   r   rj   rc   sub_exprrN   r   r   
<listcomp>  s     z5JSInterpreter.interpret_statement.<locals>.<listcomp>c                 s   s   | ]}t |d kV  qdS )r   N)r   r   r   r   r   rd     s     z4JSInterpreter.interpret_statement.<locals>.<genexpr>c                    s4    | }tt| r"| |fS  |  |fS r)   )r   rematch_NAME_RE)rW   valro   rn   rO   r   r   	dict_item  s    z4JSInterpreter.interpret_statement.<locals>.dict_itemc                 3   s   | ]\}} ||V  qd S r)   r   )rc   r   v)r   r   r   rd     s     (r   c                    s   g | ]} | qS r   r   )rc   itemr   r   r   r     s   z(?x)
                (?P<try>try)\s*\{|
                (?P<if>if)\s*\(|
                (?P<switch>switch)\s*\(|
                (?P<for>for)\s*\(
                ifzelse\s*{try)NFzcatch\s*(?P<err>\(\s*z	\s*\))?\{errzfinally\s*\{forzswitch\s*\(}zswitch(%s){%s}switchzdefault:zcase default:zcase )FTc                 s   s   | ]}|  V  qd S r)   rj   )rc   r~   r   r   r   rd     s     r   defaultz3(?x)
                (?P<pre_sign>\+\+|--)(?P<var1>z)|
                (?P<var2>z)(?P<post_sign>\+\+|--)Zvar1Zvar2Zpre_signZ	post_signrB   z5(?x)
            (?P<assign>
                (?P<out>z7)(?:\[(?P<index>[^\]]+?)\])?\s*
                (?P<op>r7   z)?
                =(?!=)(?P<expr>.*)$
            )|(?P<return>
                (?!if|return|true|false|null|undefined|NaN)(?P<name>z6)$
            )|(?P<indexing>
                (?P<in>zG)\[(?P<idx>.+)\]$
            )|(?P<attribute>
                (?P<var>zz)(?:(?P<nullish>\?)?\.(?P<member>[^(]+)|\[(?P<member2>[^\]]+)\])\s*
            )|(?P<function>
                (?P<fname>z )\((?P<args>.*)\)$
            )Zassignoutindexr   r   z Cannot index undefined variable zList index z must be integerbreakcontinueZ	undefinedNaNreturnr   Zindexinginr   z?<>*-r3   .rC   	attributemembernullishZmember2c                    s   | s  d|  dS )z3 assert, but without risk of getting optimized out r`   N)rk   )r/   r   )r   r   rO   r   r   	assertiony  s    z4JSInterpreter.interpret_statement.<locals>.assertionc                     s  fdkr2t jr.t 
d d d S tttd} | ttkr
j	krz


j	< W n 
jk
r   	s Y nX 
j	t	rtkrtS d krʈ
	S 
fdd
D }ttrdrdd	 d\}}}|d
 t|d d  |dkrP|^}nH|dkrt|d	kd |\}t|td n
d| |tkrވdkrʈ|d
 dtt|S 
d nHtkr&dkrt|d	kd |d |d  S 
d dkrl|d
 t|dkd |d rd|d S tS dkrttd t|dkd |d S dkrȈ| d   S dkrtttfd  t|d	kd! t|d.  S d"krʈttd |d
 tt|tfd d	 \}}|dk rb|t7 }|d	d  }g }t|t|| tD ]}|| qt|D ]\}	}
 ||	 |
 q|S d#krttd |d
 t!|D ]}
 d|
 qS d$krFttd | d s>d S  S d%krh|d
 "| S d&kr|d
 t|d	kd' |d/d d	 \  fd(dtD S d)kr"|d
 t|d	kd' |d0d d	 \}}z#||W S  t$k
r   Y d*S X nfd+krttd, t|dkd t|d trf|d nd}|tkr|d S t%| S ttrtn}| |d-S )1N)consoledebugr   ])StringZMathArrayc                    s   g | ]} | qS r   r   rc   r   r   r   r   r     s   zJJSInterpreter.interpret_statement.<locals>.eval_method.<locals>.<listcomp>z
prototype.r   r   ztakes one or more argumentsr   zneeds binding to type callapplyztakes two argumentsz"second argument needs to be a listzUnsupported Function method ZfromCharCoder.   zUnsupported String method powr   zUnsupported Math method splitz&with limit argument is not implementedrf   zmust be applied on a listztakes exactly one argumentreversezdoes not take any argumentsslicez#must be applied on a list or stringztakes between 0 and 2 argumentsZspliceZunshiftpoppushZforEachztakes at-most 2 argumentsc                    s&   g | ]\}}||fd i qS )thisr   )rc   r   r   )ro   rt   r   r   r   r   r     s     indexOfr   Z
charCodeAtzmust be applied on a stringro   )N)r.   )r   )&r\   ri   rh   r   r,   r"   r   r   r   r   extract_objectrk   r   r   r   r+   type
startswith	partitionr   rf   mapchrr   r   r   r   rangeminappendr   r   insertreversedextendr   
ValueErrorord)typesargvals
new_member_Zfunc_prototyper   Zhow_manyZ	add_itemsresr~   r   r   r   )	ro   arg_strr   r   rn   r   r   rO   variable)rt   r   r   r   eval_method~  s    











 




 












z6JSInterpreter.interpret_statement.<locals>.eval_methodfunctionfnamec                    s   g | ]} | qS r   r   r   r   r   r   r   
  s   rg   r   zUnsupported JS expression    )9rk   r   r   r   rj   ru   r   r   r   grouprR   r   r   r   r   loadsr   r   r   r   r	   r   r   alldict	groupdictr   endlstripr2   r   r+   rS   	new_childrK   rQ   replacer   finditerspanrf   r   escapesetr   _COMP_OPERATORSr   r   r"   r   isdigitr   r   r  r   extract_functionr   )5rO   rm   rn   ro   should_returnZsub_statementsZsub_stmtrq   r   innerouterr   r   leftrightdateZsub_expressionsshould_abortr   Zmdr/   Zif_exprZ	else_exprZtry_exprr   rT   pendingr   Z
catch_varsconstructor	remainingbodyZswitch_mZ
switch_valr   	incrementitemsr   matchedr   Zcaser   r  signr   r   r   r   r   r   r  r  r  r   )
ro   r  r   r   r   rn   r   r   rO   r  r   ru   G  sN   

 
   




"(      
    




(&


  

 z!JSInterpreter.interpret_statementc                 C   s&   |  |||\}}|r"| d||S )Nz Cannot return from an expression)ru   rk   )rO   r   rn   ro   rq   r!  r   r   r   r     s    z"JSInterpreter.interpret_expressionc           
      C   s   d}i }t dt ||f | j}|s8| d| |d}t d|tf |}|D ]F}|dd}t	|d}	t
| ||d	d
|	 d||	< qZ|S )Nz1(?:[a-zA-Z$0-9]+|"[a-zA-Z$0-9]+"|'[a-zA-Z$0-9]+')z(?x)
                (?<!\.)%s\s*=\s*{\s*
                    (?P<fields>(%s\s*:\s*function\s*\(.*?\)\s*{.*?}(?:,\s*)?)*)
                }\s*;
            zCould not find object fieldszg(?x)
                (?P<key>%s)\s*:\s*function\s*\((?P<args>(?:%s|,)*)\){(?P<code>[^}]+)}
            rg   r   rW   r   r   rA   )r   searchr  r   rk   r  r  r   r   r   r   build_function)
rO   ZobjnameZ_FUNC_NAME_REr   Zobj_mr0  Zfields_mrt   argnamesr   r   r   r   r     s,    
&zJSInterpreter.extract_objectc                 C   sh   t ddt |i | j}|dkr6| d| d| |d\}}dd |d	d
D |fS )z @returns argnames, code a  (?xs)
                (?:
                    function\s+%(name)s|
                    [{;,]\s*%(name)s\s*=\s*function|
                    (?:var|const|let)\s+%(name)s\s*=\s*function
                )\s*
                \((?P<args>[^)]*)\)\s*
                (?P<code>{.+})r   NzCould not find JS function ""r   c                 S   s   g | ]}|  qS r   r   rb   r   r   r   r   D  s     z7JSInterpreter.extract_function_code.<locals>.<listcomp>rg   r   )r   r1  r  r   rk   r   r  r   )rO   funcnameZfunc_mr   r	  r   r   r   extract_function_code5  s    
z#JSInterpreter.extract_function_codec                 C   s   t | j| | d| dS )Nr   rA   )r   extract_function_from_coder6  )rO   r5  r   r   r   r   F  s    
zJSInterpreter.extract_functionc                 G   s   i }t d|}|d krq| \}}| ||d d  \}}	| || jdd |ddD ||f| }
|d | |
 |	 }q| j|||f| S )Nzfunction\((?P<args>[^)]*)\)\s*{r   c                 S   s   g | ]}|  qS r   r   rb   r   r   r   r   T  s     z<JSInterpreter.extract_function_from_code.<locals>.<listcomp>rg   r   )	r   r1  r  r   r   r7  r  r   r2  )rO   r3  r   global_stackrn   Zmobjr   Z
body_startr+  r*  r   r   r   r   r7  K  s    
 z(JSInterpreter.extract_function_from_codec                 G   s   |  ||S r)   )r   )rO   r5  rg   r   r   r   call_functionY  s    zJSInterpreter.call_functionc                    s2   t pi gt  i df fdd	}|S )Nr]   c                    sZ   d  tj | d d d  | t }dd||d \}}|rV|S d S )Nr   )	fillvaluere   r`   r   )update	itertoolszip_longestrU   ru   r  )rg   rp   ro   Z	var_stackrq   r'  r3  r   r8  rO   r   r   resf`  s    z*JSInterpreter.build_function.<locals>.resf)r   tuple)rO   r3  r   r8  r?  r   r>  r   r2  \  s    zJSInterpreter.build_function)N)r   N)N)F)r]   ) rH   rI   rJ   r   r   IMSUr   rM   r   rk   r   rz   r   ry   r   r   r   r   r   r\   rv   ru   r   r   r6  r   r7  r9  r2  r   r   r   r   r{      sB   


&

   Pr{   )TF)7collectionsr   r<  r   r   operatorr   utilsr   r   r   r   r   r   r	   r
   r   r$   r&   r'   r(   r*   r-   r2   or_xorand_is_is_noteqnelegeltgtrshiftlshiftaddsubmulr   r  r   r  zipr   r   r   rK   rQ   rR   ChainMaprU   r\   r{   r   r   r   r   <module>   sd   (


 