
    yIfi                       d dl mZ d dlZd dlZd dlZd dlmZ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 d dlmZ d dlmZ d d	lmZmZmZmZ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, ej-        dk    rd dlm.Z. nd dl/m.Z. erd dlm0Z0 d dl1m2Z2  edd          Z3 edd          Z4 edd          Z5eded         eed         df         f         Z6 G d d          Z7dS )    )annotationsN)	GeneratorIterator)cached_property)singledispatch)
TYPE_CHECKINGAnyClassVarLiteralTupleTypeTypeVarUnioncastoverload)util)InferenceContext)AstroidErrorInferenceErrorParentMissingErrorStatementMissingUseInferenceDefault)AstroidManagerAsStringVisitor)OP_PRECEDENCE)Position)InferenceErrorInfoInferenceResultInferFn)      )Self)nodes)_base_nodes_NodesTNodeNG)bound_NodesT2_NodesT3.c                     e Zd ZU dZdZded<   	 dZded<   	 dZded<   	 dZded<   dZ	d	ed
<   	 dZ
d	ed<   	 dZd	ed<   	 dZded<   dldZ	 dmdndZdod!Zdod"Zdod#Zdpd&Zdqd(Zdrd)Zdqd*Zdsd,Zdd-dtd1Zdd-dud3Zdvd5Zdwd7Zd8 Zd9 Zd: Zd; Zedxd=            Z edxd>            Z!dxd?Z"dydAZ#dzdDZ$e%	 d{d|dK            Z&e%	 d{d}dN            Z&e%	 d{d~dQ            Z&e%	 d{ddS            Z&	 dmddUZ&eddW            Z'dX Z(dY Z)dZ Z*d[ Z+d\ Z,	 dmdd^Z-d_ Z.d` Z/dsdaZ0dsdbZ1dsdcZ2doddZ3	 	 	 	 	 	 ddodhZ4dmddiZ5dj Z6dsdkZ7dS )r'   zlA node of the new Abstract Syntax Tree (AST).

    This is the base class for all Astroid node classes.
    FzClassVar[bool]is_statementoptional_assignis_function	is_lambda zClassVar[tuple[str, ...]]_astroid_fields_other_fields_other_other_fieldsNzInferFn[Self] | None_explicit_inferencelineno
int | None
col_offsetparentNodeNG | None
end_linenoend_col_offsetreturnNonec               d    || _         	 || _        	 || _        	 || _        	 || _        	 d | _        d S N)r5   r7   r8   r:   r;   position)selfr5   r7   r8   r:   r;   s         I/var/www/piapp/venv/lib/python3.11/site-packages/astroid/nodes/node_ng.py__init__zNodeNG.__init__]   sL     D$F1$D,	
 *.	 	    contextInferenceContext | Nonekwargsr	   &Generator[InferenceResult, None, None]c              +    K   |t                      }n|j                            | |          }| j        9	  | j        | |fi |D ]}|xj        dz  c_        |V  dS # t
          $ r Y nw xY w| |j        |j        |j        f}||j	        v r|j	        |         E d{V  dS g }t                      j        }t           | j        dd|i|          D ]s\  }}||k    s|j        |j        k    r/|                    t           j                   t           j        V   n*|                    |           |V  |xj        dz  c_        tt%          |          |j	        |<   dS )aV  Get a generator of the inferred values.

        This is the main entry point to the inference system.

        .. seealso:: :ref:`inference`

        If the instance has some explicit inference function set, it will be
        called instead of the default interface.

        :returns: The inferred values.
        :rtype: iterable
        N   rE   r0   )r   extra_contextgetr4   nodes_inferredr   
