Ë
    n�µh%Ÿ  ã                   ó  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 erddl3m4Z4m5Z5 ddl6m7Z7 ejp                  ejr                  fZ: ed¬«      Z;dZ< G d„ de=«      Z> e)d«      Z?d„ Z@ G d„ deA«      ZB G d„ deA«      ZC G d„ dejˆ                  «      ZE eFd„ ejŽ                  D «       «      ZHd„ ZIdZJd„ ZK G d „ d!eA«      ZLd"„ ZMd#„ ZNd$„ ZOd%„ ZPd&„ ZQd'„ ZRd(„ ZSd)„ ZTd*„ ZU e«       ZVe;d+„ «       ZWd,„ ZXd-„ ZYd.„ ZZd/„ Z[d0„ Z\d1„ Z]d2„ Z^ej¾                  d3k\  rdd4l`maZb yeLZby)5a+  
MIT License

Copyright (c) 2021 Alex Hall

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
é    N)Údefaultdict)Údeepcopy)Ú	lru_cache)Úislice)Úzip_longest)Ú
attrgetter)ÚPath)ÚRLock)Údetect_encoding)ÚTYPE_CHECKINGÚAnyÚCallableÚDictÚIterableÚIteratorÚListÚOptionalÚSequenceÚSetÚSizedÚTupleÚTypeÚTypeVarÚUnionÚcasté   )Úmangled_nameÚassert_ÚEnhancedASTÚEnhancedInstructionÚInstructionÚget_instructions)Ú	ASTTokensÚASTText)ÚASTTextBase)Úmaxsizec                   ó"   ‡ — e Zd Zg fˆ fd„	Zˆ xZS )ÚNotOneValueFoundc                 ó:   •— || _         t        t        | �  |«       y ©N)ÚvaluesÚsuperr(   Ú__init__)ÚselfÚmsgr+   Ú	__class__s      €úd/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/executing/executing.pyr-   zNotOneValueFound.__init__:   s   ø€ àˆŒÜÔ˜tÑ-¨cÕ2ó    )Ú__name__Ú
__module__Ú__qualname__r-   Ú__classcell__©r0   s   @r1   r(   r(   9   s   ø„ Ø!#÷ 3ñ 3r2   r(   ÚTc                 ó"  — t        | t        «      r3t        | «      dk7  rt        dt        | «      z  «      ‚t	        | «      d   S t        t        | d«      «      }t        |«      dk(  rt        d«      ‚t        |«      dkD  rt        d|«      ‚|d   S )Nr   zExpected one value, found %sr   é   zExpected one value, found 0z!Expected one value, found several)Ú
isinstancer   Úlenr(   ÚlistÚtupler   )ÚitÚlsts     r1   ÚonlyrA   B   sƒ   € ä�"”eÔÜˆr‹7�aŠ<Ü"Ð#AÄCÈÃGÑ#KÓLÐLä�B‹x˜‰{Ðä
”�r˜1“Ó
€CÜ
ˆ3ƒx�1‚}ÜÐ<Ó=Ð=Ü
ˆ3ƒx�!‚|ÜÐBÀ3ÓGÐGØˆq‰6€Mr2   c                   óÆ   — e Zd ZdZd„ Zedd„«       Ze	 	 dd„«       Zed„ «       Zed„ «       Z	ed„ «       Z
ed	„ «       Zed
„ «       Zd„ Zd„ Zd„ Zed„ «       Zed„ «       Zd„ Zy)ÚSourceaä  
    The source code of a single file and associated metadata.

    The main method of interest is the classmethod `executing(frame)`.

    If you want an instance of this class, don't construct it.
    Ideally use the classmethod `for_frame(frame)`.
    If you don't have a frame, use `for_filename(filename [, module_globals])`.
    These methods cache instances by filename, so at most one instance exists per filename.

    Attributes:
        - filename
        - text
        - lines
        - tree: AST parsed from text, or None if text is not valid Python
            All nodes in the tree have an extra `parent` attribute

    Other methods of interest:
        - statements_at_line
        - asttokens
        - code_qualname
    c                 óò  — || _         dj                  |«      | _        |D �cg c]  }|j                  d«      ‘Œ c}| _        t        t        «      | _        d| _        i | _	        d| _
        d| _        	 t        j                  | j                  |¬«      | _        t        j                  | j                  «      D ]m  }t        j                  |«      D ]%  }t!        t"        |«      t!        t"        |«      _        Œ' t'        |«      D ]   }| j                  |   j)                  |«       Œ" Œo t+        «       }|j-                  | j                  «       |j.                  | _	        yc c}w # t0        t2        f$ r Y yw xY w)zG
        Don't call this constructor, see the class docstring.
        Ú z
N©Úfilename)rG   ÚjoinÚtextÚrstripÚlinesr   r=   Ú_nodes_by_lineÚtreeÚ
_qualnamesÚ
_asttokensÚ_asttextÚastÚparseÚwalkÚiter_child_nodesr   r   ÚparentÚnode_linenosÚappendÚQualnameVisitorÚvisitÚ	qualnamesÚSyntaxErrorÚ
ValueError)r.   rG   rK   ÚlineÚnodeÚchildÚlinenoÚvisitors           r1   r-   zSource.__init__j   s.  € ð !ˆŒØ—G‘G˜E“NˆŒ	Ù6;Ó<±e¨d�d—k‘k &Õ)°eÑ<ˆŒ
ä)¬$Ó/ˆÔØˆŒ	ØˆŒØˆŒØˆŒð	0ÜŸ	™	 $§)¡)°hÔ?ˆDŒIô Ÿ™ §¡Ö+�Ü ×1Ñ1°$Ö7�EÜ6:¼;ÈÓ6M”Dœ eÓ,Õ3ð 8ä*¨4Ö0�FØ×'Ñ'¨Ñ/×6Ñ6°tÕ<ñ 1ð ,ô &Ó'ˆGØ�M‰M˜$Ÿ)™)Ô$Ø%×/Ñ/ˆD�Oùò+ =øô œZÐ(ò 	Ùð	ús   ¢EÁ3&E$ Å$E6Å5E6c                 ól   — | j                  |j                  j                  |j                  xs i |«      S )zb
        Returns the `Source` object corresponding to the file the frame is executing in.
        )Úfor_filenameÚf_codeÚco_filenameÚ	f_globals)ÚclsÚframeÚ	use_caches      r1   Ú	for_framezSource.for_frame‰   s-   € ð ×Ñ §¡× 8Ñ 8¸%¿/¹/Ò:OÈRÐQZÓ[Ð[r2   Nc                 ó0  ‡‡— t        ‰t        «      rt        ‰«      Šˆˆfd„}t        j                  j                  ‰«      }t        j                  ‰«        |«       }|�|s|t        j                  ‰<    |«       }| j                  ‰t        |«      «      S )Nc                  óL   •— t        j                  t        t        ‰ «      ‰«      S r*   )Ú	linecacheÚgetlinesr   Ústr)rG   Úmodule_globalss   €€r1   Ú	get_linesz&Source.for_filename.<locals>.get_linesœ   s   ø€ ä×%Ñ%¤d¬3°Ó&9¸>ÓJÐJr2   )	r;   r	   ro   rm   ÚcacheÚgetÚ
