U
    Ã9%eíê  ã                   @   s   d Z ddlZddlmZ ddlZddlmZmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZ e e¡Zd
ZeZeddddhƒZe
G dd„ deƒƒZG dd„ deƒZG dd„ deƒZ dd„ Z!G dd„ deƒZ"e
G dd„ deƒƒZ#G dd„ de#ƒZ$edkre$Z%nedk r.e#Z%ne&eƒ‚eddd d!d"gƒZ'G d#d$„ d$eƒZ(ed%d&d'd!d(d)gƒZ)d*d+„ Z*d,d-„ Z+G d.d/„ d/eƒZ,G d0d1„ d1eƒZ-dS )2z)
Implement python 3.8+ bytecode analysis
é    N)Úpformat)Ú
namedtupleÚdefaultdictÚdeque)Útotal_ordering)Ú
UniqueDictÚ	PYVERSIONÚALL_BINOPS_TO_OPERATORS)ÚNEW_BLOCKERSÚCFGraph)ÚLoc)ÚUnsupportedErroré   Ú
LOAD_CONSTÚNOPÚ
LOAD_DEREFZPRECALLc                   @   sL   e Zd ZdZeddddddhƒZdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )Ú	BlockKindz?Kinds of block to make related code safer than just `str`.
    ÚLOOPÚTRYÚEXCEPTÚFINALLYÚWITHÚWITH_FINALLYc                 C   s   || j kst‚|| _d S ©N)Ú_membersÚAssertionErrorÚ_value)ÚselfÚvalue© r   úR/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/core/byteflow.pyÚ__init__&   s    zBlockKind.__init__c                 C   s   t t| ƒ| jfƒS r   )ÚhashÚtyper   ©r   r   r   r    Ú__hash__*   s    zBlockKind.__hash__c                 C   s,   t |tƒr| j|jk S td t|ƒ¡ƒ‚d S ©Nzcannot compare to {!r}©Ú
isinstancer   r   Ú	TypeErrorÚformatr#   ©r   Úotherr   r   r    Ú__lt__-   s    
zBlockKind.__lt__c                 C   s,   t |tƒr| j|jkS td t|ƒ¡ƒ‚d S r&   r'   r+   r   r   r    Ú__eq__3   s    
zBlockKind.__eq__c                 C   s   d  | j¡S )NzBlockKind({}))r*   r   r$   r   r   r    Ú__repr__9   s    zBlockKind.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	frozensetr   r!   r%   r-   r.   r/   r   r   r   r    r      s      ýr   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_lazy_pformatc                 O   s   || _ || _d S r   )ÚargsÚkwargs©r   r6   r7   r   r   r    r!   >   s    z_lazy_pformat.__init__c                 C   s   t | j| jŽS r   )r   r6   r7   r$   r   r   r    Ú__str__B   s    z_lazy_pformat.__str__N)r0   r1   r2   r!   r9   r   r   r   r    r5   =   s   r5   c                   @   sl   e Zd ZdZdd„ Zdd„ Zedkr.dd„ Znedk r@d	d„ Zneeƒ‚d
d„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚFlowziData+Control Flow analysis.

    Simulate execution to recover dataflow and controlflow information.
    c                 C   s"   t  d| ¡ ¡ || _tƒ | _d S )Nzbytecode dump:
%s)Ú_loggerÚdebugÚdumpÚ	_bytecoder   Úblock_infos)r   Úbytecoder   r   r    r!   K   s    zFlow.__init__c                 C   sJ  t | jdddd}t| jjjd}|j |¡ tƒ }|jrôt 	d|j¡ |j 
¡ }||jkr4t 	d|j¡ t 	d|¡ |||j< | |¡ | ¡ r–qÄq€|  ||¡r¤qÄ|  |¡r€|  |¡ | ¡  qÄq€t 	d|j¡ |j |¡ | ¡ }|j |¡ q4|  |j¡ |  |¡ t|jd	d
„ dD ](}t|ƒ | j|j< }t 	d||¡ qdS )aì  Run a trace over the bytecode over all reachable path.

        The trace starts at bytecode offset 0 and gathers stack and control-
        flow information by partially interpreting each bytecode.
        Each ``State`` instance in the trace corresponds to a basic-block.
        The State instances forks when a jump instruction is encountered.
        A newly forked state is then added to the list of pending states.
        The trace ends when there are no more pending states.
        r   r   )r@   ÚpcÚnstackÚ
blockstack)Údebug_filenamezpending: %sz	stack: %szstate.pc_initial: %szend state. edges=%sc                 S   s   | j S r   )Ú
pc_initial)Úxr   r   r    Ú<lambda>†   ó    zFlow.run.<locals>.<lambda>)Úkeyzblock_infos %s:
%sN)ÚStater>   ÚTraceRunnerZfunc_idÚfilenameÚpendingÚappendr   r;   r<   ÚpopleftÚfinishedÚ_stackrE   ÚdispatchÚhas_terminatedÚ_run_handle_exceptionÚ_is_implicit_new_blockÚ_guard_with_asÚsplit_new_blockÚoutgoing_edgesÚaddÚget_outgoing_statesÚextendÚ
_build_cfgÚ_prune_phisÚsortedÚadapt_state_infosr?   )r   Z
firststateÚrunnerZfirst_encounterÚstateZ
out_statesÚsir   r   r    ÚrunP   s>    

ÿ






zFlow.run©é   é   c                 C   sÚ   |  ¡ s>| ¡ r>| ¡ jtkr>|j| ¡ jd | |¡ dS | ¡  |  ¡ sÖ| 	¡ rÖt
 d| ¡ |j¡ | ¡ }| d¡}|r”|d |jkr”d }nB|jd|jd}|j|d< |j|d< |j|d	< |j|j|d
 dS d S )N©rA   Tz3.11 exception %s PC=%sr   Úend©rh   Ú
end_offsetÚstack_depthÚ
push_lasti©rA   Úextra_block)Úin_withÚhas_active_tryÚget_instÚopnameÚ_NO_RAISE_OPSÚforkÚnextÚ_adjust_except_stackÚ
advance_pcÚis_in_exceptionr;   r<   Úget_exceptionÚ_pcÚget_top_blockÚtargetÚ
make_blockrh   ÚdepthÚlasti)r   r`   ra   ÚehZeh_topZeh_blockr   r   r    rT   ‹   s0    ÿþ
 ÿ



zFlow._run_handle_exceptionc                 C   sº   |  ¡ r®| ¡ jtkr®|j| ¡ jd | d¡}| |¡ |j}i }||d krb||d  |d< |d }t	dƒt
t	dƒti|d  |d	< ||d
< |jf d|d i|—Ž dS | ¡  d S )Nrg   r   Úentry_stackÚnpopÚhandlerr   r   ÚkindÚnpushrn   rA   rh   T)rp   rq   rr   rs   rt   ru   r{   Úpop_block_and_aboverk   r   Ú_EXCEPT_STACK_OFFSETÚ_FINALLY_POPrw   )r   r`   ra   ÚtryblkrB   r7   rƒ   r   r   r    rT   §   s,    ÿ

  þýc                 C   sd   t ƒ }|D ]}|j}| |¡ q
|D ]"}|jD ]}| |j|jd¡ q.q$| d¡ | ¡  || _d S )Nr   )	r   rE   Úadd_noderX   Zadd_edgerA   Zset_entry_pointÚprocessÚcfgraph)r   Z
all_statesÚgraphra   ÚbÚedger   r   r    r\   ¿   s    