lookupnamecallcontext	boundnodeinferredr   max_inferable_values	enumerate_infermax_inferredappendr   Uninferabletuple)rA   rE   rG   resultkeyresultslimitis           rB   inferzNodeNG.infer   s      ?&((GG+//g>>G#/
6d6    ! !F
 **a/** LLLL&    W')<g>OP'"""',,,,,,,,F   5";4;#I#Iw#I&#I#IJJ 	( 	(IAvEzzg4w7KKKt/000&&&&NN6"""LLL""a'""" !&gs   &A 
A,+A,strc                     t           fddD                       r"t           dd          pt           dd          S dS )zyGet a name for nice representation.

        This is either :attr:`name`, :attr:`attrname`, or the empty string.
        c              3  *   K   | ]}|j         vV  d S r?   )r1   ).0namerA   s     rB   	<genexpr>z#NodeNG.repr_name.<locals>.<genexpr>   s+      QQDt4//QQQQQQrD   )rc   attrnamerc    re   )allgetattrrA   s   `rB   	repr_namezNodeNG.repr_name   sT    
 QQQQ<PQQQQQ 	N4,,Mj"0M0MMrrD   c                   |                                  }t          |           j        }|r%d}t          |          t          |          z   dz   }nd}t          |          dz   }g }| j        | j        z   D ]}t          | |d          }dt          |          z
  |z
  }t          j        |d|          	                    d          }	|	d	         g}
|	dd          D ]}|

                    d
|z  |z              |
                    | dd                    |
                      |||dd
|z  z                       |          dz  S )Nz%(cname)s.%(rname)s(%(fields)s)   z%(cname)s(%(fields)s)rJ   UnknownP   )indentwidthTr    =rf   ,
)cnamernamefields)rj   type__name__lenr2   r1   rh   pprintpformat
splitlinesrV   join)rA   ru   rt   string	alignmentrY   fieldvaluerp   linesinnerlines               rB   __str__zNodeNG.__str__   si     T

# 	'6FE

SZZ/!3II,FE

QI'$*>> 	7 	7ED%33EUOi/EN5%@@@KKDQQE1XJEabb	 5 5S9_t34444MMU55RWWU^^556666sY.44V<<
 
 
 	
rD   c                    |                                  }	 | j        }n# t          $ r d}Y nw xY w|rd}nd}|t          |           j        ||t          |           dz  S )Nr   z.<%(cname)s.%(rname)s l.%(lineno)s at 0x%(id)x>z$<%(cname)s l.%(lineno)s at 0x%(id)x>)rt   ru   r5   id)rj   
fromlinenoAttributeErrorrw   rx   r   )rA   ru   r5   r~   s       rB   __repr__zNodeNG.__repr__   s      	_FF 	 	 	FFF	 	<EFF;F$ZZ(T((	
 
 
 	
s    --visitorr   c                v    t          |d| j        j                                        z             } ||           S )z(Visit this node using the given visitor.visit_)rh   	__class__rx   lower)rA   r   funcs      rB   acceptzNodeNG.accept   s5    w4>+B+H+H+J+J JKKtDzzrD   Iterator[NodeNG]c              #     K   | j         D ]>}t          | |          }|t          |t          t          f          r	|E d{V  :|V  ?dE d{V  dS )z$Get the child nodes below this node.Nr0   r1   rh   
isinstancelistrX   rA   r   attrs      rB   get_childrenzNodeNG.get_children   sx      ) 	 	E4''D|$u.. 



rD   c                    | j         ddd         D ]>}t          | |          }|st          |t          t          f          r
|d         c S |c S dS )z1An optimized version of list(get_children())[-1].Nr   r   s      rB   
last_childzNodeNG.last_child   sj    )$$B$/ 	 	E4''D $u..  BxKKKtrD   c              #  :   K   | j         }||V  |j         }|dS dS )z7Yield parent, grandparent, etc until there are no more.Nr8   rA   r8   s     rB   node_ancestorszNodeNG.node_ancestors	  s7       LLL]F      rD   boolc                ^     t           fd|                                D                       S )zCheck if this node is the parent of the given node.

        :param node: The node to check if it is the child.
        :type node: NodeNG

        :returns: Whether this node is the parent of the given node.
        c              3      K   | ]}|u V  	d S r?   r0   )rb   r8   rA   s     rB   rd   z#NodeNG.parent_of.<locals>.<genexpr>  s'      FFf46>FFFFFFrD   )anyr   rA   nodes   ` rB   	parent_ofzNodeNG.parent_of  s4     FFFF0C0C0E0EFFFFFFrD   futurer   Literal[None, True]_base_nodes.Statementc                   |t          j        dt          d           | j        rt	          d|           S | j        st          |           | j                                        S )zThe first parent node, including self, marked as statement node.

        :raises StatementMissing: If self has no parent attribute.
        N.The future arg will be removed in astroid 4.0.rl   
stacklevelr   target)warningswarnDeprecationWarningr,   r   r8   r   	statementrA   r   s     rB   r   zNodeNG.statement  sy    
 M@"   
  	7/666{ 	0"$////{$$&&&rD   @nodes.FunctionDef | nodes.Module | nodes.ClassDef | nodes.Lambdac                   |t          j        dt          d           | j        t	          |           | j                            |          S )a
  The first parent frame node.

        A frame node is a :class:`Module`, :class:`FunctionDef`,
        :class:`ClassDef` or :class:`Lambda`.

        :returns: The first parent frame node.
        :raises ParentMissingError: If self has no parent attribute.
        Nr   rl   r   r   r   )r   r   r   r8   r   framer   s     rB   r   zNodeNG.frame+  s`     M@"   
 ;$D1111{   ///rD   nodes.LocalsDictNodeNGc                b    | j         st          |           | j                                         S )zThe first parent node defining a new scope.

        These can be Module, FunctionDef, ClassDef, Lambda, or GeneratorExp nodes.

        :returns: The first parent scope node.
        r   )r8   r   scoperi   s    rB   r   zNodeNG.scope@  s3     { 	2$D1111{  """rD   nodes.Modulec                F    | j         x}s| S |j         r|j         }|j         |S )zSReturn the root node of the syntax tree.

        :returns: The root node.
        r   r   s     rB   rootzNodeNG.rootK  s:    
 +% 	Km 	#]F m 	#rD   c                    | j         D ]?}t          | |          }||u r|gc S t          |t          t          f          r||v r|c S @d}t          |t          |          t          |           fz            )a_  Search for the sequence that contains this child.

        :param child: The child node to search sequences for.
        :type child: NodeNG

        :returns: The sequence containing the given child node.
        :rtype: iterable(NodeNG)

        :raises AstroidError: If no sequence could be found that contains
            the given child.
        "Could not find %s in %s's childrenr1   rh   r   rX   r   r   reprrA   childr   node_or_sequencemsgs        rB   child_sequencezNodeNG.child_sequenceW  s     ) 		( 		(E&tU335((()))) +eT];;(---''''23$u++tDzz!::;;;rD   c                    | j         D ]B}t          | |          }||u r||fc S t          |t          t          f          r
||v r||fc S Cd}t          |t          |          t          |           fz            )a  Find the field of this node that contains the given child.

        :param child: The child node to search fields for.
        :type child: NodeNG

        :returns: A tuple of the name of the field that contains the child,
            and the sequence or node that contains the child node.
        :rtype: tuple(str, iterable(NodeNG) or NodeNG)

        :raises AstroidError: If no field could be found that contains
            the given child.
        r   r   r   s        rB   locate_childzNodeNG.locate_childq  s     ) 		/ 		/E&tU33(((e|###+eT];;/---.....23$u++tDzz!::;;;rD   c                4    | j                                         S )z|The next sibling statement node.

        :returns: The next sibling statement node.
        :rtype: NodeNG or None
        )r8   next_siblingri   s    rB   r   zNodeNG.next_sibling  s     {'')))rD   c                4    | j                                         S )zThe previous sibling statement.

        :returns: The previous sibling statement node.
        :rtype: NodeNG or None
        )r8   previous_siblingri   s    rB   r   zNodeNG.previous_sibling  s     {++---rD   intc                F    | j         |                                 S | j         S )zThe first line that this node appears on in the source code.

        Can also return 0 if the line can not be determined.
        )r5   _fixed_source_lineri   s    rB   r   zNodeNG.fromlineno  s&     ;**,,,{rD   c                z    | j         | j         S | j        sd}n|                                 }|| j        S |j        S )zThe last line that this node appears on in the source code.

        Can also return 0 if the line can not be determined.
        N)r:   r1   r   r   tolineno)rA   r   s     rB   r   zNodeNG.tolineno  sL     ?&?"# 	+JJ**J?"""rD   c                    | j         }| }	 |*t          |                                          }|j         }|*n-# t          $ r  | j        }|r||j         }|j        }|r|Y nw xY w|pdS )zAttempt to find the line that this node appears on.

        We need this method since not all nodes have :attr:`lineno` set.
        Will return 0 if the line number can not be determined.
        Nr   )r5   nextr   StopIterationr8   )rA   r   _noder8   s       rB   r   zNodeNG._fixed_source_line  s     {	',U//1122| ,  	' 	' 	'[F 'T\}  'T\	'
 yqs   ,8 'A"!A"tuple[int, int]c                    || j         fS )zGet a range from the given line number to where this node ends.

        :param lineno: The line number to start the range at.

        :returns: The range of line numbers that this node belongs to,
            starting at the given line number.
        )r   )rA   r5   s     rB   block_rangezNodeNG.block_range  s     t}$$rD   rc   stmtc                N    | j         sJ | j                             ||           dS )a$  Define that the given name is declared in the given statement node.

        This definition is stored on the parent scope node.

        .. seealso:: :meth:`scope`

        :param name: The name that is being defined.

        :param stmt: The statement that defines the given name.
        N)r8   	set_local)rA   rc   r   s      rB   r   zNodeNG.set_local  s0     {dD)))))rD   .klasstype[_NodesT]
skip_klass
SkipKlassTIterator[_NodesT]c                    d S r?   r0   rA   r   r   s      rB   nodes_of_classzNodeNG.nodes_of_class  	    
  CrD   $tuple[type[_NodesT], type[_NodesT2]]&Iterator[_NodesT] | Iterator[_NodesT2]c                    d S r?   r0   r   s      rB   r   zNodeNG.nodes_of_class  s	    
 25rD   4tuple[type[_NodesT], type[_NodesT2], type[_NodesT3]];Iterator[_NodesT] | Iterator[_NodesT2] | Iterator[_NodesT3]c                    d S r?   r0   r   s      rB   r   zNodeNG.nodes_of_class  s    
 GJcrD   tuple[type[_NodesT], ...]c                    d S r?   r0   r   s      rB   r   zNodeNG.nodes_of_class  r   rD   type[_NodesT] | tuple[type[_NodesT], type[_NodesT2]] | tuple[type[_NodesT], type[_NodesT2], type[_NodesT3]] | tuple[type[_NodesT], ...]c              #  (  K   t          | |          r| V  |5|                                 D ]}|                    ||          E d{V  dS |                                 D ]/}t          ||          r|                    ||          E d{V  0dS )a+  Get the nodes (including this one or below) of the given types.

        :param klass: The types of node to search for.

        :param skip_klass: The types of node to ignore. This is useful to ignore
            subclasses of :attr:`klass`.

        :returns: The node of the given types.
        N)r   r   r   )rA   r   r   
child_nodes       rB   r   zNodeNG.nodes_of_class  s      & dE"" 	JJJ"//11 H H
%44UJGGGGGGGGGGF++-- 	D 	DJ*j11 !00
CCCCCCCCCC	D 	DrD   list[nodes.Assign]c                    g S r?   r0   ri   s    rB   _assign_nodes_in_scopezNodeNG._assign_nodes_in_scope$  s    	rD   c              #  l   K   |                                  D ]}|                                E d {V  d S r?   )r   _get_name_nodes)rA   r   s     rB   r   zNodeNG._get_name_nodes(  sR      ++-- 	4 	4J!113333333333	4 	4rD   c              #     K   dE d {V  d S Nr0   r0   ri   s    rB    _get_return_nodes_skip_functionsz'NodeNG._get_return_nodes_skip_functions,        rD   c              #     K   dE d {V  d S r   r0   ri   s    rB   _get_yield_nodes_skip_functionsz&NodeNG._get_yield_nodes_skip_functions/  r   rD   c              #     K   dE d {V  d S r   r0   ri   s    rB   _get_yield_nodes_skip_lambdasz$NodeNG._get_yield_nodes_skip_lambdas2  r   rD   c                    d S r?   r0   )rA   r   rc   s      rB   _infer_namezNodeNG._infer_name5  s    rD   ;Generator[InferenceResult, None, InferenceErrorInfo | None]c                &    t          d| |          )z4We don't know how to resolve a statement by default.z#No inference function for {node!r}.)r   rE   )r   )rA   rE   rG   s      rB   rT   zNodeNG._infer9  s"    
 1g
 
 
 	
rD   c                D    t          |                                           S )zGet a list of the inferred values.

        .. seealso:: :ref:`inference`

        :returns: The inferred values.
        :rtype: list
        )r   r^   ri   s    rB   rQ   zNodeNG.inferredB  s     DJJLL!!!rD   c                    | S )zInstantiate an instance of the defined class.

        .. note::

            On anything other than a :class:`ClassDef` this will return self.

        :returns: An instance of the defined class.
        :rtype: object
        r0   ri   s    rB   instantiate_classzNodeNG.instantiate_classL  s	     rD   c                    dS )zCheck if this node inherits from the given type.

        :param node: The node defining the base to look for.
            Usually this is a :class:`Name` node.
        :type node: NodeNG
        Fr0   r   s     rB   has_basezNodeNG.has_baseX  s	     urD   c                    dS )zWhether this node defines something that is callable.

        :returns: Whether this defines something that is callable.
        Fr0   ri   s    rB   callablezNodeNG.callablea  s	    
 urD   c                    dS )NFr0   )rA   r   s     rB   eqz	NodeNG.eqh  s    urD   c                0     t                      |           S )z.Get the source code that this node represents.r   ri   s    rB   	as_stringzNodeNG.as_stringk  s       &&&rD      r   rn   c                z  
 t           dfd	            

                    t                    
                    t                    d
fd	                        }
                    t                    d
fd	            }g }	 
| |	t                                 d                    |	          S )a  Get a string representation of the AST from this node.

        :param ids: If true, includes the ids with the node type names.
        :type ids: bool

        :param include_linenos: If true, includes the line numbers and
            column offsets.
        :type include_linenos: bool

        :param ast_state: If true, includes information derived from
            the whole AST like local and global variables.
        :type ast_state: bool

        :param indent: A string to use to indent the output string.
        :type indent: str

        :param max_depth: If set to a positive integer, won't return
            nodes deeper than max_depth in the string.
        :type max_depth: int

        :param max_width: Attempt to format the output string to stay
            within this number of characters, but can exceed it under some
            circumstances. Only positive integer values are valid, the default is 80.
        :type max_width: int

        :returns: The string representation of the AST.
        :rtype: str
        rf   rJ   c           	     B   t          j        | t          t                    z
  d                                        d          }|                    |d                    |                    fd|dd         D                        t          |          dk    S )zOutputs a representation of a non-tuple/list, non-node that's
            contained within an AST, including strings.
            rJ   )rp   Tr   c                    g | ]}|z   S r0   r0   )rb   r   
cur_indents     rB   
<listcomp>z8NodeNG.repr_tree.<locals>._repr_tree.<locals>.<listcomp>  s    CCC:,CCCrD   N)rz   r{   maxry   r|   rV   extend)r   rY   doner  depthr   	max_widths      `  rB   
_repr_treez$NodeNG.repr_tree.<locals>._repr_tree  s    
 NC	C
OO ;Q??  j  MM%(###MMCCCCqrrCCCDDDu::?"rD   c                   |z  }|                     d           | sd}n3t          |           dk    r | d         ||||          }n	t          |           dk    ro | d         ||||          }|s|                     d           n*|                     d           |                     |            | d         ||||          p|}n|                     d           |                     |           | d	d
         D ];} |||||           |                     d           |                     |           < | d
         ||||           d}|                     d           |S )z_Outputs a representation of a sequence that's contained within an
            AST.
            [FrJ   r   rl   z, rs   
Nr   T])rV   ry   )	r   rY   r  r  r  brokenr   r  ro   s	          rB   	_repr_seqz#NodeNG.repr_tree.<locals>._repr_seq  s    & JMM# Ta#DGVT:uMMTa#DGVT:uMM .MM$''''MM%(((MM*---#DGVT:uMMWQWd###j)))!#2#Y . .EJufdJFFFMM%(((MM*----
48VT:uEEEMM#MrD   c           	     L   | |v r?|                     dt          |           j         dt          |            z              dS |                    |            r|k    r|                     d           dS |dz  }|z  }
r<|                     t          |           j         dt          |           dd           n*|                     t          |           j         d	           g }r|                    d
           |                    | j                   |                    | j                   	r|                    | j                   |sd}n5t          |          dk    rB|                     |d          d            t          | |d                   ||||          }n|                     d           |                     |           |dd         D ]h}|dk    r	|                     | d            t          | |          ||||           |                     d           |                     |           i|                     |d          d            t          | |d                   ||||           d}|                     d           |S )z4Outputs a strings representation of an astroid node.z<Recursion on z	 with id=Fz...rJ   z<0xxz>(
()r5   r7   r   rr   r  Nr   docrs   T))rV   rw   rx   r   addr  r2   r1   r3   ry   rh   )r   rY   r  r  r  rv   r  r   r  	ast_stateidsinclude_linenosro   	max_depths           rB   
_repr_nodez$NodeNG.repr_tree.<locals>._repr_node  s    t||Vd4jj.AVVBtHHVVV   uHHTNNN UY..e$$$uQJE& J 9d!4IIDIIIIJJJJd!4777888F 86777MM$,---MM$./// 8d6777 V!!ooo...#D&),,fdJ  d###j)))#CRC[ . .E~~ MMU+++...JwtU33VT:uUUUMM%(((MM*----...///
7444fdJPUVVVMM#MrD   )rf   rJ   )_singledispatchregisterrX   r   r'   setr}   )rA   r'  r(  r&  ro   r)  r  r  r*  rY   r  s    ``````   @rB   	repr_treezNodeNG.repr_treeo  s   L 
		# 		# 		# 		# 		# 
		# 
		U	#	#			T	"	"	 	 	 	 	 	 
#	" 
$	#	> 
		V	$	$/	 /	 /	 /	 /	 /	 /	 /	 /	 /	 
%	$/	b 
4'''wwvrD   c                    t           j        S )ak  Determine the boolean value of this node.

        The boolean value of a node can have three
        possible values:

            * False: For instance, empty data structures,
              False, empty strings, instances which return
              explicitly False from the __nonzero__ / __bool__
              method.
            * True: Most of constructs are True by default:
              classes, functions, modules etc
            * Uninferable: The inference engine is uncertain of the
              node's value.

        :returns: The boolean value of this node.
        :rtype: bool or Uninferable
        )r   rW   )rA   rE   s     rB   
bool_valuezNodeNG.bool_value  s    $ rD   c                d    t          j        | j        j        t	          t                               S r?   )r   rL   r   rx   ry   ri   s    rB   op_precedencezNodeNG.op_precedence  s"     !8#m:L:LMMMrD   c                    dS )NTr0   ri   s    rB   op_left_associativezNodeNG.op_left_associative  s    trD   )r5   r6   r7   r6   r8   r9   r:   r6   r;   r6   r<   r=   r?   )rE   rF   rG   r	   r<   rH   )r<   r_   )r   r   r<   r_   )r<   r   )r<   r9   )r<   r   )r   r   r<   r   )r   r   r<   r   )r<   r   )r<   r   )r<   r   )r5   r   r<   r   )rc   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<   r   )rE   rF   rG   r	   r<   r  )FFFr  r   rn   )rE   rF   )8rx   
__module____qualname____doc__r,   __annotations__r-   r.   r/   r1   r2   r3   r4   rC   r^   rj   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   rT   rQ   r  r  r	  r  r  r.  r0  r2  r4  r0   rD   rB   r'   r'   ;   s         
 $)L((((2      #(K''''1 %I%%%% 24O3333 02M1111:5777777044444       F 267 7 7 7 7r   
 
 
 
4
 
 
 
$   

 
 
 
	 	 	 	# # # #G G G G :> ' ' ' ' ' '$ 040 0 0 0 0 0*	# 	# 	# 	#
 
 
 
< < <4< < <:* * *. . .    _ # # # _#    &% % % %* * * *  "%        X   "%5 5 5 5 X5  "%J J J J XJ  "%        X  "&D D D D DB    _4 4 4        
 26
 
 
 
 
" " "
 
 
         ' ' ' ' H H H H HT         (N N N     rD   )8
__future__r   rz   sysr   collections.abcr   r   	functoolsr   r   r+  typingr   r	   r
   r   r   r   r   r   r   r   astroidr   astroid.contextr   astroid.exceptionsr   r   r   r   r   astroid.managerr   astroid.nodes.as_stringr   astroid.nodes.constr   astroid.nodes.utilsr   astroid.typingr   r   r    version_infor#   typing_extensionsr$   astroid.nodesr%   r&   r)   r*   r   r'   r0   rD   rB   <module>rI     s  
 # " " " " "  



  / / / / / / / / % % % % % % 7 7 7 7 7 7                              , , , , , ,              + * * * * * 3 3 3 3 3 3 - - - - - - ( ( ( ( ( ( G G G G G G G G G Gw&&&&&&  *)))))) ')8
,
,
,7:X...7:X...4htH~s/B)CCD
X X X X X X X X X XrD   