checkcacheÚ_for_filename_and_linesr>   )rg   rG   rp   ri   rq   ÚentryrK   s    ``    r1   rc   zSource.for_filename‘   s   ù€ ô �h¤Ô%Ü˜8“}ˆHõ	Kô
 —‘×#Ñ# HÓ-ˆÜ×Ñ˜XÔ&Ù“ˆØÐ¡Uð
 ).ŒI�O‰O˜HÑ%Ù“KˆEà×*Ñ*¨8´U¸5³\ÓBÐBr2   c                 óx   — | j                  di «      }	 |||f   S # t        $ r Y nw xY w | ||«      x}|||f<   |S )NÚ__source_cache_with_lines)Ú_class_localÚKeyError)rg   rG   rK   Úsource_cacheÚresults        r1   ru   zSource._for_filename_and_lines®   s`   € ð ×'Ñ'Ð(CÀRÓHˆð	Ø ¨5Ð 1Ñ2Ð2øÜò 	Ùð	úñ 47°xÀÓ3GÐGˆ�˜x¨Ð/Ñ0Øˆs   ” ›	'¦'c                 ól   — t        j                  |j                  j                  |j                  «       y r*   )rm   Ú	lazycacherd   re   rf   )rg   rh   s     r1   r~   zSource.lazycacheº   s"   € ô 	×Ñ˜EŸL™L×4Ñ4°e·o±oÕFr2   c                 óÆ  — t        |t        j                  «      r'|}|j                  }|j                  }|j
                  }n|}|j                  }|j                  }|j                  }|t        |«      |f}| j                  di «      }|j                  |«      }	|	s¦dx}
x}}| j                  |«      }|j                  }|rv	 |j                  |«      }|rDt        |«      rt!        ||||«      \  }}
n't#        |||||«      }|j$                  }
|j&                  }|
rt)        |
«      h}t+        ||k  «       |}||
||fx||<   }	t1        |g|	¢­Ž S # t,        $ r
 t.        r‚ Y Œ)w xY w)zŽ
        Returns an `Executing` object representing the operation
        currently executing in the given frame or traceback object.
        Ú__executing_cacheN)r;   ÚtypesÚTracebackTypeÚtb_frameÚ	tb_linenoÚtb_lastiÚf_linenoÚf_lastird   Úidry   rs   rj   rM   Ústatements_at_lineÚis_ipython_cell_codeÚfind_node_ipythonÚ
NodeFinderr|   Ú	decoratorÚstatement_containing_noder   Ú	ExceptionÚTESTINGÚ	Executing)rg   Úframe_or_tbÚtbrh   r`   ÚlastiÚcodeÚkeyÚexecuting_cacheÚargsr^   Ústmtsr�   ÚsourcerM   Únode_finderÚ	new_stmtss                    r1   Ú	executingzSource.executing¿   s}  € ô �k¤5×#6Ñ#6Ô7ð ˆBØ—K‘KˆEØ—\‘\ˆFØ—K‘K‰EàˆEØ—^‘^ˆFØ—M‘MˆEð �|‰|ˆØ”R˜“X˜uÐ%ˆØ×*Ñ*Ð+>ÀÓCˆà×"Ñ" 3Ó'ˆÙØ'+Ð+ˆDÐ+�5˜9Ø—]‘] 5Ó)ˆFØ—;‘;ˆDÙðØ"×5Ñ5°fÓ=�EÙÜ/°Ô5Ü.?ÀÀuÈeÐU[Ó.\™O˜I¡tä*4°U¸EÀ4ÈÐPVÓ*W˜KØ#.×#5Ñ#5˜DØ(3×(=Ñ(=˜IáÜ%>¸tÓ%DÐ$E˜	Ü 	¨UÑ 2Ô3Ø )˜ð
 +1°$¸¸yÐ*HÐHˆO˜CÑ  4ä˜Ð& Ò&Ð&øô !ò ÝØñ ðús   ÃA5E ÅE ÅE c                 óX   — | j                   j                  ||«      }t        | ||«       |S )z‹
        Returns an attribute directly associated with this class
        (as opposed to subclasses), setting default if necessary
        )Ú__dict__rs   Úsetattr)rg   ÚnameÚdefaultr|   s       r1   ry   zSource._class_localù   s+   € ð —‘×!Ñ! $¨Ó0ˆÜ��T˜6Ô"Øˆr2   c                 óX   — | j                   |   D �ch c]  }t        |«      ’Œ c}S c c}w )az  
        Returns the statement nodes overlapping the given line.

        Returns at most one statement unless semicolons are present.

        If the `text` attribute is not valid python, meaning
        `tree` is None, returns an empty set.

        Otherwise, `Source.for_frame(frame).statements_at_line(frame.f_lineno)`
        should return at least one statement.
        )rL   rŽ   )r.   r`   r^   s      r1   r‰   zSource.statements_at_line  s>   € ð$ ×Ñ Ò'ó
ñ (ð ô & dÕ+à'ñ
ð 	
ùò 
s   ’'c                 óš   — ddl m} | j                  €. || j                  | j                  | j
                  ¬«      | _        | j                  S )zŸ
        Returns an ASTText object for getting the source of specific AST nodes.

        See http://asttokens.readthedocs.io/en/latest/api-index.html
        r   )r$   ©rM   rG   )Ú	asttokensr$   rP   rI   rM   rG   )r.   r$   s     r1   ÚasttextzSource.asttext  s7   € õ 	&à�=‰=Ð Ù# D§I¡I°D·I±IÈÏÉÔVˆDŒMà�}‰}Ðr2   c                 ó  — ddl }| j                  €nt        |d«      r+| j                  «       j                   | _        | j                  S |j	                  | j
                  | j                  | j                  ¬«      | _        | j                  S )z¡
        Returns an ASTTokens object for getting the source of specific AST nodes.

        See http://asttokens.readthedocs.io/en/latest/api-index.html
        r   Nr$   r¥   )r¦   rO   Úhasattrr§   r#   rI   rM   rG   ©r.   r¦   s     r1   r¦   zSource.asttokens(  sn   € ó 	à�?‰?Ð"Ü�y )Ô,Ø"&§,¡,£.×":Ñ":�”ð �‰Ðð #,×"5Ñ"5°d·i±iÀdÇiÁiÐZ^×ZgÑZgÐ"5Ó"h�”Ø�‰Ðr2   c                 ób   — dd l }t        |d«      r| j                  «       S | j                  «       S )Nr   r$   )r¦   r©   r§   rª   s     r1   Ú_asttext_basezSource._asttext_base8  s(   € ãä�9˜iÔ(Ø—<‘<“>Ð!à—>‘>Ó#Ð#r2   c                 ór   — t        | t        «      r&t        j                  | «      }| j	                  |«      S | S r*   )r;   ÚbytesrC   r   Údecode)rš   Úencodings     r1   Údecode_sourcezSource.decode_sourceA  s2   € ô �fœeÔ$Ü×-Ñ-¨fÓ5ˆHØ—=‘= Ó*Ð*àˆMr2   c                 óX   — t        t        j                  | «      j                  «      d   S )Nr   )r   ÚioÚBytesIOÚreadline)rš   s    r1   r   zSource.detect_encodingJ  s#   € ô œrŸz™z¨&Ó1×:Ñ:Ó;¸AÑ>Ð>r2   c                 ó¾   — t        |j                  | j                  k(  «       | j                  j	                  |j
                  |j                  f|j
                  «      S )a  
        Imitates the __qualname__ attribute of functions for code objects.
        Given:

            - A function `func`
            - A frame `frame` for an execution of `func`, meaning:
                `frame.f_code is func.__code__`

        `Source.for_frame(frame).code_qualname(frame.f_code)`
        will be equal to `func.__qualname__`*. Works for Python 2 as well,
        where of course no `__qualname__` attribute exists.

        Falls back to `code.co_name` if there is no appropriate qualname.

        Based on https://github.com/wbolster/qualname

        (* unless `func` is a lambda
        nested inside another lambda on the same line, in which case
        the outer lambda's qualname will be returned for the codes
        of both lambdas)
        )r   re   rG   rN   rs   Úco_nameÚco_firstlineno)r.   r•   s     r1   Úcode_qualnamezSource.code_qualnameO  sE   € ô. 	�× Ñ  D§M¡MÑ1Ô2Ø�‰×"Ñ" D§L¡L°$×2EÑ2EÐ#FÈÏÉÓUÐUr2   )T©NT)r3   r4   r5   Ú__doc__r-   Úclassmethodrj   rc   ru   r~   r�   ry   rr   r‰   r§   r¦   r¬   Ústaticmethodr±   r   r¹   © r2   r1   rC   rC   R   sä   „ ñò.0ð> ò\ó ð\ð ð Øò	Có ðCð8 ñ	ó ð	ð ñGó ðGð ñ7'ó ð7'ðr ñ	ó ð	ð ñ