zFlow._build_cfgc           	         s   t  d dd¡¡ ‡fdd„}‡ ‡fdd„}‡ fdd	„}‡fd
d„}|ƒ \}‰ t  dt|ƒ¡ |ƒ \}}||ƒ |||ƒ t  d dd¡¡ d S )Nz
Prune PHIsé<   ú-c                     sR   t tƒ} tƒ }ˆ jD ]4}t|jƒ}t|jƒ}| |  ||@ O  < ||O }q| |fS r   )r   ÚsetrP   Ú
_used_regsÚ_phis)Ú	used_phisÚphi_setra   ÚusedZphis©r`   r   r    Úget_used_phis_per_stateÓ   s    



z1Flow._prune_phis.<locals>.get_used_phis_per_statec                     sv   i } t tƒ}ˆjD ]:}|j ¡ D ]*\}}|ˆ kr8|| |< ||  ||f¡ q qt dt| ƒ¡ t dt|ƒ¡ | |fS )Nz
defmap: %szphismap: %s)	r   r’   rP   Ú_outgoing_phisÚitemsrY   r;   r<   r5   )ÚdefmapÚphismapra   ÚphiÚrhs©r–   r`   r   r    Úfind_use_defsÞ   s    
z'Flow._prune_phis.<locals>.find_use_defsc                    sš   t tƒ}d}tt|  ¡ ƒƒD ]`\}}tt|ƒƒD ].\}}|ˆ kr0|| | O }||  ||f¡ q0|| }||@ r||8 }d}qt dt| ƒ¡ |sq–qdS )znAn iterative dataflow algorithm to find the definition
            (the source) of each PHI node.
            FTzchanging phismap: %sN)	r   r’   r^   Úlistr›   rY   r;   r<   r5   )r   Z	blacklistZchangingrž   ZdefsitesrŸ   ra   Z	to_remove)r–   r   r    Úpropagate_phi_mapë   s    z+Flow._prune_phis.<locals>.propagate_phi_mapc                    s¦   i }|   ¡ D ]\}}|D ]}|| ||< qqt dt|ƒ¡ ttƒ}|D ]"}|| D ]\}}||| |< qTqHt dt|ƒ¡ ˆ jD ]}|j ¡  |j 	|| ¡ q‚d S )Nzkeep phismap: %sznew_out: %s)
r›   r;   r<   r5   r   ÚdictrP   rš   ÚclearÚupdate)r•   r   Zkeepra   Zused_setrž   Znew_outrŸ   r˜   r   r    Úapply_changes  s    

z'Flow._prune_phis.<locals>.apply_changeszUsed_phis: %szDONE Prune PHIs)r;   r<   Úcenterr5   )	r   r`   r™   r¡   r£   r§   r•   rœ   r   r   r    r    r]   Ë   s    


zFlow._prune_phisc                 C   s0   |  ¡ }|j| jjkrdS |jtkr(dS dS d S )NTF)rq   Úoffsetr>   Úlabelsrr   r
   ©r   ra   Úinstr   r   r    rU     s    
zFlow._is_implicit_new_blockc                 C   s8   |  ¡ }|jdkr4| j|j j}|dkr4d}t|ƒ‚dS )zÞChecks if the next instruction after a SETUP_WITH is something other
        than a POP_TOP, if it is something else it'll be some sort of store
        which is not supported (this corresponds to `with CTXMGR as VAR(S)`).>   Ú
SETUP_WITHÚBEFORE_WITHÚPOP_TOPzGThe 'with (context manager) as (variable):' construct is not supported.N)rq   rr   r>   ru   r   )r   ra   Zcurrent_instZnext_opÚmsgr   r   r    rV   "  s    
zFlow._guard_with_asN)r0   r1   r2   r3   r!   rc   r   rT   ÚNotImplementedErrorr\   r]   rU   rV   r   r   r   r    r:   F   s   :

M
r:   c                 C   s
   |   d¡S )Nz$null$)Ú
startswith)Úregr   r   r    Ú_is_null_temp_reg0  s    r´   c                   @   s  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedkr†dd„ Znedk r˜dd„ Zneeƒ‚d d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBdC„ Z%dDdE„ Z&dFdG„ Z'dHdI„ Z(dJdK„ Z)dLdM„ Z*dNdO„ Z+e+Z,e+Z-dPdQ„ Z.e.Z/e.Z0dRdS„ Z1dTdU„ Z2dVdW„ Z3dXdY„ Z4dZd[„ Z5d\d]„ Z6d^d_„ Z7d`da„ Z8dbdc„ Z9ddde„ Z:dfdg„ Z;dhdi„ Z<djdk„ Z=dldm„ Z>edkrüdndo„ Z?nedk rdpdo„ Z?ne‚dqdr„ Z@dsdt„ ZAdudv„ ZBdwdx„ ZCdydz„ ZDd{d|„ ZEd}d~„ ZFdd€„ ZGdd‚„ ZHdƒd„„ ZId…d†„ ZJd‡dˆ„ ZKd‰dŠ„ ZLedkrd‹dŒ„ ZMnedk r¤ddŒ„ ZMneeƒ‚dŽd„ ZNdd‘„ ZOd’d“„ ZPd”d•„ ZQd–d—„ ZRd˜d™„ ZSdšd›„ ZTdœd„ ZUdždŸ„ ZVd d¡„ ZWd¢d£„ ZXd¤d¥„ ZYd¦d§„ ZZd¨d©„ Z[dªd«„ Z\d¬d­„ Z]d®d¯„ Z^d°d±„ Z_d²d³„ Z`d´dµ„ Zad¶d·„ Zbd¸d¹„ Zcdºd»„ Zdd¼d½„ Zed¾d¿„ ZfdÀdÁ„ ZgdÂdÃ„ ZhdÄdÅ„ ZidÆdÇ„ ZjdÈdÉ„ ZkdÊdË„ ZldÌdÍ„ ZmdÎdÏ„ ZndÐdÑ„ ZodÒdÓ„ ZpdÔdÕ„ ZqdÖd×„ ZrdØdÙ„ ZsesZtesZuesZvesZwdÚdÛ„ ZxexZyexZzexZ{exZ|exZ}exZ~exZexZ€exZexZ‚exZƒexZ„exZ…exZ†exZ‡exZˆexZ‰exZŠexZ‹exZŒexZexZŽexZexZexZ‘exZ’exZ“exZ”exZ•exZ–exZ—dòdÝdÞ„Z˜dßdà„ Z™dádâ„ Zšdãdä„ Z›dådæ„ Zœdçdè„ Zedkr¶dédê„ Zžnedk rÊdëdê„ Zžneeƒ‚edkrædìdí„ ZŸnedk rúdîdí„ ZŸneeƒ‚dïdð„ Z dñS )órK   zLTrace runner contains the states for the trace and the opcode dispatch.
    c                 C   s   || _ tƒ | _tƒ | _d S r   )rD   r   rM   r’   rP   )r   rD   r   r   r    r!   7  s    zTraceRunner.__init__c                 C   s   t | j|ƒS r   )r   rD   )r   Úlinenor   r   r    Úget_debug_loc<  s    zTraceRunner.get_debug_locc                 C   sÔ   t dkrtt ƒ‚nHt dkrZ|jrZ|jrZ|jd }|d }|d k	rZ||jkrZ|j ¡  q qZq | ¡ }|jdkrŠt d|j	|¡ t d|j
¡ t| d |j¡d ƒ}|d k	r²|||ƒ nd|j }t||  |j¡d	‚d S )
Nrd   éÿÿÿÿrh   ZCACHEzdispatch pc=%s, inst=%szstack %szop_{}z$Use of unsupported opcode (%s) found©Úloc)r   r±   Ú_blockstackrE   Úpoprq   rr   r;   r<   rz   rQ   Úgetattrr*   r   r¶   rµ   )r   ra   ZtopblkZblk_endr¬   Úfnr°   r   r   r    rR   ?  s$    



zTraceRunner.dispatchc                 C   sr   |  d¡}| |¡ |j}i }|d }||kr:|| |d< d}|d rN|d7 }||d< |jf d|d i|—Ž d	S )
zo
        Adjust stack when entering an exception handler to match expectation
        by the bytecode.
        r   rk   r‚   é   rl   r…   rA   rh   N)r{   r†   rk   rt   )r   ra   r‰   rB   r7   Zexpected_depthZextra_stackr   r   r    rv   V  s    

z TraceRunner._adjust_except_stackc                 C   s   |  |¡ d S r   ©rN   r«   r   r   r    Úop_NOPj  s    zTraceRunner.op_NOPc                 C   s   |  |¡ d S r   r¿   r«   r   r   r    Ú	op_RESUMEm  s    zTraceRunner.op_RESUMEc                 C   s   |  |¡ d S r   r¿   r«   r   r   r    Úop_CACHEp  s    zTraceRunner.op_CACHEc                 C   s   |  |¡ d S r   r¿   r«   r   r   r    Ú
op_PRECALLs  s    zTraceRunner.op_PRECALLc                 C   s   |  | ¡ ¡ | |¡ d S r   )ÚpushÚ	make_nullrN   r«   r   r   r    Úop_PUSH_NULLv  s    zTraceRunner.op_PUSH_NULLc                 C   s   |  | ¡ ¡ | |¡ d S r   )rÄ   Ú	make_temprN   r«   r   r   r    Úop_RETURN_GENERATORz  s    
zTraceRunner.op_RETURN_GENERATORc                 C   sZ   |j dkr"d}t||  |j¡d‚| ¡ }| ¡ }| ¡ }|j||||d | |¡ dS )aF  
        FORMAT_VALUE(flags): flags argument specifies format spec which is
        not supported yet. Currently, we just call str() on the value.
        Pops a value from stack and pushes results back.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-FORMAT_VALUE
        r   z*format spec in f-strings not supported yetr¸   )r   ÚresÚstrvarN)Úargr   r¶   rµ   r»   rÇ   rN   rÄ   )r   ra   r¬   r°   r   rÊ   rÉ   r   r   r    Úop_FORMAT_VALUE‡  s    
zTraceRunner.op_FORMAT_VALUEc                    st   |j }tt‡ fdd„t|ƒD ƒƒƒ}|dkr8ˆ  ¡ g}n‡ fdd„t|d ƒD ƒ}ˆ j|||d ˆ  |d ¡ dS )	zú
        BUILD_STRING(count): Concatenates count strings from the stack and
        pushes the resulting string onto the stack.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-BUILD_STRING
        c                    s   g | ]}ˆ   ¡ ‘qS r   ©r»   ©Ú.0Ú_©ra   r   r    Ú
<listcomp>   s     z/TraceRunner.op_BUILD_STRING.<locals>.<listcomp>r   c                    s   g | ]}ˆ   ¡ ‘qS r   ©rÇ   rÎ   rÑ   r   r    rÒ   ¥  s     r¾   )ÚstringsÚtmpsr·   N©rË   r¢   ÚreversedÚrangerÇ   rN   rÄ   )r   ra   r¬   ÚcountrÔ   rÕ   r   rÑ   r    Úop_BUILD_STRING˜  s    zTraceRunner.op_BUILD_STRINGc                 C   s   |  ¡  d S r   rÍ   r«   r   r   r    Ú
op_POP_TOP©  s    zTraceRunner.op_POP_TOPrd   c                 C   sH   |  ¡ }|jd? }|j|||d |jd@ r:| | ¡ ¡ | |¡ d S )Nr¾   )ÚidxrÉ   )rÇ   rË   rN   rÄ   rÅ   )r   ra   r¬   rÉ   rÜ   r   r   r    Úop_LOAD_GLOBAL­  s    

zTraceRunner.op_LOAD_GLOBALc                 C   s$   |  ¡ }|j||d | |¡ d S ©N©rÉ   ©rÇ   rN   rÄ   ©r   ra   r¬   rÉ   r   r   r    rÝ   ¶  s    c                 C   s   |  |¡ d S r   r¿   r«   r   r   r    Úop_COPY_FREE_VARS½  s    zTraceRunner.op_COPY_FREE_VARSc                 C   s   |  |¡ d S r   r¿   r«   r   r   r    Úop_MAKE_CELLÀ  s    zTraceRunner.op_MAKE_CELLc                 C   s$   |  ¡ }|j||d | |¡ d S rÞ   rà   rá   r   r   r    Úop_LOAD_DEREFÃ  s    zTraceRunner.op_LOAD_DEREFc                 C   s&   |  d¡}| |¡ |j||d d S )NÚconstrß   )rÇ   rÄ   rN   rá   r   r   r    Úop_LOAD_CONSTÈ  s    

zTraceRunner.op_LOAD_CONSTc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S ©N)ÚitemrÉ   ©r»   rÇ   rN   rÄ   )r   ra   r¬   rè   rÉ   r   r   r    Úop_LOAD_ATTRÍ  s    zTraceRunner.op_LOAD_ATTRc                 C   s0   |  |¡}| |¡}|j||d | |¡ d S rÞ   )Úget_varnamerÇ   rN   rÄ   )r   ra   r¬   ÚnamerÉ   r   r   r    Úop_LOAD_FASTÓ  s    

zTraceRunner.op_LOAD_FASTc                 C   s   |  |¡ d S r   r¿   r«   r   r   r    Úop_DELETE_FASTÙ  s    zTraceRunner.op_DELETE_FASTc                 C   s   |  ¡ }|j||d d S )N)r|   ©r»   rN   )r   ra   r¬   r|   r   r   r    Úop_DELETE_ATTRÜ  s    zTraceRunner.op_DELETE_ATTRc                 C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r|   r   rï   )r   ra   r¬   r|   r   r   r   r    Úop_STORE_ATTRà  s    zTraceRunner.op_STORE_ATTRc                 C   s   |  ¡ }|j||d d S ©N)r   rï   ©r   ra   r¬   r   r   r   r    Úop_STORE_DEREFå  s    zTraceRunner.op_STORE_DEREFc                 C   s   |  ¡ }|j||d d S rò   rï   ró   r   r   r    Úop_STORE_FASTé  s    zTraceRunner.op_STORE_FASTc           	   	   C   sV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[TOS:]
        )ÚbaseÚstartrÉ   ÚslicevarÚindexvarÚnonevarNré   ©	r   ra   r¬   ÚtosÚtos1rÉ   rø   rù   rú   r   r   r    Ú
op_SLICE_1í  s     ù	zTraceRunner.op_SLICE_1c           	   	   C   sV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[:TOS]
        )rö   ÚstoprÉ   rø   rù   rú   Nré   rû   r   r   r    Ú
op_SLICE_2  s     ù	zTraceRunner.op_SLICE_2c           	   	   C   sV   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z&
        TOS = TOS2[TOS1:TOS]
        )rö   r÷   rÿ   rÉ   rø   rù   Nré   )	r   ra   r¬   rü   rý   Útos2rÉ   rø   rù   r   r   r    Ú
op_SLICE_3  s     ù	zTraceRunner.op_SLICE_3c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z
        TOS[:] = TOS1
        )rö   r   rø   rù   rú   N©r»   rÇ   rN   )r   ra   r¬   rü   r   rø   rù   rú   r   r   r    Úop_STORE_SLICE_0,  s    úzTraceRunner.op_STORE_SLICE_0c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )rö   r÷   rø   r   rù   rú   Nr  ©	r   ra   r¬   rü   rý   r   rø   rù   rú   r   r   r    Úop_STORE_SLICE_1>  s    ùzTraceRunner.op_STORE_SLICE_1c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[:TOS] = TOS2
        )rö   rÿ   r   rø   rù   rú   Nr  r  r   r   r    Úop_STORE_SLICE_2R  s    ùzTraceRunner.op_STORE_SLICE_2c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )rö   r÷   rÿ   r   rø   rù   Nr  )	r   ra   r¬   rü   rý   r  r   rø   rù   r   r   r    Úop_STORE_SLICE_3f  s    ùzTraceRunner.op_STORE_SLICE_3c                 C   s8   |  ¡ }| ¡ }| ¡ }| ¡ }|j|||||d dS )z
        del TOS[:]
        )rö   rø   rù   rú   Nr  )r   ra   r¬   rü   rø   rù   rú   r   r   r    Úop_DELETE_SLICE_0z  s       þzTraceRunner.op_DELETE_SLICE_0c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[TOS:]
        )rö   r÷   rø   rù   rú   Nr  ©r   ra   r¬   rü   rý   rø   rù   rú   r   r   r    Úop_DELETE_SLICE_1‡  s    úzTraceRunner.op_DELETE_SLICE_1c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[:TOS]
        )rö   rÿ   rø   rù   rú   Nr  r
  r   r   r    Úop_DELETE_SLICE_2™  s    úzTraceRunner.op_DELETE_SLICE_2c                 C   sB   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j||||||d dS )z$
        del TOS2[TOS1:TOS]
        )rö   r÷   rÿ   rø   rù   Nr  )r   ra   r¬   rü   rý   r  rø   rù   r   r   r    Úop_DELETE_SLICE_3«  s        þzTraceRunner.op_DELETE_SLICE_3c                 C   s–   |j }|dkr,| ¡ }| ¡ }|}|}d}n6|dkrZ| ¡ }| ¡ }| ¡ }	|	}|}|}ntdƒ‚| ¡ }