ó ð
ò(òò $ð ñó ðð ñ?ó ð?óVr2   rC   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)r‘   a�  
    Information about the operation a frame is currently executing.

    Generally you will just want `node`, which is the AST node being executed,
    or None if it's unknown.

    If a decorator is currently being called, then:
        - `node` is a function or class definition
        - `decorator` is the expression in `node.decorator_list` being called
        - `statements == {node}`
    c                 óJ   — || _         || _        || _        || _        || _        y r*   )rh   rš   r^   Ú
statementsr�   )r.   rh   rš   r^   r™   r�   s         r1   r-   zExecuting.__init__w  s%   € àˆŒ
ØˆŒØˆŒ	ØˆŒØ"ˆ�r2   c                 ó`   — | j                   j                  | j                  j                  «      S r*   )rš   r¹   rh   rd   ©r.   s    r1   r¹   zExecuting.code_qualname  s!   € à�{‰{×(Ñ(¨¯©×):Ñ):Ó;Ð;r2   c                 óh   — | j                   j                  «       j                  | j                  «      S r*   )rš   r¬   Úget_textr^   rÃ   s    r1   rI   zExecuting.textƒ  s$   € à�{‰{×(Ñ(Ó*×3Ñ3°D·I±IÓ>Ð>r2   c                 óh   — | j                   j                  «       j                  | j                  «      S r*   )rš   r¬   Úget_text_ranger^   rÃ   s    r1   Ú
text_rangezExecuting.text_range‡  s$   € à�{‰{×(Ñ(Ó*×9Ñ9¸$¿)¹)ÓDÐDr2   N)r3   r4   r5   r»   r-   r¹   rI   rÈ   r¾   r2   r1   r‘   r‘   j  s   „ ñ
ò#ò<ò?óEr2   r‘   c                   ó>   ‡ — e Zd Zˆ fd„Zdd„Zdd„ZeZd„ Zd„ Zˆ xZ	S )rX   c                 óF   •— t         t        | �  «        g | _        i | _        y r*   )r,   rX   r-   ÚstackrZ   )r.   r0   s    €r1   r-   zQualnameVisitor.__init__�  s   ø€ äŒo˜tÑ-Ô/ØˆŒ
Øˆ�r2   c                 ó.  — |xs |j                   }| j                  j                  |«       t        |dd«      r|j                  d   j
                  }n|j
                  }| j                  j                  ||fdj                  | j                  «      «       y )NÚdecorator_listr¾   r   Ú.)	r¡   rË   rW   ÚgetattrrÍ   r`   rZ   Ú
setdefaultrH   )r.   r^   r¡   r`   s       r1   Úadd_qualnamezQualnameVisitor.add_qualname“  ss   € àÒ �t—y‘yˆØ�
‰
×Ñ˜$ÔÜ�4Ð)¨2Ô.Ø×(Ñ(¨Ñ+×2Ñ2‰Fà—[‘[ˆFØ�‰×!Ñ! 4¨ .°#·(±(¸4¿:¹:Ó2FÕGr2   c                 ó  — t        |t        j                  t        j                  t        j                  f«      sJ |«       ‚| j                  ||«       | j                  j                  d«       g }t        |t        j                  «      r|j                  g}n|j                  }|D ]  }| j                  |«       Œ | j                  j                  «        | j                  j                  «        t        j                  |«      D ]{  \  }}|dk(  rŒt        |t        j                  «      r| j                  |«       Œ8t        |t        «      sŒI|D ].  }t        |t        j                  «      sŒ| j                  |«       Œ0 Œ} y )Nz<locals>Úbody)r;   rQ   ÚFunctionDefÚAsyncFunctionDefÚLambdarÑ   rË   rW   rÓ   rY   ÚpopÚiter_fieldsÚASTr=   )r.   r^   r¡   Úchildrenr_   ÚfieldÚ
grandchilds          r1   Úvisit_FunctionDefz!QualnameVisitor.visit_FunctionDef�  s  € ä˜$¤§¡´#×2FÑ2FÌÏ
É
Ð SÔTÐZÐVZÓZÐTØ×Ñ˜$ Ô%Ø�
‰
×Ñ˜*Ô%ØˆÜ�dœCŸJ™JÔ'ØŸ	™	�{‰Hà—y‘yˆHÛˆEØ�J‰J�uÕð à�
‰
�‰ÔØ�
‰
�‰Ôô
  ŸO™O¨DÖ1‰LˆE�5Ø˜ŠØÜ˜%¤§¡Ô)Ø—
‘
˜5Õ!Ü˜E¤4Õ(Û"'�JÜ! *¬c¯g©gÕ6ØŸ
™
 :Õ.ñ #(ñ 2r2   c                 ó`   — t        |t        j                  «      sJ ‚| j                  |d«       y )Nz<lambda>)r;   rQ   rÖ   rÝ   ©r.   r^   s     r1   Úvisit_LambdazQualnameVisitor.visit_Lambda»  s&   € ä˜$¤§
¡
Ô+Ð+Ð+Ø×Ñ˜t ZÕ0r2   c                 ó´   — t        |t        j                  «      sJ ‚| j                  |«       | j	                  |«       | j
                  j                  «        y r*   )r;   rQ   ÚClassDefrÑ   Úgeneric_visitrË   r×   rß   s     r1   Úvisit_ClassDefzQualnameVisitor.visit_ClassDefÀ  s@   € ä˜$¤§¡Ô-Ð-Ð-Ø×Ñ˜$ÔØ×Ñ˜4Ô Ø�
‰
�‰Õr2   r*   )
r3   r4   r5   r-   rÑ   rÝ   Úvisit_AsyncFunctionDefrà   rä   r6   r7   s   @r1   rX   rX   Œ  s%   ø„ ôóHó/ð8 /Ðò1ö
r2   rX   c              #   óP   K  — | ]  }t        t        |«      j                  –— Œ  y ­wr*   )rÏ   Ú
__future__Úcompiler_flag)Ú.0Úfnames     r1   Ú	<genexpr>rë   Ë  s"   è ø€ ð Ù:V°„GŒJ˜Ó×,Õ,Ñ:Vùs   ‚$&c                 óX   — t        | |j                  dt        |j                  z  d¬«      S )NÚexecT)ÚflagsÚdont_inherit)Úcompilere   Úfuture_flagsÚco_flags)rš   Úmatching_codes     r1   Úcompile_similar_torô   Ð  s/   € äØØ×!Ñ!ØÜ˜]×3Ñ3Ñ3Øôð r2   Ú8io8urthglkjdghvljusketgIYRFYUVGHFRTBGVHKGF78678957647698c                 ó8   — t        d„ t        | «      D «       «      S )Nc              3   ó¬   K  — | ]L  }|j                   d k7  xr7 t        |j                  t        «      xr |j                  j	                  d«      –— ŒN y­w)Ú
LOAD_CONSTz@pyN)Úopnamer;   Úargvalro   Ú
startswith)ré   Úbcs     r1   rë   z)is_rewritten_by_pytest.<locals>.<genexpr>ß  sI   è ø€ ð á(ˆBð 	�	‰	�\Ñ!Ò_¤j°·±¼3Ó&?Ò_ÀBÇIÁI×DXÑDXÐY^ÓD_Ó_Ù(ùs   ‚AA)Úanyr"   ©r•   s    r1   Úis_rewritten_by_pytestrÿ   Ý  s!   € äñ ä" 4Ô(óó ð r2   c                   ó@   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy)
ÚSentinelNodeFinderNc                 óÖ  ‡‡— t        |«       || _        || _        |j                  x| _        }t        |«      | _        | j                  rt        t        |«      «      | _	        nt        «       | _	        d | _
        | j                  |«      x| _        Š‰j                  }d„ }t        d «      }	t        d «      }