| ¡ }|j||||||
d | |¡ dS )z<
        slice(TOS1, TOS) or slice(TOS2, TOS1, TOS)
        é   Nre   Zunreachable)r÷   rÿ   ÚsteprÉ   rø   )rË   r»   Ú	ExceptionrÇ   rN   rÄ   )r   ra   r¬   Zargcrü   rý   r÷   rÿ   r  r  rø   rÉ   r   r   r    Úop_BUILD_SLICE¹  s4         ÿzTraceRunner.op_BUILD_SLICEc                 C   sH   |  ¡ }|j||d | ¡ }|j}|j|d ||krD|j|d d S )N©Úpredrg   )r»   rN   Úget_jump_targetru   rt   )r   ra   r¬   r  Ztarget_instZ	next_instr   r   r    Ú_op_POP_JUMP_IFÔ  s    zTraceRunner._op_POP_JUMP_IFc                 C   s:   |  ¡ }|j||d |j|jdd |j| ¡ d d S )Nr  r¾   ©rA   r‚   rg   )Úget_tosrN   rt   ru   r  )r   ra   r¬   r  r   r   r    Ú_op_JUMP_IF_OR_POPã  s    zTraceRunner._op_JUMP_IF_OR_POPc                 C   s   |   ||¡ d S r   ©r  r«   r   r   r    Úop_POP_JUMP_FORWARD_IF_NONEì  s    z'TraceRunner.op_POP_JUMP_FORWARD_IF_NONEc                 C   s   |   ||¡ d S r   r  r«   r   r   r    Úop_POP_JUMP_FORWARD_IF_NOT_NONEï  s    z+TraceRunner.op_POP_JUMP_FORWARD_IF_NOT_NONEc                 C   s   |   ||¡ d S r   r  r«   r   r   r    Úop_POP_JUMP_BACKWARD_IF_NONEò  s    z(TraceRunner.op_POP_JUMP_BACKWARD_IF_NONEc                 C   s   |   ||¡ d S r   r  r«   r   r   r    Ú op_POP_JUMP_BACKWARD_IF_NOT_NONEõ  s    z,TraceRunner.op_POP_JUMP_BACKWARD_IF_NOT_NONEc                 C   s   |   ||¡ d S r   r  r«   r   r   r    Úop_POP_JUMP_FORWARD_IF_FALSEø  s    z(TraceRunner.op_POP_JUMP_FORWARD_IF_FALSEc                 C   s   |   ||¡ d S r   r  r«   r   r   r    Úop_POP_JUMP_FORWARD_IF_TRUEû  s    z'TraceRunner.op_POP_JUMP_FORWARD_IF_TRUEc                 C   s   |   ||¡ d S r   r  r«   r   r   r    Úop_POP_JUMP_BACKWARD_IF_FALSEþ  s    z)TraceRunner.op_POP_JUMP_BACKWARD_IF_FALSEc                 C   s   |   ||¡ d S r   r  r«   r   r   r    Úop_POP_JUMP_BACKWARD_IF_TRUE  s    z(TraceRunner.op_POP_JUMP_BACKWARD_IF_TRUEc                 C   s   |  |¡ |j| ¡ d d S ©Nrg   ©rN   rt   r  r«   r   r   r    Úop_JUMP_FORWARD  s    
zTraceRunner.op_JUMP_FORWARDc                 C   s   |  |¡ |j| ¡ d d S r"  r#  r«   r   r   r    Úop_JUMP_BACKWARD  s    
zTraceRunner.op_JUMP_BACKWARDc                 C   s   |  |¡ |j| ¡ d d S r"  r#  r«   r   r   r    Úop_JUMP_ABSOLUTE  s    
zTraceRunner.op_JUMP_ABSOLUTEc                 C   s4   |  d¡d }|j||d | ¡  |j|d d S )Nr   rh   ri   rg   )r{   rN   Ú	pop_blockrt   )r   ra   r¬   rh   r   r   r    Úop_BREAK_LOOP  s    zTraceRunner.op_BREAK_LOOPc                 C   s$   |j || ¡ | ¡ d | ¡  d S )N)ÚretvalZcastval)rN   r»   rÇ   Ú	terminater«   r   r   r    Úop_RETURN_VALUE  s    zTraceRunner.op_RETURN_VALUEc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S ©N)r   rÉ   ré   ©r   ra   r¬   ÚvalrÉ   r   r   r    Úop_YIELD_VALUE  s    zTraceRunner.op_YIELD_VALUEc                 C   sv   |j dkr,d }| ¡ rHtd|  |j¡d‚n|j dkr@| ¡ }ntdƒ‚|j||d | ¡ rj|  |¡ n| 	¡  d S )Nr   ú4The re-raising of an exception is not yet supported.r¸   r¾   ú)Multiple argument raise is not supported.©Úexc)
rË   rp   r   r¶   rµ   r»   Ú
ValueErrorrN   rv   r*  ©r   ra   r¬   r3  r   r   r    Úop_RAISE_VARARGS"  s    

þ

zTraceRunner.op_RAISE_VARARGSc                 C   s~   t | d¡d k	| d¡d k	gƒ}|jdkrHd }|rdtd|  |j¡d‚n|jdkr\| ¡ }ntdƒ‚|j||d | 	¡  d S )	Nr   r   r   r0  r¸   r¾   r1  r2  )
Úanyr{   rË   r   r¶   rµ   r»   r4  rN   r*  )r   ra   r¬   Zin_exc_blockr3  r   r   r    r6  8  s     þ

þ