|j                  d«      rt         j"                  }
�n~|j                  d«      r"t         j$                  }
t         j&                  }	�nK|j                  d«      rét         j(                  }
t+        t         j,                  t         j.                  t1        t         dd«      t         j2                  t         j4                  t         j6                  t         j8                  t         j:                  t         j<                  t         j>                  t         j@                  t         jB                  t         jD                  ¬«      |   Šˆfd„}�nQ|j                  d	«      r`t         jF                  }
t+        t         jH                  t         jJ                  t         jL                  t         jN                  ¬
«      |   Šˆfd„}nà|dv r&t         jP                  }
t         j&                  }	ˆfd„}n¶|dv r&t         jR                  }
t         j&                  }	ˆfd„}nŒ|dv rt         jT                  }
d„ }nt|j                  d«      r!t         jV                  }	t         j$                  }
nB|j                  d«      r&t         jV                  }	t         jP                  }
ˆfd„}ntY        |«      ‚tZ        5  |D ��ch c]e  }t!        j\                  |«      D ]K  }t_        ||
«      r=t_        t1        |dd «      |	«      r& ||«      rta        |«      |k(  rtc        td        |«      ’ŒM Œg }}}|	t         jV                  k(  rtg        |«      | _4        	 d d d «       y tk        | jm                  |«      «      }|s%|
t         j"                  k(  r| jo                  |«       ntg        |«      | _4        d d d «       y c c}}w # 1 sw Y   y xY w)Nc                  ó   — yrº   r¾   ©Úes    r1   Ú<lambda>z-SentinelNodeFinder.__init__.<locals>.<lambda>ù  s   €  r2   ÚCALL_)ÚBINARY_SUBSCRzSLICE+ÚBINARY_ÚMatMultr¾   )ÚBINARY_POWERÚBINARY_MULTIPLYÚBINARY_MATRIX_MULTIPLYÚBINARY_FLOOR_DIVIDEÚBINARY_TRUE_DIVIDEÚBINARY_MODULOÚ
BINARY_ADDÚBINARY_SUBTRACTÚBINARY_LSHIFTÚBINARY_RSHIFTÚ
BINARY_ANDÚ
BINARY_XORÚ	BINARY_ORc                 ó0   •— t        | j                  ‰«      S r*   ©r;   Úop©r  Úop_types    €r1   r  z-SentinelNodeFinder.__init__.<locals>.<lambda>  ó   ø€ ¤Z°·±°gÔ%>r2   ÚUNARY_)ÚUNARY_POSITIVEÚUNARY_NEGATIVEÚ	UNARY_NOTÚUNARY_INVERTc                 ó0   •— t        | j                  ‰«      S r*   r  r  s    €r1   r  z-SentinelNodeFinder.__init__.<locals>.<lambda>  r  r2   )Ú	LOAD_ATTRÚLOAD_METHODÚLOOKUP_METHODc                 ó4   •— t        | «      ‰j                  k(  S r*   ©r   rú   ©r  Úinstructions    €r1   r  z-SentinelNodeFinder.__init__.<locals>.<lambda>   ó   ø€ ¤L°£O°{×7IÑ7IÒ$Ir2   )Ú	LOAD_NAMEÚLOAD_GLOBALÚ	LOAD_FASTÚ
LOAD_DEREFÚLOAD_CLASSDEREFc                 ó4   •— t        | «      ‰j                  k(  S r*   r(  r)  s    €r1   r  z-SentinelNodeFinder.__init__.<locals>.<lambda>$  r+  r2   )Ú
COMPARE_OPÚIS_OPÚCONTAINS_OPc                 ó2   — t        | j                  «      dk(  S )Nr   )r<   Úopsr  s    r1   r  z-SentinelNodeFinder.__init__.<locals>.<lambda>'  s   € ¤S¨¯©£Z°1¢_r2   )ÚSTORE_SLICEÚSTORE_SUBSCRÚ
STORE_ATTRc                 ó4   •— t        | «      ‰j                  k(  S r*   r(  r)  s    €r1   r  z-SentinelNodeFinder.__init__.<locals>.<lambda>.  r+  r2   Úctx)8r   rh   rM   rd   r•   rÿ   Ú	is_pytestÚ	frozensetÚassert_linenosÚignore_linenosr�   Úget_actual_current_instructionr*  rù   Útyperû   rQ   ÚCallÚ	SubscriptÚLoadÚBinOpÚdictÚPowÚMultrÏ   ÚFloorDivÚDivÚModÚAddÚSubÚLShiftÚRShiftÚBitAndÚBitXorÚBitOrÚUnaryOpÚUAddÚUSubÚNotÚInvertÚ	AttributeÚNameÚCompareÚStoreÚRuntimeErrorÚlockrS   r;   rŽ   r   r   rA   r|   r=   Úmatching_nodesÚfind_decorator)r.   rh   r™   rM   r”   rš   r•   Úop_nameÚextra_filterr;  ÚtypÚstmtr^   ÚexprsÚmatchingr*  r  s                  @@r1   r-   zSentinelNodeFinder.__init__è  sC  ù€ ä�ŒØˆŒ
ØˆŒ	Ø Ÿ<™<Ð'ˆŒ	�DÜ/°Ó5ˆŒà�>Š>Ü"+¬N¸4Ó,@Ó"AˆDÕä"+£+ˆDÔàˆŒà)-×)LÑ)LÈUÓ)SÐSˆÔ˜;Ø×$Ñ$ˆÙ%ˆÜ�4‹jˆä�4‹jˆØ×Ñ˜gÔ&Ü—(‘(ŠCØ×ÑÐ ;Ô<Ü—-‘-ˆCÜ—(‘(ŠCØ×Ñ 	Ô*Ü—)‘)ˆCÜÜ ŸW™WÜ #§¡Ü'.¬s°I¸rÓ'BÜ$'§L¡LÜ#&§7¡7Ü!Ÿg™gÜŸ7™7Ü #§¡Ü!Ÿj™jÜ!Ÿj™jÜŸ:™:ÜŸ:™:ÜŸ)™)ôð ñˆGó ?ŠLØ×Ñ Ô)Ü—+‘+ˆCÜÜ"Ÿx™xÜ"Ÿx™xÜŸ'™'Ü ŸZ™Zô	ð
 ñˆGó ?‰LØÐEÑEÜ—-‘-ˆCÜ—(‘(ˆCÛI‰LØÐbÑbÜ—(‘(ˆCÜ—(‘(ˆCÛI‰LØÐ>Ñ>Ü—+‘+ˆCÙ4‰LØ×ÑÐ ?Ô@Ü—)‘)ˆCÜ—-‘-‰CØ×Ñ Ô-Ü—)‘)ˆCÜ—-‘-ˆCÛI‰Lä˜wÓ'Ð'ö ñ "ôá!�DÜŸH™H TžN�DÜ˜d CÔ(Üœg d¨E°4Ó8¸#Ô>Ù Ô%Ü,¨TÓ2°dÒ:ô ”[ $Õ'à*ð (Ø!ð ñ ð ”c—i‘iÒô # 5›k�”Ø÷! ˆTô$ ˜D×/Ñ/°Ó6Ó7ˆHÙ ¤s§x¡x¢Ø×#Ñ# EÕ*ä" 8›n�”÷- ˆTùó÷ ˆTús&   ÍQÍ%A*QÏ'QÏ?AQÑQÑQ(c                 óè  — t        |«      }t        t        |t        j                  t
        f«      «       |j                  }t        |«       | j                  | j                  «      D �cg c]'  }|j                  | j                  j                  k(  r|‘Œ) }}t        |«      D ��cg c]  \  }}|j                  dk(  r|‘Œ c}}d   }t        ||dz      j                  j                  d«      «       ||t        |«      z
  dz   |dz    }t        |D �ch c]  }|j                  ’Œ c}dhk(  «       |j!                  | j"                  «      }	|d d d…   |	   }
|
| _        || _        y c c}w c c}}w c c}w )NÚCALL_FUNCTIONéÿÿÿÿr   ÚSTORE_)rA   r   r;   rQ   râ   Úfunction_node_typesrÍ   Úclean_instructionsr•   r`   rh   r†   Ú	enumeraterù   rû   r<   Úindexr*  r�   r|   )r.   r™   rc  Ú
decoratorsÚinstÚline_instructionsÚiÚ last_decorator_instruction_indexÚdecorator_instructionsÚdecorator_indexr�   s              r1   r_  z!SentinelNodeFinder.find_decoratorK  sˆ  € ä�E‹{ˆÜ”
˜4¤#§,¡,Ô0CÐ!DÓEÔFØ×(Ñ(ˆ
Ü�
Ôð ×/Ñ/°·	±	Ô:ó
á:�Ø�{‰{˜dŸj™j×1Ñ1Ò1ò Ø:ð 	ð 
ô %Ð%6Ô7ô,
á7‘��4Ø�{‰{˜oÒ-ò Ø7ò,
ð ñ	,Ð(ô
 	ØÐ>ÀÑBÑC×JÑJ×UÑUØóô	
ð
 "3Ø,Ü�*‹oñàñà2Øñð"
Ðô 	Ñ)?Ó@Ñ)? �—“Ð)?Ñ@À_ÐDUÑUÔVØ0×6Ñ6°t×7GÑ7GÓHˆØ™t ˜tÑ$ _Ñ5ˆ	Ø"ˆŒØˆ�ùò3
ùó
,
ùò  As   Á),E$Â%E)ÄE/c                 óŠ   — t        |«      D �cg c]*  }|j                  dvr|j                  | j                  vr|‘Œ, c}S c c}w )N)ÚEXTENDED_ARGÚNOP)r"   rù   r`   r?  )r.   r•   ro  s      r1   rk  z%SentinelNodeFinder.clean_instructionsl  sM   € ô )¨Ô.ó
á.�Ø�{‰{Ð"9Ñ9Ø�{‰{ $×"5Ñ"5Ñ5ò Ø.ñ
ð 	
ùò 
s   Ž/A c                 óÂ   — | j                  | j                  «      }t        d„ | j                  «       D «       «      s|D �cg c]  }|j                  dk7  r|‘Œ }}|S c c}w )Nc              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)ÚJUMP_IF_NOT_DEBUGN©rù   )ré   ro  s     r1   rë   zESentinelNodeFinder.get_original_clean_instructions.<locals>.<genexpr>}  s"   è ø€ ð 
á7�Dð —‘Ð2Õ2Ù7ùs   ‚rz  )rk  r•   rý   Úcompile_instructionsrù   )r.   r|   ro  s      r1   Úget_original_clean_instructionsz2SentinelNodeFinder.get_original_clean_instructionsu  sp   € à×(Ñ(¨¯©Ó3ˆô ñ 
à ×5Ñ5Ô7ó
ô 
ñ
 "(óÙ!'˜Ø—;‘;Ð"5Ò5ò  ð ð ð
 ˆùòs   Á Ac           	   #   óp  ‡ K  — ‰ j                  «       }t        ˆ fd„t        |«      D «       «      }t        |«      D �]:  \  }}t        |«      }|€J ‚t	        j
                  |t	        j                  «       t	        j                  t        ¬«      ¬«      }t	        j                  |«        ||«       	 ‰ j                  «       } ||«       t        j                  dk\  r	 t        ||«       t        |«      D �	�
cg c]  \  }	}
|
j"                  t        k(  r|	‘Œ }}	}
t        |«      D ][  \  }}||dz  z  }t%        |j'                  |«      j(                  dk(  «       t%        |j'                  |«      j(                  dk(  «       Œ] t        |«      D ]æ  \  }}||dz  z  }|dz
  }||k7  rŒ||   }||   }|j(                  |j(                  cxk(  rd	v r^n n[|j*                  |j*                  k7  rB||dz      j(                  ||dz      j(                  cxk7  rd
k(  rn n|j'                  |dz   «       t        j                  dk  r1t-        ||«      D ]"  \  }}t%        |xr |xr t/        ||«      «       Œ$ |–— Œè �Œ= y #  ||«       w xY w# t        $ r t        s|t!        |«      dz
  k  rY �Œo‚ w xY wc c}
}	w ­w)Nc              3   óF   •K  — | ]  \  }}|‰j                   k(  r|–— Œ y ­wr*   )r*  )ré   rq  ro  r.   s      €r1   rë   z4SentinelNodeFinder.matching_nodes.<locals>.<genexpr>‹  s+   øè ø€ ð 
á;‘��4Ø�t×'Ñ'Ò'ô Ù;ùó   ƒ!)Ús)Úleftr  Úright)é   é
   r   r:   rø   r  ©r4  r3  r!  )r}  rA   rl  Ú