c                 C   s@   g }t tƒD ] }| ¡ }| |¡ | |¡ q|j||d d S )N)Útemps)rØ   r‡   rÇ   rN   rÄ   )r   ra   r¬   r8  ÚiÚtmpr   r   r    Úop_BEGIN_FINALLYM  s    
zTraceRunner.op_BEGIN_FINALLYc                 C   s   |  ¡ }| |d ¡ d S )Nr   )r'  Úreset_stack©r   ra   r¬   Úblkr   r   r    Úop_END_FINALLYU  s    zTraceRunner.op_END_FINALLYc                 C   s&   |j dkr"d}t||  |j¡d‚d S )Nr   zGUnsupported use of a bytecode related to try..finally or a with-contextr¸   )rË   r   r¶   rµ   )r   ra   r¬   r°   r   r   r    Úop_POP_FINALLYY  s    
zTraceRunner.op_POP_FINALLYc                 C   s   d S r   r   r«   r   r   r    Úop_CALL_FINALLY`  s    zTraceRunner.op_CALL_FINALLYc                 C   s   |  ¡  d S r   )r*  r«   r   r   r    Úop_WITH_EXCEPT_STARTc  s    z TraceRunner.op_WITH_EXCEPT_STARTc                 C   s   |  |¡ d S r   r¿   r«   r   r   r    Úop_WITH_CLEANUP_STARTf  s    z!TraceRunner.op_WITH_CLEANUP_STARTc                 C   s   |  |¡ d S r   r¿   r«   r   r   r    Úop_WITH_CLEANUP_FINISHj  s    z"TraceRunner.op_WITH_CLEANUP_FINISHc                 C   s   |  |jd| ¡ d¡ d S )Nr   ©r„   rh   )Ú
push_blockr}   r  r«   r   r   r    Úop_SETUP_LOOPn  s    þÿzTraceRunner.op_SETUP_LOOPc                 C   s´   |  ¡ }| ¡ }|jdd}| |¡ | |¡ |j}| |j¡}|g}|jD ]}	|	j|jkrN| |	¡ qNt	dd„ |D ƒƒ}
|j||||
d | 
|jd|
d¡ |j|jd d S )	NÚsetup_with_exitfn©Úprefixc                 s   s   | ]}|j V  qd S r   ri   )rÏ   r€   r   r   r    Ú	<genexpr>‰  s     z-TraceRunner.op_BEFORE_WITH.<locals>.<genexpr>)ÚcontextmanagerÚexitfnrh   r   rE  rg   )r»   rÇ   rÄ   r>   Úfind_exception_entryru   Zexception_entriesr|   rN   ÚmaxrF  r}   rt   )r   ra   r¬   ÚcmÚyieldedrM  ÚbcZehheadZ	ehrelatedr€   rh   r   r   r    Úop_BEFORE_WITHw  s(    


þÿzTraceRunner.op_BEFORE_WITHc                 C   sŠ   |  ¡ }| ¡ }|jdd}|j|||d tdk rL| |jd| ¡ d¡ | |¡ | |¡ | |jd| ¡ d¡ |j|j	d d S )	NrH  rI  )rL  rM  )re   é	   r   rE  r   rg   )
r»   rÇ   rN   r   rF  r}   r  rÄ   rt   ru   )r   ra   r¬   rP  rQ  rM  r   r   r    Úop_SETUP_WITH•  s(    þÿ

þÿzTraceRunner.op_SETUP_WITHc                 C   s0   |j |d dd}|j||j d|d|dd d S )NF)r„   rh   r<  r   )r„   rh   r<  rƒ   rm   )r}   rt   )r   r„   ra   ru   rh   Zhandler_blockr   r   r    Ú
_setup_try±  s    ýüþzTraceRunner._setup_tryc                 C   s&   |  ¡ }| | d¡¡ | |¡ d S )NÚ	exception)r»   rÄ   rÇ   )r   ra   r¬   rü   r   r   r    Úop_PUSH_EXC_INFOÅ  s    zTraceRunner.op_PUSH_EXC_INFOc                 C   s&   |  |¡ | jd||j| ¡ d d S )Nr   )ru   rh   )rN   rV  ru   r  r«   r   r   r    Úop_SETUP_FINALLYÊ  s    
   ÿzTraceRunner.op_SETUP_FINALLYc                 C   s   |  ¡  d S r   rÍ   r«   r   r   r    Úop_POP_EXCEPTÑ  s    zTraceRunner.op_POP_EXCEPTc                 C   sh   |  ¡ }|d tdƒtdƒhkr>td|d › |  |j¡d‚| ¡  | ¡  | ¡  |j|jd d S )Nr„   r   r   z$POP_EXCEPT got an unexpected block: r¸   rg   )r'  r   r   r¶   rµ   r»   rt   ru   r=  r   r   r    rZ  Õ  s    
þc                 C   sX   |  ¡ }|d tdƒkr(|j|dd n|d tdƒkrF|j|dd |j|jd d S )Nr„   r   Útry)r„   r   Úwithrg   )r'  r   rN   rt   ru   r=  r   r   r    Úop_POP_BLOCKä  s    zTraceRunner.op_POP_BLOCKc                 C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)Úindexr|   rÉ   ré   )r   ra   r¬   r^  r|   rÉ   r   r   r    Úop_BINARY_SUBSCRì  s
    zTraceRunner.op_BINARY_SUBSCRc                 C   s.   |  ¡ }|  ¡ }|  ¡ }|j||||d d S )N)r|   r^  r   rï   )r   ra   r¬   r^  r|   r   r   r   r    Úop_STORE_SUBSCRó  s    zTraceRunner.op_STORE_SUBSCRc                 C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r|   r^  rï   )r   ra   r¬   r^  r|   r   r   r    Úop_DELETE_SUBSCRù  s    zTraceRunner.op_DELETE_SUBSCRc           
         s‚   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }t|ƒrB|}n|}|f|•}ˆ  ¡ }ˆ  ¡ }	ˆ j||||	|d ˆ  	|¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ      s     z'TraceRunner.op_CALL.<locals>.<listcomp>)Úfuncr6   Úkw_namesrÉ   )
rË   r¢   r×   rØ   r»   r´   rÇ   Úpop_kw_namesrN   rÄ   )
r   ra   r¬   Únargr6   Zcallable_or_firstargZnull_or_callableÚcallablerÉ   rc  r   rÑ   r    Úop_CALLþ  s    
zTraceRunner.op_CALLc                 C   s   |  |j¡ d S r   )Úset_kw_namesrË   r«   r   r   r    Úop_KW_NAMES  s    zTraceRunner.op_KW_NAMESc                    sT   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ     s     z0TraceRunner.op_CALL_FUNCTION.<locals>.<listcomp>)rb  r6   rÉ   )rË   r¢   r×   rØ   r»   rÇ   rN   rÄ   )r   ra   r¬   re  r6   rb  rÉ   r   rÑ   r    Úop_CALL_FUNCTION  s    zTraceRunner.op_CALL_FUNCTIONc                    s^   |j }ˆ  ¡ }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ     s     z3TraceRunner.op_CALL_FUNCTION_KW.<locals>.<listcomp>)rb  r6   ÚnamesrÉ   )rË   r»   r¢   r×   rØ   rÇ   rN   rÄ   )r   ra   r¬   re  rk  r6   rb  rÉ   r   rÑ   r    Úop_CALL_FUNCTION_KW  s    zTraceRunner.op_CALL_FUNCTION_KWc                 C   sŽ   |j d@ rtdk rd}t|ƒ‚|j d@ r2| ¡ }nd }| ¡ }| ¡ }tdkrdt| d¡ƒrd| ¡  | ¡ }|j|||||d | |¡ d S )Nr¾   )re   é
   z,CALL_FUNCTION_EX with **kwargs not supportedrd   )rb  ÚvarargÚvarkwargrÉ   )	rË   r   r   r»   r´   ÚpeekrÇ   rN   rÄ   )r   ra   r¬   Úerrmsgro  rn  rb  rÉ   r   r   r    Úop_CALL_FUNCTION_EX$  s    

zTraceRunner.op_CALL_FUNCTION_EXc                    sp   ‡ fdd„t |ƒD ƒ}| ¡  ‡ fdd„t |ƒD ƒ}ˆ j|||d |D ]}ˆ  |¡ qH|D ]}ˆ  |¡ q\d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ   8  s     z)TraceRunner._dup_topx.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   rÓ   rÎ   rÑ   r   r    rÒ   <  s     )ÚorigÚduped)rØ   ÚreverserN   rÄ   )r   ra   r¬   rÙ   rs  rt  r.  r   rÑ   r    Ú	_dup_topx7  s    zTraceRunner._dup_topxc                 C   s6   |j }d|  krdks$n tdƒ‚|  |||¡ d S )Nr¾   é   zInvalid DUP_TOPX count)rË   r   rv  )r   ra   r¬   rÙ   r   r   r    Úop_DUP_TOPXC  s    zTraceRunner.op_DUP_TOPXc                 C   s   | j ||dd d S )Nr¾   ©rÙ   ©rv  r«   r   r   r    Ú
op_DUP_TOPH  s    zTraceRunner.op_DUP_TOPc                 C   s   | j ||dd d S )Nr  ry  rz  r«   r   r   r    Úop_DUP_TOP_TWOK  s    zTraceRunner.op_DUP_TOP_TWOc                 C   s   |  | |j¡¡ d S r   )rÄ   rp  rË   r«   r   r   r    Úop_COPYN  s    zTraceRunner.op_COPYc                 C   s   |  |j¡ d S r   )ÚswaprË   r«   r   r   r    Úop_SWAPQ  s    zTraceRunner.op_SWAPc                 C   s(   |  ¡ }|  ¡ }| |¡ | |¡ d S r   ©r»   rÄ   )r   ra   r¬   ÚfirstÚsecondr   r   r    Ú
op_ROT_TWOT  s    
zTraceRunner.op_ROT_TWOc                 C   s:   |  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ d S r   r€  )r   ra   r¬   r  r‚  Úthirdr   r   r    Úop_ROT_THREEZ  s    

zTraceRunner.op_ROT_THREEc                 C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ | |¡ d S r   r€  )r   ra   r¬   r  r‚  r„  Úforthr   r   r    Úop_ROT_FOURb  s    


zTraceRunner.op_ROT_FOURc                    sZ   |j }ˆ  ¡ }‡ fdd„t|ƒD ƒ}ˆ  ¡ }ˆ j||||d t|ƒD ]}ˆ  |¡ qFd S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÓ   rÎ   rÑ   r   r    rÒ   o  s     z2TraceRunner.op_UNPACK_SEQUENCE.<locals>.<listcomp>)ÚiterableÚstoresÚtupleobj)rË   r»   rØ   rÇ   rN   r×   rÄ   )r   ra   r¬   rÙ   rˆ  r‰  rŠ  Ústr   rÑ   r    Úop_UNPACK_SEQUENCEl  s    zTraceRunner.op_UNPACK_SEQUENCEc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ   w  s     z.TraceRunner.op_BUILD_TUPLE.<locals>.<listcomp>©r›   rÉ   rÖ   )r   ra   r¬   rÙ   r›   Útupr   rÑ   r    Úop_BUILD_TUPLEu  s
    zTraceRunner.op_BUILD_TUPLEc                    s|   t t‡ fdd„t|jƒD ƒƒƒ}‡ fdd„tt|ƒd ƒD ƒ}t|ƒdk}|rXˆ  ¡ g}ˆ j||||d ˆ  |d ¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ   ~  s     z3TraceRunner._build_tuple_unpack.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   rÓ   rÎ   rÑ   r   r    rÒ     s     r¾   )Útuplesr8  Ú	is_assignr·   )r¢   r×   rØ   rË   ÚlenrÇ   rN   rÄ   )r   ra   r¬   r  r8  r‘  r   rÑ   r    Ú_build_tuple_unpack|  s     
zTraceRunner._build_tuple_unpackc                 C   s   |   ||¡ d S r   ©r“  r«   r   r   r    Úop_BUILD_TUPLE_UNPACK_WITH_CALL‹  s    z+TraceRunner.op_BUILD_TUPLE_UNPACK_WITH_CALLc                 C   s   |   ||¡ d S r   r”  r«   r   r   r    Úop_BUILD_TUPLE_UNPACK  s    z!TraceRunner.op_BUILD_TUPLE_UNPACKc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S )N)Ú
const_listrÉ   ré   )r   ra   r¬   rü   rÉ   r   r   r    Úop_LIST_TO_TUPLE’  s    zTraceRunner.op_LIST_TO_TUPLEc                    sj   ˆ   ¡ }tt‡ fdd„t|jƒD ƒƒƒ}‡ fdd„t|jƒD ƒ}ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ   œ  s     z6TraceRunner.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   rÓ   rÎ   rÑ   r   r    rÒ     s     )ÚkeysÚkeytmpsÚvaluesrÉ   )r»   r¢   r×   rØ   rË   rÇ   rN   rÄ   )r   ra   r¬   r™  Úvalsrš  rÉ   r   rÑ   r    Úop_BUILD_CONST_KEY_MAPš  s     z"TraceRunner.op_BUILD_CONST_KEY_MAPc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ   ¤  s     z-TraceRunner.op_BUILD_LIST.<locals>.<listcomp>r  rÖ   )r   ra   r¬   rÙ   r›   Úlstr   rÑ   r    Úop_BUILD_LIST¢  s
    zTraceRunner.op_BUILD_LISTc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S )N)r|   r   Ú	appendvarrÉ   ©r»   rË   rp  rÇ   rN   )r   ra   r¬   r   r^  r|   r   rÉ   r   r   r    Úop_LIST_APPEND©  s    
ÿzTraceRunner.op_LIST_APPENDc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S )N)r|   r   Ú	extendvarrÉ   r¡  )r   ra   r¬   r   r^  r|   r£  rÉ   r   r   r    Úop_LIST_EXTEND²  s    
ÿzTraceRunner.op_LIST_EXTENDc           	      C   sj   |  ¡ }|j}g }t|ƒD ]$}| ¡ | ¡  }}| ||f¡ q|j||d d d… ||d | |¡ d S )Nr·   )r›   ÚsizerÉ   )rÇ   rË   rØ   r»   rN   rÄ   )	r   ra   r¬   ÚdctrÙ   r›   r9  ÚvÚkr   r   r    Úop_BUILD_MAP»  s    zTraceRunner.op_BUILD_MAPc                 C   sT   |  ¡ }|  ¡ }|| }}|j}| |¡}| ¡ }	| ¡ }
|j|||||	|
d d S )N)r|   rI   r   Ú
setitemvarrÉ   r¡  )r   ra   r¬   ZTOSZTOS1rI   r   r^  r|   rª  rÉ   r   r   r    Ú
op_MAP_ADDÆ  s    

 ÿzTraceRunner.op_MAP_ADDc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÍ   rÎ   rÑ   r   r    rÒ   Ô  s     z,TraceRunner.op_BUILD_SET.<locals>.<listcomp>r  rÖ   )r   ra   r¬   rÙ   r›   rÉ   r   rÑ   r    Úop_BUILD_SETÑ  s
    zTraceRunner.op_BUILD_SETc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S ©N)r|   r   Ú	updatevarrÉ   r¡  ©r   ra   r¬   r   r^  r|   r®  rÉ   r   r   r    Úop_SET_UPDATEÙ  s    
ÿzTraceRunner.op_SET_UPDATEc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S r­  r¡  r¯  r   r   r    Úop_DICT_UPDATEâ  s    
ÿzTraceRunner.op_DICT_UPDATEc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S r,  ré   )r   ra   r¬   r   rÉ   r   r   r    Úop_GET_ITERë  s    zTraceRunner.op_GET_ITERc                 C   sf   |  ¡ }| ¡ }| ¡ }| ¡ }|j|||||d | |¡ | ¡ }|j|dd |j|jd d S )N)ÚiteratorÚpairÚindvalr  r  r  rg   )r  rÇ   rN   rÄ   r  rt   ru   )r   ra   r¬   r³  r´  rµ  r  rh   r   r   r    Úop_FOR_ITERñ  s    ÿ
zTraceRunner.op_FOR_ITERc                 C   s   dS )a(  Pops TOS. If TOS was not None, raises an exception. The kind
        operand corresponds to the type of generator or coroutine and
        determines the error message. The legal kinds are 0 for generator,
        1 for coroutine, and 2 for async generator.

        New in version 3.10.
        Nr   r«   r   r   r    Úop_GEN_STARTý  s    	zTraceRunner.op_GEN_STARTc                 C   s^   t j|j d }| ¡ }| ¡ }t| j}|jd|› d}|j|||||d | |¡ d S )Nr¾   Zbinop_rI  )ÚopÚlhsrŸ   rÉ   )	ÚdisZ_nb_opsrË   r»   r	   r0   rÇ   rN   rÄ   )r   ra   r¬   r¸  rŸ   r¹  Zop_namerÉ   r   r   r    Úop_BINARY_OP  s    
zTraceRunner.op_BINARY_OPc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S r,  ré   r-  r   r   r    Ú_unaryop  s    zTraceRunner._unaryopc                 C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)r¹  rŸ   rÉ   ré   )r   ra   r¬   rŸ   r¹  rÉ   r   r   r    Ú	_binaryop  s
    zTraceRunner._binaryopFc              
   C   s¸   t dkrd }nt dk r | ¡ }ntt ƒ‚| ¡ }d  } } }}	|jd@ rR| ¡ }|jd@ rd| ¡ }|jd@ rv| ¡ }|jd@ rˆ| ¡ }	| ¡ }
|j|||||||	|
d | |
¡ d S )Nrd   é   é   r  r¾   )rì   ÚcodeÚclosureÚannotationsÚ
kwdefaultsÚdefaultsrÉ   )r   r»   r±   rË   rÇ   rN   rÄ   )r   ra   r¬   ÚMAKE_CLOSURErì   rÀ  rÁ  rÂ  rÃ  rÄ  rÉ   r   r   r    Úop_MAKE_FUNCTIONG  s6    




ø
zTraceRunner.op_MAKE_FUNCTIONc                 C   s   | j ||dd d S )NT)rÅ  )rÆ  r«   r   r   r    Úop_MAKE_CLOSUREg  s    zTraceRunner.op_MAKE_CLOSUREc                 C   s$   |  ¡ }|j||d | |¡ d S rÞ   rà   rá   r   r   r    Úop_LOAD_CLOSUREj  s    zTraceRunner.op_LOAD_CLOSUREc                 C   s&   |  d¡}|j||d | |¡ d S )NZassertion_errorrß   rà   rá   r   r   r    Úop_LOAD_ASSERTION_ERRORo  s    
z#TraceRunner.op_LOAD_ASSERTION_ERRORc                 C   s:   |  d¡}| ¡ }| ¡ }|j||||d | |¡ d S )NÚ	predicate©r  rü   rý   )rÇ   r»   r  rN   rÄ   ©r   ra   r¬   r  rü   rý   r   r   r    Úop_CHECK_EXC_MATCHt  s
    
zTraceRunner.op_CHECK_EXC_MATCHc                 C   sN   |  d¡}| ¡ }| ¡ }|j||||d |j|jd |j| ¡ d d S )NrÊ  rË  rg   )rÇ   r»   rN   rt   ru   r  rÌ  r   r   r    Úop_JUMP_IF_NOT_EXC_MATCH{  s    
z$TraceRunner.op_JUMP_IF_NOT_EXC_MATCHc                 C   sH   |  ¡ }|jdkr|  ¡  |j||d | ¡ r<|  |¡ n| ¡  d S )Nr   r2  )r»   rË   rN   rp   rv   r*  r5  r   r   r    Ú
op_RERAISE†  s    
zTraceRunner.op_RERAISEc                 C   s"   |  ¡ }|j||d | ¡  d S )Nr2  )r»   rN   r*  r5  r   r   r    rÏ  ’  s    c                 C   s@   |  ¡ }| ¡ }| |¡ | ¡ }|j|||d | |¡ d S rç   )r»   rÅ   rÄ   rÇ   rN   )r   ra   r¬   rè   ÚextrarÉ   r   r   r    Úop_LOAD_METHODž  s    
zTraceRunner.op_LOAD_METHODc                 C   s   |   ||¡ d S r   )rê   r«   r   r   r    rÑ  ¦  s    c                 C   s   |   ||¡ d S r   )rj  r«   r   r   r    Úop_CALL_METHOD«  s    zTraceRunner.op_CALL_METHODN)F)¡r0   r1   r2   r3   r!   r¶   rR   rv   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  r  r  r  r	  r  r  r  r  r  Zop_POP_JUMP_IF_TRUEZop_POP_JUMP_IF_FALSEr  Zop_JUMP_IF_FALSE_OR_POPZop_JUMP_IF_TRUE_OR_POPr  r  r  r  r  r  r   r!  r$  r%  r&  r(  r+  r/  r6  r;  r?  r@  rA  rB  rC  rD  rG  rS  rU  rV  rX  rY  rZ  r]  r_  r`  ra  rg  ri  rj  rl  rr  rv  rx  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¼  Zop_UNARY_NEGATIVEZop_UNARY_POSITIVEZop_UNARY_NOTZop_UNARY_INVERTr½  Zop_COMPARE_OPZop_IS_OPZop_CONTAINS_OPZop_INPLACE_ADDZop_INPLACE_SUBTRACTZop_INPLACE_MULTIPLYZop_INPLACE_DIVIDEZop_INPLACE_TRUE_DIVIDEZop_INPLACE_FLOOR_DIVIDEZop_INPLACE_MODULOZop_INPLACE_POWERZop_INPLACE_MATRIX_MULTIPLYZop_INPLACE_LSHIFTZop_INPLACE_RSHIFTZop_INPLACE_ANDZop_INPLACE_ORZop_INPLACE_XORZop_BINARY_ADDZop_BINARY_SUBTRACTZop_BINARY_MULTIPLYZop_BINARY_DIVIDEZop_BINARY_TRUE_DIVIDEZop_BINARY_FLOOR_DIVIDEZop_BINARY_MODULOZop_BINARY_POWERZop_BINARY_MATRIX_MULTIPLYZop_BINARY_LSHIFTZop_BINARY_RSHIFTZop_BINARY_ANDZop_BINARY_ORZop_BINARY_XORrÆ  rÇ  rÈ  rÉ  rÍ  rÎ  rÏ  rÑ  rÒ  r   r   r   r    rK   4  s`  





	



	

						
 








rK   c                   @   sX  e Zd ZdZdQdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zdd „ Zd!d"„ ZdRd$d%„Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ ZdSd8d9„Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dTdIdJ„Z&dKdL„ Z'dMdN„ Z(dOdP„ Z)d7S )UÚ_StatezState of the trace
    r   c                 C   s¤   || _ || _|| _|| _g | _t|ƒ| _t|ƒ| _g | _	g | _
g | _d| _i | _tƒ | _tƒ | _t|ƒD ]6}||kr€|  d¡}n
|  d¡}|| j|< |  |¡ qhdS )aG  
        Parameters
        ----------
        bytecode : numba.bytecode.ByteCode
            function bytecode
        pc : int
            program counter
        nstack : int
            stackdepth at entry
        blockstack : Sequence[Dict]
            A sequence of dictionary denoting entries on the blockstack.
        Fúnull$rž   N)r>   Ú_pc_initialrz   Ú_nstack_initialrQ   ÚtupleÚ_blockstack_initialr¢   rº   Ú_temp_registersÚ_instsÚ	_outedgesÚ_terminatedr”   r   rš   r’   r“   rØ   rÇ   rÄ   )r   r@   rA   rB   rC   Únullvalsr9  rž   r   r   r    r!   ³  s(    



z_State.__init__c                 C   s   d  | j| j¡S )Nz&State(pc_initial={} nstack_initial={}))r*   rÕ  rÖ  r$   r   r   r    r/   Ö  s     ÿz_State.__repr__c                 C   s   | j | jfS r   )rÕ  rÖ  r$   r   r   r    Úget_identityÛ  s    z_State.get_identityc                 C   s   t |  ¡ ƒS r   )r"   rÞ  r$   r   r   r    r%   Þ  s    z_State.__hash__c                 C   s   |   ¡ |  ¡ k S r   ©rÞ  r+   r   r   r    r-   á  s    z_State.__lt__c                 C   s   |   ¡ |  ¡ kS r   rß  r+   r   r   r    r.   ä  s    z_State.__eq__c                 C   s   | j S )z]The starting bytecode offset of this State.
        The PC given to the constructor.
        )rÕ  r$   r   r   r    rE   ç  s    z_State.pc_initialc                 C   s   | j S )ziThe list of instructions information as a 2-tuple of
        ``(pc : int, register_map : Dict)``
        )rÚ  r$   r   r   r    Úinstructionsî  s    z_State.instructionsc                 C   s   | j S )zaThe list of outgoing edges.

        Returns
        -------
        edges : List[State]
        ©rÛ  r$   r   r   r    rX   õ  s    z_State.outgoing_edgesc                 C   s   | j S )z‹The dictionary of outgoing phi nodes.

        The keys are the name of the PHI nodes.
        The values are the outgoing states.
        )rš   r$   r   r   r    Úoutgoing_phisÿ  s    z_State.outgoing_phisc                 C   s   | j S )z6A copy of the initial state of the blockstack
        )rØ  r$   r   r   r    Úblockstack_initial  s    z_State.blockstack_initialc                 C   s
   t | jƒS )zYThe current size of the stack

        Returns
        -------
        res : int
        )r’  rQ   r$   r   r   r    rk     s    z_State.stack_depthc                 C   s,   t | jƒD ]}|d tdƒkr
|  S q
dS )z&Find the initial *try* block.
        r„   r   N)r×   rØ  r   )r   r>  r   r   r    Úfind_initial_try_block  s    z_State.find_initial_try_blockc                 C   s   | j S r   ©rÜ  r$   r   r   r    rS     s    z_State.has_terminatedc                 C   s   | j | j S r   )r>   rz   r$   r   r   r    rq   "  s    z_State.get_instc                 C   s   |   ¡ }|j| _d S r   )rq   ru   rz   ©r   r¬   r   r   r    rw   %  s    z_State.advance_pcÚ c                 C   sR   |s*dj || j|  ¡ j ¡ t| jƒd}ndj || jt| jƒd}| j |¡ |S )Nz"${prefix}{offset}{opname}.{tempct})rJ  r©   rr   Útempctz${prefix}{offset}.{tempct})rJ  r©   rè  )r*   rz   rq   rr   Úlowerr’  rÙ  rN   )r   rJ  rì   r   r   r    rÇ   )  s    üýz_State.make_tempc                 K   s0   | j  |j|f¡ |  jtt| ¡ ƒƒO  _dS )zAppend new instN)rÚ  rN   r©   r“   r’   Ú_flatten_inst_regsr›  )r   r¬   r7   r   r   r    rN   ;  s    z_State.appendc                 C   s
   |   d¡S )Nr¾   )rp  r$   r   r   r    r  @  s    z_State.get_tosc                 C   s   | j |  S )z-Return the k'th element on the stack
        ©rQ   )r   r¨  r   r   r    rp  C  s    z_State.peekc                 C   s   | j  |¡ dS )zPush to stackN)rQ   rN   )r   rè   r   r   r    rÄ   H  s    z_State.pushc                 C   s
   | j  ¡ S )zPop the stack)rQ   r»   r$   r   r   r    r»   L  s    z
_State.popc                 C   s(   | j }||  |d  |d< || < dS )zSwap stack[idx] with the tosr·   Nrë  )r   rÜ   Úsr   r   r    r~  P  s    z_State.swapc                 C   s   d|kst ‚| j |¡ dS )z#Push a block to blockstack
        rk   N)r   rº   rN   )r   Zsynblkr   r   r    rF  U  s    z_State.push_blockc                 C   s$   | j d|… | j |d…  | _ }|S )zVReset the stack to the given stack depth.
        Returning the popped items.
        Nrë  )r   r~   Úpoppedr   r   r    r<  [  s     z_State.reset_stackTNc                 C   s>   t |ƒ|t| jƒdœ}|r*t| jƒ|d< nd|d< ||d< |S )zMake a new block
        )r„   rh   r   rk   Nrƒ   )r   r’  rQ   )r   r„   rh   r<  rƒ   Údr   r   r    r}   b  s    ýz_State.make_blockc                 C   s   | j  ¡ }|  |d ¡ |S )z)Pop a block and unwind the stack
        rk   )rº   r»   r<  ©r   rŽ   r   r   r    r'  q  s    
z_State.pop_blockc                 C   s@   | j  |¡}d|  kr&t| j ƒk s,n t‚| j d|… | _ dS )zcFind *blk* in the blockstack and remove it and all blocks above it
        from the stack.
        r   N)rº   r^  r’  r   )r   r>  rÜ   r   r   r    r†   x  s     z_State.pop_block_and_abovec                 C   s0   t |ƒ}t| jƒD ]}|d |kr|  S qdS )ú1Find the first block that matches *kind*
        r„   N)r   r×   rº   )r   r„   Úbsr   r   r    r{   €  s    z_State.get_top_blockc                 G   s6   dd„ |D ƒ}t | jƒD ]}|d |kr|  S qdS )rð  c                 S   s   h | ]}t |ƒ’qS r   )r   )rÏ   r„   r   r   r    Ú	<setcomp>‹  s     z._State.get_top_block_either.<locals>.<setcomp>r„   N)r×   rº   )r   Úkindsrñ  r   r   r    Úget_top_block_eitherˆ  s    z_State.get_top_block_eitherc                 C   s   |   d¡dk	S )zGReturns a boolean indicating if the top-block is a *try* block
        r   N)r{   r$   r   r   r    rp     s    z_State.has_active_tryc                 C   s   | j j|j S )z4Get referenced variable name from the oparg
        )r>   Úco_varnamesrË   ræ  r   r   r    rë   •  s    z_State.get_varnamec                 C   s
   d| _ dS )z!Mark block as terminated
        TNrå  r$   r   r   r    r*  š  s    z_State.terminater   c                 C   s  t | jƒ}|rHd|  kr(t| jƒks.n t‚t| jƒ| }|d|… }|rtd|ksXt‚t|ƒD ]}| |  ¡ ¡ q`t | jƒ}tdkr¼|rÎ|d }	|	 	d¡p¢|	d }