get_setterrQ   rE  rG  ÚStrÚsentinelÚfix_missing_locationsr|  ÚsysÚversion_infoÚhandle_jumpsr�   r�   r<   rú   r   r×   rù   Úargr   Úopnames_match)r.   rd  Úoriginal_instructionsÚoriginal_indexÚ
expr_indexÚexprÚsetterÚreplacementÚinstructionsrq  r*  ÚindicesÚ	index_numÚsentinel_indexÚ	new_indexÚoriginal_instÚnew_instÚinst1Úinst2s   `                  r1   r^  z!SentinelNodeFinder.matching_nodesˆ  sµ  øè ø€ à $× DÑ DÓ FÐÜó 
ä$Ð%:Ô;ó
ó 
ˆô
 !*¨%× 0ÑˆJ˜Ü Ó%ˆFØÐ%Ð%Ð%äŸ)™)ØÜ—7‘7“9Ü—g‘g¤Ô)ôˆKô
 ×%Ñ% kÔ2Ù�;ÔðØ#×8Ñ8Ó:�á�t”ä×Ñ 7Ò*ðÜ  Ð/DÔEô '0°Ô&=ôá&=‘N�A�{Ø×%Ñ%¬Ò1ò Ø&=ð ñ ô .7°wÖ-?Ñ)�	˜>ð  )¨a¡-Ñ/�ä˜×(Ñ(¨Ó8×?Ñ?À<ÑOÔPÜ˜×(Ñ(¨Ó8×?Ñ?À>ÑQÕRð .@ô .7°wÖ-?Ñ)�	˜>Ø )¨a¡-Ñ/�Ø*¨QÑ.�	à Ò.Øà 5°nÑ E�Ø'¨	Ñ2�ð
 &×,Ñ,°·±Ô[ÐC[Ô[Ø)×-Ñ-°·±Ò=à-¨n¸qÑ.@ÑA×HÑHØ'¨	°A©Ñ6×=Ñ=ôMØALõMð !×$Ñ$ Y°¡]Ô3ô ×#Ñ# gÒ-Ü(3Ø-¨|ö)™˜˜uô   Ò O¨%Ò O´MÀ%ÈÓ4OÕPð)ð
 “
ò= .@ñW !1øñ �t•ûô
 !ò å *¬s°5«z¸A©~Ò"=Ú Øð	üóùsO   ƒB.J6Â2I;ÃJ6ÃJÃ*J6Ã8J0ÄE$J6É;
JÊJ6Ê J-Ê(J6Ê+J-Ê-	J6c                 ó˜   — t        | j                  | j                  «      }t        | j	                  |«      «      }| j                  |«      S r*   )rô   rM   r•   rA   Ú
find_codesrk  )r.   Úmodule_coder•   s      r1   r|  z'SentinelNodeFinder.compile_instructionsÛ  s:   € ä(¨¯©°D·I±IÓ>ˆÜ�D—O‘O KÓ0Ó1ˆØ×&Ñ& tÓ,Ð,r2   c                 óþ   ‡ ‡‡‡‡— t        d«      t        d«      t        d«      d„ gŠ‰ j                  s‰t        d«      t        d«      gz  Šˆˆ fd„Šg Š ‰|«      r‰j                  |«       ˆˆˆfd„Š ‰|«       ‰S )	Nr¸   Úco_freevarsÚco_cellvarsc                 óH   — t        | j                  «      xs | j                  S r*   )Úis_ipython_cell_code_namer·   )Úcs    r1   r  z/SentinelNodeFinder.find_codes.<locals>.<lambda>ç  s   € Ô/°·	±	Ó:ÒG¸a¿i¹iÐGr2   Úco_namesÚco_varnamesc                 ó0   •‡ — t        ˆ ˆfd„‰D «       «      S )Nc              3   óT   •K  — | ]  } |‰«       |‰j                   «      k(  –— Œ! y ­wr*   rþ   )ré   Úfr§  r.   s     €€r1   rë   zASentinelNodeFinder.find_codes.<locals>.matches.<locals>.<genexpr>ñ  s*   øè ø€ ð á�Añ �!“™˜$Ÿ)™)›Õ$Ùùs   ƒ%()Úall)r§  Úchecksr.   s   `€€r1   Úmatchesz.SentinelNodeFinder.find_codes.<locals>.matchesï  s   ù€ äô áóó ð r2   c                 ó–   •— | j                   D ]9  }t        j                  |«      sŒ ‰|«      r‰j                  |«        ‰|«       Œ; y r*   )Ú	co_constsÚinspectÚiscoderW   )r•   ÚconstÚcode_optionsÚfinderr¯  s     €€€r1   r¶  z-SentinelNodeFinder.find_codes.<locals>.finderú  s<   ø€ àŸœ�Ü—~‘~ eÔ,Øá˜5”>Ø ×'Ñ'¨Ô.Ù�u•ñ (r2   )r   r<  rW   )r.   Ú	root_coder®  rµ  r¶  r¯  s   ` @@@@r1   r   zSentinelNodeFinder.find_codesá  s‡   ü€ ô Ð'Ó(Ü�}Ó%Ü�}Ó%ÙGð	
ˆð �~Š~ØÜ˜:Ó&Ü˜=Ó)ðñ ˆFõ
	ð ˆÙ�9ÔØ×Ñ 	Ô*ö	ñ 	ˆyÔØÐr2   c                 ó´   ‡— t        t        | j                  «      «      }t        ˆfd„t	        |«      D «       «      }	 ||   }|j
                  dk7  r|S |dz  }Œ)z{
        Get the instruction corresponding to the current
        frame offset, skipping EXTENDED_ARG instructions
        c              3   óF   •K  — | ]  \  }}|j                   ‰k(  r|–— Œ y ­wr*   )Úoffset)ré   rq  ro  r”   s      €r1   rë   zDSentinelNodeFinder.get_actual_current_instruction.<locals>.<genexpr>  s)   øè ø€ ð 
á2‘��4Ø�{‰{˜eÒ#ô Ù2ùr€  rv  r   )r=   r"   r•   rA   rl  rù   )r.   r”   r–  rm  r*  s    `   r1   r@  z1SentinelNodeFinder.get_actual_current_instruction  sf   ø€ ô Ô,¨T¯Y©YÓ7Ó8ˆÜó 
ä$ \Ô2ó
ó 
ˆð Ø& uÑ-ˆKØ×!Ñ! ^Ò3Ø"Ð"Ø�Q‰JˆEð	 r2   )r3   r4   r5   r|   r-   r_  rk  r}  r^  r|  r   r@  r¾   r2   r1   r  r  å  s5   „ Ø€Fòa-òFòB
òò&Qòf-ò$óLr2   r  c              #   óî   K  — d}t        t        | «      |d«      D ]V  \  }}|j                  t        k(  rt	        |j
                  dk(  «       d}Œ4|rt	        |j
                  dk(  «       d}ŒQ||f–— ŒX y­w)zz
    Yields (index, instruction) pairs excluding the basic
    instructions introduced by the sentinel transformation
    FNrø   Tr  )r   rl  rú   r‰  r   rù   )r–  ÚstartÚ
skip_powerrq  ro  s        r1   Únon_sentinel_instructionsr¾    st   è ø€ ð €JÜœ) LÓ1°5¸$Ö?‰ˆˆ4Ø�;‰;œ(Ò"Ü�D—K‘K <Ñ/Ô0ØˆJØÙÜ�D—K‘K >Ñ1Ô2ØˆJØØ�ˆg‹ñ @ùs   ‚A3A5c              #   óž  K  — t        t        | «      |d«      }t        ||«      }d}	 	 t        |«      \  }}t        |«      \  }	}
|r0|j
                  |
j
                  cxk7  rdk(  rn nt        |«      \  }	}
|j
                  |
j
                  cxk(  xr dv nc xr |j                  |
j                  k7  }|||	|
f–— Œ–# t        $ r Y yw xY w­w)z—
    Yields matching indices and instructions from the new and original instructions,
    leaving out changes made by the sentinel transformation.
    NFr!  r†  )r   rl  r¾  ÚnextÚStopIterationrù   rŽ  )r�  Úoriginal_startr–  r¼  Úoriginal_iterÚnew_iterÚinverted_comparisonÚ
original_ir›  Únew_irœ  s              r1   Úwalk_both_instructionsrÈ  2  sØ   è ø€ ô œ9Ð%:Ó;¸^ÈTÓR€MÜ(¨°uÓ=€HØÐØ
ð	Ü(,¨]Ó(;Ñ%ˆJ˜Ü" 8›n‰OˆE�8ñ  Ø×$Ñ$¨¯©ÔF¸;ÕFä" 8›n‰OˆE�8à× Ñ  H§O¡OÖOÐ7OÓOò 2Ø×!Ñ! X§\¡\Ñ1ð 	ð ˜-¨°Ð8Ò8ð øô ò 	Ùð	üs)   ‚&C©B> ÁA9CÂ>	C
ÃCÃ	C
Ã
Cc                 ó”  ‡	— 	 t        |d| d«      D ]´  \  }}}Š	t        |‰	«      rŒd‰	j                  v rFd|j                  vr8t        ˆ	fd„t	        | «      D «       «      }t        ||| |«      }|€J ‚|| ||dz    nKg }||d D ]#  }|j                  |«       |j                  dv sŒ# n t        ‚t        t        || «      «      | ||  n yŒÇ)aÏ  
    Transforms instructions in place until it looks more like original_instructions.
    This is only needed in 3.10+ where optimisations lead to more drastic changes
    after the sentinel transformation.
    Replaces JUMP instructions that aren't also present in original_instructions
    with the sections that they jump to until a raise or return.
    In some other cases duplication found in `original_instructions`
    is replicated in `instructions`.
    r   ÚJUMPc              3   ót   •K  — | ]/  \  }}|j                   ‰j                  k(  rt        |d d«      s|–— Œ1 y­w)Ú_copiedFN)rº  rú   rÏ   )ré   rq  ro  rœ  s      €r1   rë   zhandle_jumps.<locals>.<genexpr>b  s9   øè ø€ ð á#:™˜˜4Ø—{‘{ h§o¡oÒ5Ü# D¨)°UÔ;ô Ù#:ùs   ƒ58Nr   ©ÚRETURN_VALUEÚRAISE_VARARGS)	rÈ  r�  rù   rA   rl  Úhandle_jumprW   ÚAssertionErrorÚfind_new_matching)
r–  r�  rÆ  r›  rÇ  r¼  Únew_instructionsÚorig_sectionÚsection_instrœ  s
            @r1   r�  r�  M  s  ø€ ð Ü:PØ! 1 l°Aö;
Ñ6ˆJ˜ u¨hô ˜]¨HÔ5Øà˜Ÿ™Ñ(¨V¸=×;OÑ;OÑ-Oô ó ä#,¨\Ô#:óó �ô $/Ø)¨:°|ÀUó$Ð ð (Ð3Ð3Ð3Ø2B�˜U U¨Q¡YÑ/ð  "�Ø$9¸*¸+Ó$F�LØ ×'Ñ'¨Ô5Ø#×*Ñ*Ð.OÒOÙð %Gô )Ð(ä,0Ô1BÀ<ÐQ]Ó1^Ó,_�˜U 5Ð)ñ ðM;
ðR ðU r2   c           	   #   ó  K  — t        t        |«      t        | «      z
  «      D ]]  }t        t        t	        ||«      t        | «      «      Ž \  }}t        |«      t        | «      k  r yt        | |«      sŒQ|||d   dz    –— Œ_ y­w)z´
    Yields sections of `instructions` which match `orig_section`.
    The yielded sections include sentinel instructions, but these
    are ignored when checking for matches.
    Nrh  r   )Úranger<   Úzipr   r¾  Úsections_match)rÔ  r–  r¼  r—  Údup_sections        r1   rÒ  rÒ  …  s…   è ø€ ô ”s˜<Ó(¬3¨|Ó+<Ñ<Ö=ˆÜ"ÜÜ)¨,¸Ó>Ü�LÓ!óð 
Ñˆ�ô ˆ{Óœc ,Ó/Ò/ÙÜ˜,¨Õ4Ø˜u W¨R¡[°1¡_Ð5Ó5ñ >ùs   ‚A1BÁ4Bc                 óú   — t        | |||«      D ]j  \  }}}}t        t        ||«      «       |j                  dv sŒ,t	        |||dz    «      }|D ]	  }	d|	_        Œ | ||dz    }
t        ||
| «      sg |||dz    |c S  y)a`  
    Returns the section of instructions starting at `start` and ending
    with a RETURN_VALUE or RAISE_VARARGS instruction.
    There should be a matching section in original_instructions starting at original_start.
    If that section doesn't appear elsewhere in original_instructions,
    then also delete the returned section of instructions.
    rÍ  r   TN)rÈ  r   r�  rù   r   rÌ  Úcheck_duplicates)r�  rÂ  r–  r¼  Ú
original_jr›  Únew_jrœ  ÚinlinedÚinlrÔ  s              r1   rÐ  rÐ  ™  s¨   € ô 7MØ˜~¨|¸Uö7Ñ2ˆ
�M 5¨(ô 	”˜m¨XÓ6Ô7Ø×ÑÐ#DÒDÜ˜|¨E°E¸A±IÐ>Ó?ˆGÛ�Ø"�•ð à0°À*ÈqÁ.ÐQˆLÜ#Ø Ð.Côð 35�˜U U¨Q¡YÐ/ØŠNð7ð r2   c                 ó²   — t        t        |«      «      D ]@  }|| k(  rŒ	|||t        |«      z    }t        |«      t        |«      k  r yt        ||«      sŒ@ y y)z®
    Returns True if a section of original_instructions starting somewhere other
    than original_i and matching orig_section is found, i.e. orig_section is duplicated.
    FT)r×  r<   rÙ  )rÆ  rÔ  r�  Ú	dup_startrÚ  s        r1   rÜ  rÜ  ´  sa   € ô œ3Ð4Ó5Ö6ˆ	Ø˜
Ò"ØØ+¨I¸	ÄCÈÓDUÑ8UÐVˆÜˆ{Óœc ,Ó/Ò/ÙÜ˜,¨Õ4Ùð 7ð r2   c                 ó:   — t        d„ t        | |«      D «       «      S )z\
    Returns True if the given lists of instructions have matching linenos and opnames.
    c              3   ó¼   K  — | ]T  \  }}|j                   |j                   k(  xs$ d |j                  cxk(  xr |j                  k(  nc xr t        ||«      –— ŒV y­w)Ú	POP_BLOCKN)r`   rù   r�  )ré   Ú	orig_instÚdup_insts      r1   rë   z!sections_match.<locals>.<genexpr>Ê  se   è ø€ ð ñ $BÑˆI�xð ×Ñ §¡Ñ/ò Bà˜i×.Ñ.ÖA°(·/±/ÔAò	/ô
 ˜) XÓ.ó	/ñ $Bùs   ‚AA)r­  rØ  )rÔ  rÚ  s     r1   rÙ  rÙ  Å  s'   € ô
 ñ ô $' |°[Ô#Aóó ð r2   c                 ó>  — | j                   |j                   k(  xsƒ d| j                   v xr d|j                   v xsc | j                   dk(  xr |j                   dk(  xsA | j                   dv xr |j                   dk(  xs  | j                   dk(  xr |j                   dk(  S )NrÊ  Ú