||
krº| 
¡  q†qÎq†ntdk rÆnttƒ‚|rÜ| |¡ | j t|t|ƒ|t|ƒd¡ |  ¡  dS )zFork the state
        r   Nrd   r·   rj   rh   )rA   Ústackr…   rC   )r¢   rQ   r’  r   rØ   rN   rÇ   rº   r   Úgetr»   r±   rÛ  ÚEdger×  r*  )r   rA   r‚   r…   rn   rö  rB   r9  rC   Útoprh   r   r   r    rt   Ÿ  s:    
 


  þz_State.forkc                 C   s   | j | jd dS )zSplit the state
        rg   N)rt   rz   r$   r   r   r    rW   Ä  s    z_State.split_new_blockc              	   C   sz   | j r
t‚g }| jD ]`}t| j|jt|jƒ|jdd„ t	|jƒD ƒd}| 
|¡ |j ¡ D ]\}}|j| | j |< qZq|S )z+Get states for each outgoing edges
        c                 S   s   g | ]\}}t |ƒr|‘qS r   )r´   )rÏ   r9  r§  r   r   r    rÒ   Ò  s    ÿz._State.get_outgoing_states.<locals>.<listcomp>)r@   rA   rB   rC   rÝ  )rš   r   rÛ  rJ   r>   rA   r’  rö  rC   Ú	enumeraterN   r”   r›   )r   Úretr   ra   rž   r9  r   r   r    rZ   É  s    


 þ
z_State.get_outgoing_statesc                 C   s   dd„ | j D ƒS )z–
        Returns
        -------
        Dict[int, int]
            where keys are the PC
            values are the edge-pushed stack values
        c                 S   s&   i | ]}|j t|j|j d … ƒ“qS r   )rA   r×  rö  r…   )rÏ   r   r   r   r    Ú
<dictcomp>ã  s   ÿ z2_State.get_outgoing_edgepushed.<locals>.<dictcomp>rá  r$   r   r   r    Úget_outgoing_edgepushedÚ  s    	ÿz_State.get_outgoing_edgepushed)r   )rç  )TN)r   r   N)*r0   r1   r2   r3   r!   r/   rÞ  r%   r-   r.   ÚpropertyrE   rà  rX   râ  rã  rk   rä  rS   rq   rw   rÇ   rN   r  rp  rÄ   r»   r~  rF  r<  r}   r'  r†   r{   rô  rp   rë   r*  rt   rW   rZ   rý  r   r   r   r    rÓ  ¯  sX   
#


	


	


%rÓ  c                       sL   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )Ú
StatePy311c                    s   t ƒ j||Ž d | _d S r   )Úsuperr!   Ú	_kw_namesr8   ©Ú	__class__r   r    r!   è  s    zStatePy311.__init__c                 C   s   | j }d | _ |S r   )r  )r   Úoutr   r   r    rd  ì  s    zStatePy311.pop_kw_namesc                 C   s   | j d kst‚|| _ d S r   )r  r   )r   r.  r   r   r    rh  ñ  s    zStatePy311.set_kw_namesc                 C   s   | j }| | j¡d k	S r   ©r>   rN  rz   ©r   rR  r   r   r    rx   õ  s    zStatePy311.is_in_exceptionc                 C   s   | j }| | j¡S r   r  r  r   r   r    ry   ù  s    zStatePy311.get_exceptionc                 C   s&   | j D ]}|d tdƒkr dS qd S )Nr„   r   T)rØ  r   )r   Úentr   r   r    ro   ý  s    
zStatePy311.in_withc                 C   s   | j ddS )NrÔ  rI  rÓ   r$   r   r   r    rÅ     s    zStatePy311.make_null)r0   r1   r2   r!   rd  rh  rx   ry   ro   rÅ   Ú__classcell__r   r   r  r    rÿ  ç  s   rÿ  rd   rø  rA   rö  rC   r…   c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )ÚAdaptDFAz<Adapt Flow to the old DFA class expected by Interpreter
    c                 C   s
   || _ d S r   )Ú_flow)r   Úflowr   r   r    r!     s    zAdaptDFA.__init__c                 C   s   | j jS r   )r
  r?   r$   r   r   r    Úinfos  s    zAdaptDFA.infosN)r0   r1   r2   r3   r!   rþ  r  r   r   r   r    r	    s   r	  ÚAdaptBlockInfoÚinstsrâ  Úactive_try_blockÚoutgoing_edgepushedc                 C   s$   t t| jƒ| j| j|  ¡ |  ¡ dS )N)r  râ  rC   r  r  )r  r×  rà  râ  rã  rä  rý  rÑ   r   r   r    r_   #  s    ûr_   c                 c   sB   | D ]8}t |tƒr|V  qt |ttfƒrt|ƒD ]
}|V  q0qdS )z<Flatten an iterable of registers used in an instruction
    N)r(   Ústrr×  r¢   rê  )rˆ  rè   rF   r   r   r    rê  -  s    
rê  c                   @   sL   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dS )ÚAdaptCFAz<Adapt Flow to the old CFA class expected by Interpreter
    c                 C   s‚   || _ i | _|j ¡ D ]\}}t||ƒ| j|< q| j j ¡ }|j}| ¡ }tƒ }| j 	¡ D ]}| 
|¡rZ| |¡ qZ|| | _d S r   )r
  Ú_blocksr?   r›   ÚAdaptCFBlockrŒ   Úbackboner’   Úblocksr™  Zin_loopsrY   Ú	_backbone)r   r  r©   Ú	blockinfor  r   ZinloopblocksrŽ   r   r   r    r!   ;  s    
zAdaptCFA.__init__c                 C   s   | j jS r   )r
  rŒ   r$   r   r   r    r   N  s    zAdaptCFA.graphc                 C   s   | j S r   )r  r$   r   r   r    r  R  s    zAdaptCFA.backbonec                 C   s   | j S r   )r  r$   r   r   r    r  V  s    zAdaptCFA.blocksc                 c   s    t | jƒD ]}| j| V  q
d S r   )r^   r  rï  r   r   r    ÚiterliveblocksZ  s    zAdaptCFA.iterliveblocksc                 C   s   | j j ¡  d S r   )r
  rŒ   r=   r$   r   r   r    r=   ^  s    zAdaptCFA.dumpN)r0   r1   r2   r3   r!   rþ  r   r  r  r  r=   r   r   r   r    r  8  s   


r  c                   @   s   e Zd Zdd„ ZdS )r  c                 C   s    || _ tdd„ |jD ƒƒ| _d S )Nc                 s   s   | ]\}}|V  qd S r   r   )rÏ   r9  rÐ   r   r   r    rK  e  s     z(AdaptCFBlock.__init__.<locals>.<genexpr>)r©   r×  r  Úbody)r   r  r©   r   r   r    r!   c  s    zAdaptCFBlock.__init__N)r0   r1   r2   r!   r   r   r   r    r  b  s   r  ).r3   rº  Úpprintr   ÚloggingÚcollectionsr   r   r   Ú	functoolsr   Znumba.core.utilsr   r   r	   Znumba.core.controlflowr
   r   Znumba.core.irr   Znumba.core.errorsr   Ú	getLoggerr0   r;   r‡   rˆ   r4   rs   Úobjectr   r5   r:   r´   rK   rÓ  rÿ  rJ   r±   rø  r	  r  r_   rê  r  r  r   r   r   r    Ú<module>   sp   
ü 	 k           9

ÿþ
*