PRINT_EXPRÚPOP_TOP)r%  r&  r$  ÚCALL_METHODrg  r{  )r�  rž  s     r1   r�  r�  Õ  s¦   € ð 	�‰˜Ÿ™Ñ$ò 	OØ�U—\‘\Ð!ò #Ø�e—l‘lÐ"ò	Oð �L‰L˜LÑ(ÒF¨U¯\©\¸YÑ-Fò	Oð
 �L‰LÐ<Ð<ò ,Ø—‘ Ñ+ò	Oð �L‰L˜MÑ)ÒM¨e¯l©l¸oÑ.Mð
r2   c                 óâ   ‡‡‡‡— | j                   Št        j                  ‰«      D ]G  \  ŠŠ‰| u r
ˆˆfd„}|c S t        ‰t        «      sŒ%t        ‰«      D ]  \  Š}|| u sŒˆˆfd„}|c c S  ŒI y )Nc                 ó   •— t        ‰‰| «      S r*   )r    )Únew_noder¡   rU   s    €€r1   r”  zget_setter.<locals>.setteré  s   ø€ ä˜v t¨XÓ6Ð6r2   c                 ó   •— | ‰‰<   y r*   r¾   )rî  rÛ   rq  s    €€r1   r”  zget_setter.<locals>.setterð  s   ø€ à#+˜˜ašr2   )rU   rQ   rØ   r;   r=   rl  )r^   r”  ÚitemrÛ   rq  r¡   rU   s      @@@@r1   r‡  r‡  ä  sk   û€ à�[‰[€FÜ—‘ vÖ.‰ˆˆeØ�D‰=õ7ð ŠMÜ˜œtÕ$Ü$ UÖ+‘��4Ø˜4’<õ,ð "”Mñ ,ð /ð r2   c                 óÀ   — t        | t        j                  «      s5t        t        | «      j
                  } t        | t        j                  «      sŒ5t        t        | «      S r*   )r;   rQ   rc  r   r   rU   )r^   s    r1   rŽ   rŽ   ú  sA   € ô ˜œsŸx™xÔ(Ü”K Ó&×-Ñ-ˆô ˜œsŸx™xÕ(ä”˜TÓ"Ð"r2   c              #   óÊ   K  — t        j                  | «      D ]G  }t        |d«      sŒt        t	        |«      t         j
                  «      sŒ4t        |«      D ]  }|–— Œ ŒI y ­w)NrU   )rQ   rS   r©   r;   rŽ   ÚAssertrV   )rM   r^   r`   s      r1   r>  r>    sJ   è ø€ ä—‘˜–ˆä˜˜hÕ'ÜÔ4°TÓ:¼C¿J¹JÕGä& tÖ,�Ø“ñ -ñ ùs   ‚%A#¨#A#ÁA#c                 óF  — t        | j                  t        j                  «      s1| j                  } t        | j                  t        j                  «      sŒ1t        j                  d«      }t        t        j                  | «      g|_        t        j                  || «       |S )NrE   )	r;   rU   rQ   ÚModulerR   r   rc  rÓ   Úcopy_location)rc  rM   s     r1   Ú_extract_ipython_statementr÷    sl   € ô
 ˜Ÿ™¤c§j¡jÔ1Ø�{‰{ˆô ˜Ÿ™¤c§j¡jÕ1ô
 �9‰9�R‹=€DÜ”c—h‘h Ó%Ð&€D„IÜ×Ñ�d˜DÔ!Ø€Kr2   c                 ó@   — t        t        j                  d| «      «      S )Nz(<module>|<cell line: \d+>)$)ÚboolÚreÚmatch)Ú	code_names    r1   r¦  r¦    s   € ä”—‘Ð8¸)ÓDÓEÐEr2   c                 ó@   — t        t        j                  d| «      «      S )Nz'<ipython-input-|[/\\]ipykernel_\d+[/\\])rù  rú  ÚsearchrF   s    r1   Úis_ipython_cell_filenamerÿ  "  s   € ä”—	‘	ÐDÀhÓOÓPÐPr2   c                 óZ   — t        | j                  «      xr t        | j                  «      S r*   )rÿ  re   r¦  r·   )Úcode_objs    r1   rŠ   rŠ   '  s*   € ô 	! ×!5Ñ!5Ó6ò 	4Ü! (×"2Ñ"2Ó3ðr2   c                 óà   — d x}}|D ]S  }t        |«      }	 t        | ||||«      }|s|r|j                  s|j                  r y|j                  }|j                  }ŒU ||fS # t        $ r Y Œew xY w)N)NN)r÷  rŒ   r|   r�   r�   )	rh   r”   r™   rš   r^   r�   rc  rM   r›   s	            r1   r‹   r‹   /  s‡   € àÐ€Dˆ9ÛˆÜ)¨$Ó/ˆð
	Ü$ U¨E°4¸ÀÓGˆKÙ™	¨×(:Ò(:¸k×>SÒ>Sñ "à×%Ñ%ˆDØ#×-Ñ-‰Ið ð �dˆ?Ðøô ò 	Ùð	ús   –+A!ÁA!Á!	A-Á,A-c              #   ó
  K  — t        | d«      rsg }t        | d«      rLt        | t        j                  «      r2| j                  €J ‚t        | j                  | j                  dz   «      }n| j                  g}|D ]  }|–— Œ y y ­w)Nr`   Ú
end_linenor   )r©   r;   rQ   r“  r  r×  r`   )r^   Úlinenosr`   s      r1   rV   rV   C  st   è ø€ äˆt�XÔØˆÜ�4˜Ô&¬:°d¼C¿H¹HÔ+EØ—?‘?Ð.Ð.Ð.Ü˜DŸK™K¨¯©¸1Ñ)<Ó=‰Gà—{‘{�mˆGÛˆFØ‹Lñ ð ùs   ‚BB)r„  é   )ÚPositionNodeFinder)cr»   rç   rQ   Údisr²  r³   rm   rú  r‹  r�   Úcollectionsr   Úcopyr   Ú	functoolsr   Ú	itertoolsr   r   Úoperatorr   Úpathlibr	   Ú	threadingr
   Útokenizer   Útypingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú_utilsr   r   r   r    r!   r"   r¦   r#   r$   Úasttokens.asttokensr%   rÔ   rÕ   rj  rr   r�   r�   r(   r8   rA   ÚobjectrC   r‘   ÚNodeVisitorrX   ÚsumÚall_feature_namesrñ   rô   r‰  rÿ   r  r¾  rÈ  r�  rÒ  rÐ  rÜ  rÙ  r�  r‡  r]  rŽ   r>  r÷  r¦  rÿ  rŠ   r‹   rV   rŒ  Ú_position_node_finderr  rŒ   r¾   r2   r1   Ú<module>r     sª  ðñó0 Û 
Û 
Û Û 	Û Û 	Û 
Û Ý #Ý Ý Ý Ý !Ý Ý Ý Ý $÷ S÷  S÷  S÷  Só  Sß f× fáß,Ý/ð —‘¨×(<Ñ(<Ð=Ð á˜$Ô€à
€ô3�yô 3ñ ˆCƒL€òô UVˆVô UVôpE�ô EôD9�c—o‘oô 9ñ~ ñ Ø:D×:VÒ:Vóó €ò
ð F€òôv˜ô vòt	ò&9ò65òp6ò(ò6ò"ò òñ& ƒw€ð ñ#ó ð#òòò Fò
Qò
òò(
ð ×Ñ�wÒÞGà#�Jr2   