
    shd                     `   S SK r S SKrS SKJr  S SKJrJr  S SKJr  S SK	J
r
JrJr  S SKJr  0 rSSS.rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$S r%S r& " S S \5      r' " S! S"\5      r( " S# S$\5      r)\*S%:X  a  \RV                  " 5         gg)&    N)jit)CFGraphControlFlowAnalysis)types)FunctionIdentityByteCode_fix_LOAD_GLOBAL_arg)TestCaseT)_nrtnopythonc                 6    Sn[        U 5       H  nX#-  nM	     U$ Nr   rangexyresultis       q/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/tests/test_flow_control.pyfor_loop_usecase1r      s!    F1X M    c                 T    Sn[        [        XS5      5       H  u  p4X#U-  -  nM     U$ )Nr   )	enumerater   r   r   r   r   js        r   for_loop_usecase2r      s.    F%b/*a% +Mr   c                 *    SnX/nU H  nX$-  nM	     U$ r    )r   r   r   lstr   s        r   for_loop_usecase3r"      s$    F&C Mr   c                 \    Sn[        S5       H  n[        S5       H  nUS-  nM
     M     U$ )Nr   
      r   r   s        r   for_loop_usecase4r&   %   s3    F2YrAaKF   Mr   c                 H    Sn[        U 5       H  nUS-  nX!:  d  M    U$    U$ Nr   r%   r   r   s       r   for_loop_usecase5r)   -   s2    F1X!:M	  Mr   c                 F    Sn[        U 5       H  nX1:  a  M
  US-  nM     U$ r(   r   r   s       r   for_loop_usecase6r+   6   s-    F1X5!  Mr   c                 R    [        U 5       H  nSn [        U 5       H  n    g   M     gr(   r   )r   r   r   r   s       r   for_loop_usecase7r-   ?   s0    1XqA    r   c                 D    Sn[        XX-
  S-   5       H  nUS-  nM
     U$ r(   r   r   s       r   for_loop_usecase8r/   I   s,    F1#! $Mr   c                 |    Sn[        U 5       H*  nSn [        U 5       H  nX@S-  :X  d  M  X$-  n  M$     X!-  nM,     U$ )Nr      r   )r   r   zr   r   s        r   for_loop_usecase9r3   P   sK    	A1XqAEz 
 FA  Hr   c                 H    [        U 5       H  nX!:X  d  M
  Un  U$    WS-  nU$ )Nr1   r   )r   r   r   r2   s       r   for_loop_usecase10r5   ^   s4    1X6A H 
 EHr   c                 8    SnSnX0:  a  X#-  nUS-  nX0:  a  M  U$ r(   r    r   s       r   while_loop_usecase1r7   h   s/    F	A
%	Q % Mr   c                 ,    SnX :w  a  US-  nX :w  a  M  U$ r(   r    r   r   r   s      r   while_loop_usecase2r:   q   s!    F
+! +Mr   c                 d    SnSnSnX0:  a$  XA:  a  X#U-   -  nUS-  nUS-  nXA:  a  M  X0:  a  M$  U$ r(   r    r   s        r   while_loop_usecase3r<   x   sM    F	A	A
%e!eOFFAFA e %
 Mr   c                 &    Sn US-  nX :  a   U$ M  r(   r    r9   s      r   while_loop_usecase4r>      s%    F
!:M	 r   c                 D    SnX :  a  X!:  a  US-  nM  US-  nX :  a  M  U$ )Nr   r1   r%   r    r9   s      r   while_loop_usecase5r@      s4    F
*:aKF!	 *
 Mr   c                 &    U S:  a   gUS:  a   g g)Nr   Tr    r   r   s     r   ifelse_usecase1rC      s*    1u
 	 
Q  	r   c                 *    X:  a  gU S:X  d  US:X  a  gg)Nr%   r   r1      r    rB   s     r   ifelse_usecase2rF      s    u	
a16r   c                 <    U S:  a  US:  a  gUS:  a  ggU S:  a  ggr(   r    rB   s     r   ifelse_usecase3rH      s-    1uq5U	
Qr   c                     X:X  a  gg Nr%   r    rB   s     r   ifelse_usecase4rK      s    v r   c                     X:  a  S$ S$ )NTFr    rB   s     r   ternary_ifelse_usecase1rM      s    54#e#r   c                 N    U nUn  X2S-
  :X  a  OUS-  nM  US-  nX2:  a   X24$ M!  rJ   r    )r   r   Lr   s       r   double_infinite_looprP      sK    	A	A
EzFA  	
Q64K r   c                  &     g ! [          a     g f = fN)	Exceptionr    r   r   try_except_usecaserT      s     s   
c                      \ rS rSr\4S jr\4S jrS r\4S jrS r	\4S jr
S r\4S	 jrS
 r\4S jrS r\4S jrS r\4S jrS r\4S jrS r\4S jrS r\4S jrS r\4S jrS r\4S jrS r\4S jrS r\4S jr S r!\4S jr"S  r#\4S! jr$S" r%\4S# jr&S$ r'\4S% jr(S& r)\4S' jr*S( r+\4S) jr,S* r-\4S+ jr.S, r/S-r0g.)/TestFlowControl   c                    [        [        R                  [        R                  440 UD6" U5      n[        R                  " X#5       HD  u  pgS nS n	 U" Xg5      n
 U" Xg5      nUb  U R                  SU-   5        U R                  W
U5        MF     g ! [
         a  nUn S nANHS nAff = f! [
         a5  nUc  e Un	U R                  [        U5      [        U	5      5         S nAM  S nAff = f)Nz(Invalid for pure-python but numba works
)	r   r   intp	itertoolsproductrS   failassertEqualtype)selfpyfunc
x_operands
y_operandsflagscfuncr   r   pyerrcerrpyresecress                r   run_testTestFlowControl.run_test   s    UZZ,66v>%%j=DAEDq.Q{ $III#$ %  -' >
  
  :=  ed4j99	:s0   BB)
B&B!!B&)
C(3*C##C(c                 6    U R                  [        / SQS/US9  g )Nir   r$   r   rc   )rj   r   r_   rc   s     r   test_for_loop1TestFlowControl.test_for_loop1   s    's%Hr   c                 *    U R                  [        S9  g Nrn   )rp   no_pyobj_flagsr_   s    r   test_for_loop1_npm"TestFlowControl.test_for_loop1_npm       .1r   c                 8    U R                  [        / SQ/ SQUS9  g )Nrm   rn   )rj   r   ro   s     r   test_for_loop2TestFlowControl.test_for_loop2   s    '|! 	 	#r   c                 *    U R                  [        S9  g rs   )rz   rt   ru   s    r   test_for_loop2_npm"TestFlowControl.test_for_loop2_npm   rx   r   c                 4    U R                  [        S/S/US9  g)z
List requires pyobject
r%   r1   rn   N)rj   r"   ro   s     r   test_for_loop3TestFlowControl.test_for_loop3   s#     	'!qc! 	 	#r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_for_loop3_npm"TestFlowControl.test_for_loop3_npm  rx   r   c                 4    U R                  [        S/S/US9  g Nr$   rn   )rj   r&   ro   s     r   test_for_loop4TestFlowControl.test_for_loop4	  s    '"t5Ar   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_for_loop4_npm"TestFlowControl.test_for_loop4_npm  rx   r   c                 4    U R                  [        S/S/US9  g Nd   2   rn   )rj   r)   ro   s     r   test_for_loop5TestFlowControl.test_for_loop5      '#EBr   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_for_loop5_npm"TestFlowControl.test_for_loop5_npm  rx   r   c                 4    U R                  [        S/S/US9  g r   )rj   r+   ro   s     r   test_for_loop6TestFlowControl.test_for_loop6  r   r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_for_loop6_npm"TestFlowControl.test_for_loop6_npm  rx   r   c                 4    U R                  [        S/S/US9  g )N   r   rn   )rj   r-   ro   s     r   test_for_loop7TestFlowControl.test_for_loop7  s    '!qc?r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_for_loop7_npm"TestFlowControl.test_for_loop7_npm  rx   r   c                 8    U R                  [        SS// SQUS9  g Nr   r%   )r   r1   r$   rn   )rj   r/   ro   s     r   test_for_loop8TestFlowControl.test_for_loop8!      '!Q5Ir   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_for_loop8_npm"TestFlowControl.test_for_loop8_npm$  rx   r   c                 8    U R                  [        SS// SQUS9  g r   )rj   r3   ro   s     r   test_for_loop9TestFlowControl.test_for_loop9'  r   r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_for_loop9_npm"TestFlowControl.test_for_loop9_npm*  rx   r   c                 6    U R                  [        S/SS/US9  g )Nr   r1      rn   )rj   r5   ro   s     r   test_for_loop10TestFlowControl.test_for_loop10-  s    (1#1vUCr   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_for_loop10_npm#TestFlowControl.test_for_loop10_npm0  s    >2r   c                 4    U R                  [        S/S/US9  g Nr$   r   rn   )rj   r7   ro   s     r   test_while_loop1 TestFlowControl.test_while_loop13      )B4!EBr   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_while_loop1_npm$TestFlowControl.test_while_loop1_npm6      N3r   c                 4    U R                  [        S/S/US9  g r   )rj   r:   ro   s     r   test_while_loop2 TestFlowControl.test_while_loop29  r   r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_while_loop2_npm$TestFlowControl.test_while_loop2_npm<  r   r   c                 4    U R                  [        S/S/US9  g r   )rj   r<   ro   s     r   test_while_loop3 TestFlowControl.test_while_loop3?  s    )B4"UCr   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_while_loop3_npm$TestFlowControl.test_while_loop3_npmB  r   r   c                 4    U R                  [        S/S/US9  g r   )rj   r>   ro   s     r   test_while_loop4 TestFlowControl.test_while_loop4E  r   r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_while_loop4_npm$TestFlowControl.test_while_loop4_npmH  r   r   c                 8    U R                  [        / SQ/ SQUS9  g )N)r   r   r$   rn   )rj   r@   ro   s     r   test_while_loop5 TestFlowControl.test_while_loop5K  s    ):zOr   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_while_loop5_npm$TestFlowControl.test_while_loop5_npmN  r   r   c                 8    U R                  [        / SQ/ SQUS9  g N)r   r   r%   rn   )rj   rC   ro   s     r   test_ifelse1TestFlowControl.test_ifelse1Q      oz:UKr   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_ifelse1_npm TestFlowControl.test_ifelse1_npmT      /r   c                 8    U R                  [        / SQ/ SQUS9  g r   )rj   rF   ro   s     r   test_ifelse2TestFlowControl.test_ifelse2W  r   r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_ifelse2_npm TestFlowControl.test_ifelse2_npmZ  r   r   c                 8    U R                  [        / SQ/ SQUS9  g r   )rj   rH   ro   s     r   test_ifelse3TestFlowControl.test_ifelse3]  r   r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_ifelse3_npm TestFlowControl.test_ifelse3_npm`  r   r   c                 8    U R                  [        / SQ/ SQUS9  g r   )rj   rK   ro   s     r   test_ifelse4TestFlowControl.test_ifelse4c  r   r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_ifelse4_npm TestFlowControl.test_ifelse4_npmf  r   r   c                 8    U R                  [        / SQ/ SQUS9  g r   )rj   rM   ro   s     r   test_ternary_ifelse1$TestFlowControl.test_ternary_ifelse1i  s    -z:! 	 	#r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_ternary_ifelse1_npm(TestFlowControl.test_ternary_ifelse1_npmm  s    !!!7r   c                 4    U R                  [        S/S/US9  g r   )rj   rP   ro   s     r   test_double_infinite_loop)TestFlowControl.test_double_infinite_loopp  s!    *RD1#! 	 	#r   c                 *    U R                  [        S9  g rs   )r   rt   ru   s    r   test_double_infinite_loop_npm-TestFlowControl.test_double_infinite_loop_npmt  s    &&^&<r   r    N)1__name__
__module____qualname____firstlineno__enable_pyobj_flagsrj   rp   rv   rz   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   r   r   __static_attributes__r    r   r   rV   rV      sY    *.0 $6 I2 $6 #2 $6 #2 $6 B2 $6 C2 $6 C2 $6 @2 $6 J2 $6 J2 %7 D3 &8 C4 &8 C4 &8 D4 &8 C4 &8 P4 "4 L0 "4 L0 "4 L0 "4 L0 *< #8 /A #=r   rV   c                       \ rS rSrSrS!S jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r Sr!g )"TestCFGraphix  z+
Test the numba.controlflow.CFGraph class.
c                     [        5       nU H  nUR                  U5        M     UR                  5        H  u  pEU H  nUR                  XF5        M     M!     U$ )z7
Build a CFGraph class from a dict of adjacency lists.
)r   add_nodeitemsadd_edge)r_   dentry_pointgnodedestsdests          r   from_adj_listTestCFGraph.from_adj_list}  sP     IDJJt 779KD

4&  % r   c                 |    U R                  SS/S/S// S.5      nUR                  S5        UR                  5         U$ )zs
A simple CFG corresponding to the following code structure:

    c = (... if ... else ...) + ...
    return b + c
         r   r  r  r  r   r  set_entry_pointprocessr_   r  s     r   	loopless1TestCFGraph.loopless1  sA     B8"B4RHI	!			r   c                     U R                  SS/S/S// SS/SS/S// S.5      nUR                  S5        UR                  5         U$ )	zK
Same as loopless1(), but with added dead blocks (some of them
in a loop).
r  r  r  r   [   ]   \   )r   r  r  r  r   r"  r!  ^   r  r  s     r   loopless1_dead_nodes TestCFGraph.loopless1_dead_nodes  sa    
 Rab	 	
!			r   c           	          U R                  SS/S/S/SS// / S.5      nUR                  S5        UR                  5         U$ )z
A loopless CFG corresponding to the following code structure:

    c = (... if ... else ...) + ...
    if c:
        return ...
    else:
        return ...

Note there are two exit points, and the entry point has been
changed to a non-zero value.
r  r  r  *   "   c   r  r  r  r(  r'  r*  r  r  s     r   	loopless2TestCFGraph.loopless2  sM     bt"B8LN	"			r   c                     U R                  0 SS/_SSS/_SS/_SS/_SSS/_SS	S
/_S	S/_S
S/_SS/_SS/_SS/_SS/_SSS/_SSS/_S/ _SS/_S/ _5      nUR                  S5        UR                  5         U$ )z
A CFG with multiple nested loops:

    for y in b:
        for x in a:
            # This loop has two back edges
            if b:
                continue
            else:
                continue
    for z in c:
        if z:
            return ...
r   r   r$   <         8          ,   9   =   D   W   G   P   X   r  r  s     r   multiple_loopsTestCFGraph.multiple_loops  s$      (A3  ( !B8 ( "RD ( !#RD ( !#RH	 (
 !#RH ( !#RD ( !#RD ( !#RD ( !#QC ( !#RD ( !#RD ( !#RH ( !#RH ( !#B ( !#RD (  !#B! ( !$ 	
!			r   c                     U R                  S/SS/SS// SS/S/S// S.5      nUR                  S	5        UR                  5         U$ )
z
A CFG with three loop exits, one of which is also a function
exit point, and another function exit point:

    for x in a:
        if a:
            return b
        elif b:
            break
    return c
r   r$   $      r2     %   r   r   r$   r@  r2  rA  r?  rB  r   r  r  s     r   multiple_exitsTestCFGraph.multiple_exits  sa     Rba	 	
!			r   c           	          U R                  SS// S/SS/S/S/S.5      nUR                  S5        UR                  5         U$ )z
A CFG with a infinite loop and an alternate exit point:

    if c:
        return
    while True:
        if a:
            ...
        else:
            ...
r$      r/     r@  r   rG  r$   r/  r@  rH  r   r  r  s     r   infinite_loop1TestCFGraph.infinite_loop1  sO     QBRDr2hRDrdKM	!			r   c                 ~    U R                  S/SS/S/S/S.5      nUR                  S5        UR                  5         U$ )zo
A CFG with no exit point at all:

    while True:
        if a:
            ...
        else:
            ...
rE      	   r   rE   rN  rM  r   r  r  s     r   infinite_loop2TestCFGraph.infinite_loop2  sC     A3B7sDE	!			r   c                 |   U R                  5       nU R                  [        UR                  S5      5      SS/5        U R                  [        UR                  S5      5      / 5        U R                  [        UR	                  S5      5      / 5        U R                  [        UR	                  S5      5      SS/5        g )Nr   )r  N)r  Nr  )r  r]   sorted
successorspredecessorsr  s     r   test_simple_properties"TestCFGraph.test_simple_properties  s    NNQ0:z2JKR 0126q 12B7r 23j*5MNr   c                 4   U R                  5       nU R                  [        UR                  5       5      S/5        U R	                  5       nU R                  [        UR                  5       5      S/5        U R                  5       nU R                  [        UR                  5       5      SS/5        U R                  5       nU R                  [        UR                  5       5      SS/5        U R                  5       nU R                  [        UR                  5       5      S/5        U R                  5       nU R                  [        UR                  5       5      / 5        U R                  5       nU R                  [        UR                  5       5      SS/5        g )	Nr  r(  r'  r:  r;  rG  r@  rB  )
r  r]   rS  exit_pointsr$  r+  r<  rJ  rP  rD  r  s     r   test_exit_pointsTestCFGraph.test_exit_points#  s/   NN02$7%%'02$7NN02r(;!02r(;!01#6!0"5!02r(;r   c                    U R                  5       nU R                  [        UR                  5       5      S5        U R                  [	        UR                  5       5      / SQ5        U R                  5       nU R                  [        UR                  5       5      S5        U R                  [	        UR                  5       5      / SQ5        U R                  5       nU R                  [        UR                  5       5      S5        U R                  5       nU R                  [        UR                  5       5      S5        U R                  5       nU R                  [        UR                  5       5      S5        U R                  5       nU R                  [	        UR                  5       5      / SQ5        U R                  [	        UR                  5       5      / SQ5        g )Nr   r  r  r  r  r(  r'  r*  )r   r"  r!  r#  )r  r]   len
dead_nodesrS  nodesr+  r<  rJ  rD  r$  r  s     r   test_dead_nodesTestCFGraph.test_dead_nodes3  sQ   NNQ\\^,a0	*(	*NNQ\\^,a0	*1	3!Q\\^,a0!Q\\^,a0!Q\\^,a0%%'/)	+	*(	*r   c                    U R                  5       nUR                  S5      nU R                  [        U5      / 5        UR                  S5      nU R                  [        U5      / 5        UR                  S5      nU R                  [        U5      SS/5        UR                  S5      nU R                  [        U5      / SQ5        U R	                  5       nUR                  S5      nU R                  [        U5      / 5        UR                  S5      nU R                  [        U5      / 5        UR                  S5      nU R                  [        U5      SS/5        UR                  S	5      nU R                  [        U5      / S
Q5        UR                  S5      nU R                  [        U5      / 5        UR                  S5      nU R                  [        U5      / SQ5        g )Nr(  r'  r  r*  )r  r  r  r(  r'  rH  r@  r/  r$   r/  r@  rH  rG  r   )rG  r$   r/  r@  rH  )r+  descendentsr]   rS  rJ  )r_   r  r  s      r   test_descendentsTestCFGraph.test_descendentsI  sz   NNMM"B'MM"B'MM"RH-MM"$89!MM"B'MM"B'MM"RH-MM"L1MM!B'MM!$78r   c                    U R                  5       nU R                  UR                  5       / SQ/ SQ45        U R                  5       nU R                  UR                  5       / SQ/ SQ45        U R	                  5       nU R                  UR                  5       / SQ/ SQ45        U R                  5       nU R                  UR                  5       / SQ/ SQ/ S	Q/ S
Q45        g )Nr  )r   r  r  r  )r*  r  r  r  r(  r'  r)  rO  )r   rE   rM  rN  rI  )r   rG  r$   r/  rH  r@  )r   r$   r/  r@  rH  rG  )r   r$   r/  rH  r@  rG  )r  assertIn
topo_orderr+  rP  rJ  r  s     r   test_topo_orderTestCFGraph.test_topo_ordera  s    NNalln&8	:NNalln/1IJ	L!alln$m4	6!alln-/E-/EG	Hr   c                    ^ ^ UU 4S jnT R                  5       mU" / SQ/ SQ45        U" / SQ/ SQ/ SQ45        T R                  5       mU" / SQ/ SQ/ S	Q/ S
Q45        g )Nc           
      j  > TR                  [        TR                  U 5      5      U5        TR                  [        TR                  U S S S2   5      5      U5        TR                  [        TR                  U SS95      S S S2   U5        TR                  [        TR                  U S S S2   SS95      S S S2   U5        TR                  R	                  U 5        TR                  [        TR                  U 5      5      U5        TR                  [        TR                  U SS95      S S S2   U5        g )Nr   T)reverse)ri  list	topo_sortrandomshuffle)r`  expectedr  r_   s     r   check_topo_sort3TestCFGraph.test_topo_sort.<locals>.check_topo_sortq  s    MM$q{{512H=MM$q{{52;78(CMM$q{{5${?@2F"$MM$q{{52;{EFttL"$KK&MM$q{{512H=MM$q{{5${?@2F"$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@  )r+  rD  )r_   ru  r  s   ` @r   test_topo_sortTestCFGraph.test_topo_sortp  s\    
	$ NN(+;*=>()+;<	>!(/?K	Mr   c                     U R                  [        U5      [        U5      5        [        U5       H0  nU R                  [        X   5      [        X#   5      SU< 35        M2     g )Nzmismatch for r]   rS  )r_   gotrt  r  s       r   check_dominatorsTestCFGraph.check_dominators  sO    fX&673KDVCI.x~0F268:  r   c                   ^ ^ UU 4S jnT R                  5       T R                  5       4 H>  nUR                  5       mU" SS/5        U" SSS/5        U" SSS/5        U" SSS/5        M@     T R                  5       nUR                  5       mU" SS/5        U" SSS/5        U" SSS/5        U" SSS/5        U" S/ SQ5        U" S	/ S
Q5        g )Nc                 B   > TR                  [        TU    5      U5        g rR   rz  r  ldomsr_   s     r   eq_1TestCFGraph.test_dominators_loopless.<locals>.eq_      VDG_a0r   r   r  r  r  r*  r(  )r  r(  r*  r'  )r  r'  r*  )r  r$  
dominatorsr+  r_   r  r  r  s   `  @r   test_dominators_loopless$TestCFGraph.test_dominators_loopless  s    	1.."D$=$=$?@A<<>DA3KQGQGQG A NN||~BBRBRBRBBr   c                 ,   U R                  5       nUR                  5       nU R                  US/SS// SQ/ SQ/ SQ/ SQ/ SQ/ SQS	.5        U R                  5       nUR                  5       nU R                  U0 SS/_SSS/_S
/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S / S!Q_S"/ S#Q_S$/ S%Q_S&/ S'Q_5        U R	                  5       nUR                  5       nU R                  US/SS(/SS
// S)Q/ S*Q/ S+QS,.5        g )-Nr   r   )r   r   r$   )r   r   r$   r@  )r   r   r$   r2  )r   r   r$   r2  rA  )r   r   r?  )r   r   rB  rC  r$   )r   r$   r   r/  )r   r$   r/  r   r0  )r   r$   r0  r/  r   r2  )r   r0  r2  r   r$   r/  r3  )r3  r   r0  r2  r   r$   r/  r4  )r   r0  r2  r   r$   r4  r/  r1  )r   r0  r   r1  r$   r/  r5  )r   r0  r   r1  r5  r$   r/  r.  )r   r.  r   r6  )r   r.  r6  r   r7  )r   r7  r.  r6  r   r9  )r   r7  r9  r   r.  r6  r:  )r:  r   r7  r9  r   r.  r6  r8  )r   r7  r8  r   r.  r6  r;  )r   r7  r8  r;  r   r.  r6  rG  )r   r$   r/  )r   r$   r@  r/  )r   r$   r/  rH  rI  )rD  r  r|  r<  rJ  r_   r  r  s      r   test_dominators_loops!TestCFGraph.test_dominators_loops  s   !||~d#$##$a&#-#1#1#5#-#-!		" !||~d!q1# ! 1a&!!:!  ">!  "#5	!
  "#9!  "#=!  "#=!  "#9!  "#=!  ":!  ">!  "#5!  "#9!  "#=!  "#9!   "#=!!	"& !||~d#$##$a&$%r7#.#2#2!	"r   c                   ^ ^ UU 4S jnT R                  5       T R                  5       4 H>  nUR                  5       mU" SSS/5        U" SSS/5        U" SSS/5        U" SS/5        M@     T R                  5       nUR                  5       mU" SS/5        U" SS/5        U" SS/5        U" SSS/5        U" SSS/5        U" SSS/5        g )	Nc                 B   > TR                  [        TU    5      U5        g rR   rz  r  s     r   r  6TestCFGraph.test_post_dominators_loopless.<locals>.eq_  r  r   r   r  r  r  r(  r'  r*  )r  r$  post_dominatorsr+  r  s   `  @r   test_post_dominators_loopless)TestCFGraph.test_post_dominators_loopless  s    	1.."D$=$=$?@A$$&DAr7ORHRHRDM A NN  "BBBBRBRBRr   c                    U R                  5       nUR                  5       nU R                  USS/S/S/S/S/SS/SS/S/S	.5        U R                  5       nUR                  5       nU R                  U0 S/ S
Q_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_SSS/_SS/_SS/_SS/_S S!S /_S!S!/_5        g )"Nr   r   r$   r@  r2  rA  rB  r?  rC  )r   r.  r7  r6  r   )r.  r7  r6  r   )	r7  r   r$   r/  r0  r1  r5  r.  r6  r/  )r7  r   r/  r0  r1  r5  r.  r6  r0  )r0  r7  r   r1  r5  r.  r6  )r7  r   r0  r2  r1  r5  r.  r6  r3  )r3  r7  r   r0  r1  r5  r.  r6  r4  )r7  r   r4  r0  r1  r5  r.  r6  r1  )r7  r   r1  r5  r.  r6  r5  )r5  r.  r7  r6  r   r.  )r.  r7  r6  r6  r7  r9  r:  r8  r;  )rD  r  r|  r<  r  s      r   test_post_dominators_loops&TestCFGraph.test_post_dominators_loops  sr   !  "d#$a&#$#$&4$&4$&4$&8$&8$&4!		" !  "d!q"4 ! /!!#F!  "#B!  "#>	!
  "#B!  "#B!  "#B!  "#:!  "#6!  "<!  "B8!  "B4!  "B4!  "B4!  "B8!   "B4!!	"r   c           
          U R                  5       nUR                  5       nU R                  US/S/SS/S/S/S/S.5        U R                  5       nUR                  5       nU R                  USS/S/S	/S
/S.5        g )Nr   rG  r$   r/  r@  rH  rI  rE   rN  rM  rO  )rJ  r  r|  rP  r  s      r   #test_post_dominators_infinite_loops/TestCFGraph.test_post_dominators_infinite_loops   s     !  "d#$##$#$&8$&4$&4$&4!	" !  "d#$a&#$##$#$&4!	"r   c                   ^  U 4S jnU" T R                  5       1 Sk[        5       [        5       [        5       S.5        U" T R                  5       [        5       [        5       SS1[        5       [        5       1 SkS.5        U" T R                  5       1 Sk[        5       [        5       [        5       S.5        U" T R	                  5       0 SS1_SS	S
1_S
S1_SS1_SSS1_SS1_S[        5       _SS1_S[        5       _S	S1_SS1_SSS1_SSS1_S[        5       _S[        5       _SS1_S[        5       _5        U" T R                  5       S11 Sk[        5       SS1S1[        5       [        5       [        5       S.5        U" T R                  5       S	S1[        5       S1SS1[        5       [        5       S.5        U" T R                  5       S1S S!1[        5       [        5       S".5        g )#Nc                 H   > U R                  5       nTR                  X!5        g rR   )dominator_treer]   )graphrt  domtreer_   s      r   check.TestCFGraph.test_dominator_tree.<locals>.check  s    **,GW/r   >   r  r  r  r  r(  r'  r]  r   r   r$   r.  r6  r7  r9  r8  r;  r:  r/  r0  r1  r2  r3  r4  r5  >   r$   r?  rB  r@  rA  )r   r   r?  r$   r2  rA  rB  r@  rG  rH  rI  rE   rM  rN  rO  r  setr+  r$  r<  rD  rJ  rP  r_   r  s   ` r   test_dominator_treeTestCFGraph.test_dominator_tree  s   	0 	dnnCEsu#%@	Bdnn5ce"bsu#%!	" 	d'')CEsu#%@	Bd!!#/q1# /q2r( /B /b2$ /RH /B4/SU/$&/.0#%/9;bT/B4/b"X/')B8/57/ 35/ rd/ %'/	0
 	d!!##,CEBx4SU35:	; 	d!!#q'ce"B85	 	d!!##2q'ce7	9r   c                   ^  U 4S jnU" T R                  5       SSSSS.5        U" T R                  5       SSSSSSS.5        U" T R                  5       SSSSS.5        U" T R                  5       0 SS_SS_SS_S	S_S
S	_SS
_SS_SS_SS
_SS_SS_SS_SS_SS_SS_SS_SS_5        U" T R	                  5       SSSSSSSSS.5        U" T R                  5       SSSSS	S	S.5        U" T R                  5       SSSSS.5        g )Nc                 H   > U R                  5       nTR                  X!5        g rR   )immediate_dominatorsr]   )r  rt  idomsr_   s      r   r  4TestCFGraph.test_immediate_dominators.<locals>.check1  s    ..0EU-r   r   r  r*  r  r  r  r  r'  r(  r*  r   r$   r/  r0  r2  r3  r4  r1  r5  r.  r6  r7  r9  r:  r8  r;  rC  rI  rE   rO  )r  r+  r$  r<  rD  rJ  rP  r  s   ` r   test_immediate_dominators%TestCFGraph.test_immediate_dominators0  s   	. 	dnnq)	+dnn22222>	@d'')q)	+d!!#7q! 7Q 72q 7"b 7"b 7"b 72727!27')27/11768"72727!27')27/127	8 	d!!#qaRRRQAF	Hd!!#qbbb9	;d!!#aQ'	)r   c                   ^  U 4S jnU" T R                  5       [        5       S1S1[        5       S.5        U" T R                  5       S1S1[        5       [        5       [        5       [        5       S.5        U" T R                  5       [        5       S1S1[        5       S.5        U" T R	                  5       0 S[        5       _SS1_SS1_SS1_S	S	S1_S
S	1_SS	1_SS	1_SS1_SS1_S[        5       _S[        5       _SS1_SS1_S[        5       _S[        5       _S[        5       _5        U" T R                  5       [        5       S1SS1[        5       SS1S1S1[        5       S.5        U" T R                  5       [        5       [        5       [        5       S1S1S1S.5        U" T R                  5       [        5       S1S1S1S.5        g )Nc                 H   > U R                  5       nTR                  X!5        g rR   )dominance_frontierr]   )r  rt  dfr_   s      r   r  2TestCFGraph.test_dominance_frontier.<locals>.checkG  s    ))+BR*r   r  r  r  r   r   r$   r/  r0  r2  r3  r4  r1  r5  r.  r6  r7  r9  r:  r8  r;  rB  rC  rI  rE   rO  r  r  s   ` r   test_dominance_frontier#TestCFGraph.test_dominance_frontierF  s   	+ 	dnn%bTt7	9dnn4bTsu#%SUN	Pd'')%bTt7	9d!!#Dq#% DQC DaS D"qc D2Aw DRD DB4DbTD#%sD,.D57D@BCEDB4DbTD#%suD.0#%D9;SUD	E 	d!!#%QCb!W#%72$CE;	< 	d!!#%CEsu2$RDrdK	Md!!#%QCQCaS1	3r   c                    U R                  5       U R                  5       4 H.  nU R                  [        UR	                  5       5      SS/5        M0     U R                  5       nU R                  [        UR	                  5       5      SS/5        g )Nr   r  r*  )r  r$  r]   rS  backboner+  r  s     r   test_backbone_loopless"TestCFGraph.test_backbone_loopless]  sl    .."D$=$=$?@AVAJJL1Ar7; ANN

-Bx8r   c                 d   U R                  5       nU R                  [        UR                  5       5      / SQ5        U R	                  5       nU R                  [        UR                  5       5      S/5        U R                  5       nU R                  [        UR                  5       5      SS/5        g )N)r   r   r.  r6  r7  r   rE   )r<  r]   rS  r  rJ  rP  r  s     r   test_backbone_loopsTestCFGraph.test_backbone_loopsc  s    !

-/AB!

-s3!

-1v6r   c                    U R                  5       U R                  5       U R                  5       4 H,  nU R                  [	        UR                  5       5      S5        M.     U R                  5       nU R                  [        UR                  5       5      / SQ5        UR                  5       S   nUR                  5       S   nUR                  5       S   nU R                  UR                  S5        U R                  [        UR                  5      S/5        U R                  [        UR                  5      S/5        U R                  [        UR                  5      / SQ5        U R                  UR                  S5        U R                  [        UR                  5      S/5        U R                  [        UR                  5      S	/5        U R                  [        UR                  5      / S
Q5        U R                  UR                  S5        U R                  [        UR                  5      S/5        U R                  [        UR                  5      SS/5        U R                  [        UR                  5      SS/5        S H$  nU R                  UR                  U5      / 5        M&     S H%  nU R                  UR                  U5      U/5        M'     S
 H%  nU R                  UR                  U5      X2/5        M'     S H%  nU R                  UR                  U5      U/5        M'     U R                  5       nU R                  [        UR                  5       5      S/5        UR                  5       S   nU R                  UR                  S5        U R                  [        UR                  5      S/5        U R                  [        UR                  5      / 5        U R                  [        UR                  5      / SQ5        S H$  nU R                  UR                  U5      / 5        M&     S H%  nU R                  UR                  U5      U/5        M'     U R                  5       nU R                  [        UR                  5       5      S/5        UR                  5       S   nU R                  UR                  S5        U R                  [        UR                  5      S/5        U R                  [        UR                  5      / 5        U R                  [        UR                  5      / SQ5        S H$  nU R                  UR                  U5      / 5        M&     S H%  nU R                  UR                  U5      U/5        M'     U R                  5       nU R                  [        UR                  5       5      S/5        UR                  5       S   nU R                  UR                  S5        U R                  [        UR                  5      S/5        U R                  [        UR                  5      / SQ5        U R                  [        UR                  5      / SQ5        S H$  nU R                  UR                  U5      / 5        M&     S H%  nU R                  UR                  U5      U/5        M'     g )Nr   )r   r0  r7  r   r0  r7  r.  )	r   r$   r/  r0  r2  r3  r4  r1  r5  r/  r1  )r0  r2  r3  r4  r6  r:  r8  r9  )r   r.  r6  r:  r8  r;  )r   r$   r/  r1  r5  )r7  r9  r$   rd  )r   rG  r$   rE   )rE   rN  rM  r   )r@  rA  r?  )r   r$   r2  )r   r@  rA  r?  )r  r$  r+  r]   r^  loopsr<  rS  headerentriesexitsbodyin_loopsrJ  rP  rD  )r_   r  outer1inner1outer2r  loops          r   
test_loopsTestCFGraph.test_loopsk  s   .."D$=$=$?.."$AS^Q/$ !	*K8122*/!5-t4,<	>+/"6-t4,.>?+/"6-Bx8,r2h7+DQZZ-r2 ,'DQZZ-x8 ($DQZZ-/?@ %DQZZ-x8  !	*RD1wwy}b)-t4

+R0		*L9DQZZ-r2  DQZZ-v6 ! !	*QC0wwy|a(-s3

+R0		*J7DQZZ-r2 DQZZ-v6  !	*QC0wwy|a(-s3

+\:		*K8#DQZZ-r2 $DQZZ-v6  r   c                    U R                  0 SSS1_SSS1_SSS1_SSS1_SS1_SSS1_SSS	1_S	S
1_SSS1_SSS1_SS
1_SSS1_SSS1_SS
1_SS
S1_SS
S1_SS
1_0 S
SS1_SS1_SSS1_SS1_SSS1_SS1_SSS1_SS1_SSS1_SS1_SS1_SSS1_SS 1_SS 1_S S!S"1_S!S"1_S"S#S$1_E0 S$S%S&1_S%S&1_S&S'S(1_S'S)S(1_S)[        5       _S(S*S+1_S+S*1_S*S,S-1_S-S.1_S.S/1_S/S0S11_S1S2S31_S3S4S51_S4S2S51_S5S21_S2S/1_S0S61_ES#1S71S81S9S:1S;S<1S=S>1S;S>1S;1S81S#1[        5       S?.E5      nUR                  S5        UR                  5         0 nUR	                  US@9nU R                  USASB15        U R                  USC   SD5        g )ENr   &            r'  @   r   :      H   V   r:  l   r#  f   t   |                     i  i  i(  iF  iJ  ir  iT  iv  i|  i~  2  i  i  i  i  i6  i$  iJ  i<    iT  i`  b  i  il    iv  i|  i        0    
        )r  r  r  r  r  r  r  r  r  r  r  )stats)r  r  )r  r  iteration_count   )r  r  r  r  _find_back_edgesr]   )r_   r  r  
back_edgess       r   test_loop_dfs_pathological&TestCFGraph.test_loop_dfs_pathological  s    ? 
Bx? 
R? 
 R? 
 R	? 

 ? 
 R? 
 R? 
 ? 
 R? 
 R? 
 ? 
 b	? 
 c
? 
 #? 
 #s? 
  #s!? 
" ##? 
$ #s%? 
& #'? 
( #s)? 
* #+? 
, #s-? 
. #/? 
0 #s1? 
2 #3? 
4 #s5? 
6 #7? 
8 #9? 
: #s;? 
< #=? 
> #?? 
@ #sA? 
B #C? 
D #sE? 
F #sG? 
H #I? 
J #sK? 
L #sM? 
N O? 
P #sQ? 
R #S? 
T #sU? 
V #W? 
X #Y? 
Z #s[? 
\ #s]? 
^ #s_? 
` #sa? 
b #c? 
d #e? 
f #g? 
h ssss}? 
 ?@ 	
!			''e'4
j*%=>0137r   c                   ^  U 4S jnU" 5       nU" 5       nT R                  X#5        T R                  SS/S// S/S.5      nUR                  S5        UR                  5         T R                  X$5        U" 5       nUR                  S5        UR                  5         T R	                  X%5        T R                  SS/S/S/S// S.5      nUR                  S5        UR                  5         T R	                  X%5        T R                  SS/S// S	.5      nUR                  S5        UR                  5         T R                  SS/S// S	.5      nUR                  S5        UR                  5         T R	                  Xe5        g )
Nc                  ~   > TR                  SS/S/S// S.5      n U R                  S5        U R                  5         U $ )Nr  r  r  r  r   r  )r  r_   s    r   get_new(TestCFGraph.test_equals.<locals>.get_new  s@    ""BxbTt#LMAa IIKHr   r  r  r  )r   r  r  r  r   r  )r   r  r  r  r  )r   r  r  )r]   r  r  r  assertNotEqual)r_   r  r   r   r  r2   as   `      r   test_equalsTestCFGraph.test_equals  sg   	 II 	 B8"2B4HI	!			 I	"			A! B8"B4bT$& ( )	!			A! B8!"=>	!			B8"2>?	!			A!r   r    Nr  )"r   r  r  r  __doc__r  r  r$  r+  r<  rD  rJ  rP  rV  rZ  ra  rf  rk  rw  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r    r   r   r  r  x  s    
&&#J4$O< *,90HM,:$+"Z$!"F",94),3.97F7PH8T("r   r  c                   H    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSrg)TestRealCodeDomFronti(  a  Test IDOM and DOMFRONT computation on real python bytecode.
Note: there will be less testing on IDOM (esp in loop) because of
the extra blocks inserted by the interpreter.  But, testing on DOMFRONT
(which depends on IDOM) is easier.

Testing is done by associating names to basicblock by using globals of
the pattern "SET_BLOCK_<name>", which are scanned by
`.get_cfa_and_namedblocks` into *namedblocks* dictionary.  That way, we
can check that a block of a certain name is a IDOM or DOMFRONT of another
named block.
c                 <    [        U5      nUR                  5         U$ rR   )r   run)r_   bccfas      r   r   TestRealCodeDomFront.cfa4  s    !"%	
r   c                     [         R                  " U5      n[        US9nU R                  U5      nU R	                  X45      nXE4$ )N)func_id)r   from_functionr   r   _scan_namedblocks)r_   fnfidr  r   namedblockss         r   get_cfa_and_namedblocks,TestRealCodeDomFront.get_cfa_and_namedblocks9  sD    ,,R0c"hhrl,,R5 r   c                    0 n[        UR                  5        Vs/ s H  oDR                  PM     sn5      nSnU H  nUR                  S:X  d  M  UR                  [        UR                  5         nUR                  U5      (       d  MO  U[        U5      S n	[        XUSS US   S-   /-   5       H!  u  pXR                  s=::  a  U:  d  M  O  M!    O   [        S5      eU
nXU	'   M     U$ s  snf )zScan namedblocks as denoted by a LOAD_GLOBAL bytecode referring
to global variables with the pattern "SET_BLOCK_<name>", where "<name>"
would be the name for the current block.

SET_BLOCK_LOAD_GLOBALNr%   r   zunreachable loop)rS  
iterblocksoffsetopnameco_namesr	   arg
startswithr^  zipAssertionError)r_   r  r   r  r   blocksprefixinstgvnamesrh   blknos                r   r  &TestRealCodeDomFront._scan_namedblocksL  s    
 3>>+;<+;a+;<=D{{m+[[!5dhh!?@==((c&kl+D #F12J&*q.9I,I J/a//! !K --?@@E(-%  # =s   C+c                     S nU R                  U5      u  p#UR                  R                  5       nU R                  XCS      5        U R                  XCS      5        g )Nc                 v    Sn[           Sn[        (       a  [          US-  nUS-  n[        (       a  M  [          U$ r(   )SET_BLOCK_ASET_BLOCK_B0SET_BLOCK_B1SET_BLOCK_C)ncr   s      r   foo+TestRealCodeDomFront.test_loop.<locals>.foof  s:    AA,QQ , Hr   AC)r	  r  r  assertFalser_   r&  r   blkptsdomfronts        r   	test_loopTestRealCodeDomFront.test_loope  sY    		 2237
 99//1+./+./r   c                 X   S nU R                  U5      u  p#U R                  US   US   5        UR                  R                  5       nU R	                  XCS      5        U R	                  XCS      5        U R                  US   1XCS      5        U R                  US   1XCS	      5        g )
Nc                     [           [        (       a\  [          [        (       a8  [          [
        (       a  [          O U (       a  [          [          [        (       a  M8  [          [        (       a  M\  [          g rR   )r   r!  r"  SET_BLOCK_C0SET_BLOCK_C1SET_BLOCK_D0SET_BLOCK_D1SET_BLOCK_D2SET_BLOCK_ESET_BLOCK_FSET_BLOCK_G)r$  s    r   r&  <TestRealCodeDomFront.test_loop_nested_and_break.<locals>.foo{  sA    ,"l #|$$ #l  , r   D0C1r(  GFD1ED2)r	  r]   r  r  r*  r+  s        r   test_loop_nested_and_break/TestRealCodeDomFront.test_loop_nested_and_breakz  s    	 2237vd|4 99//1+./+./ 	&+(>?&+(>?r   c                    S nU R                  U5      u  p#UR                  R                  5       nU R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS	      5        UR                  R	                  5       nU R                  XSS      5        U R                  XSS      5        U R                  XSS	      5        U R                  US   1XSS      5        U R                  US   1XSS      5        U R                  US   1XSS      5        U R                  US   1XSS      5        U R                  US	   1XSS      5        g )
Nc                     Sn[           X:  a	  [          SnO[        (       a	  [          SnO[          Sn[
          X-  S:X  a  [          US-  n[          U$ )Nr   r%   r1   rE   )r   SET_BLOCK_Br2  r3  SET_BLOCK_Dr7  r8  r9  )r  br%  s      r   r&  .TestRealCodeDomFront.test_if_else.<locals>.foo  sL    AuuzQHr   r(  BC0r<  Dr@  r>  r=  r	  r  r  r]   r  r*  r_   r&  r   r,  r  r-  s         r   test_if_else!TestRealCodeDomFront.test_if_else  s   	( 2237		..0e3K&89e4L&9:uD\':;uC['9:e3K&89e3K&89e3K&8999//1+./+./+./&+(=>&+(>?&+(>?&+(=>&+(=>r   c                     S nU R                  U5      u  p#UR                  R                  5       nU R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS      5        U R                  US   XCS      5        UR                  R	                  5       nU R                  XSS      5        U R                  XSS      5        U R                  US   1XSS      5        U R                  US   1XSS	      5        U R                  US   1XSS      5        U R                  US   1XSS      5        g )
Nc                      [         (       aB  [          [        (       a	  [          Sn O"[        (       a	  [
          Sn O[          Sn [          [          [          W $ )Nr   r%   r1   )
SET_BLOCK_A0SET_BLOCK_A1r!  r"  r2  r3  SET_BLOCK_C2rG  r7  r8  )r  s    r   r&  5TestRealCodeDomFront.test_if_else_nested.<locals>.foo  s:    |< A#|$$Hr   A0A1B1rK  rL  r@  r>  r<  rM  rN  s         r   test_if_else_nested(TestRealCodeDomFront.test_if_else_nested  s   	$ 2237		..0uD\':;uD\':;uD\':;uC['9:uC['9:uC['9:99//1,/0+./&+(>?&+(>?&+(=>&+(=>r   c                    S nU R                  U5      u  p#UR                  R                  5       nU R                  SU5        U R	                  US   XCS      5        U R	                  US   XCS      5        UR                  R                  5       nU R                  XSS      5        U R                  XSS      5        U R	                  US   1XSS      5        U R	                  US   1XSS      5        g )Nc                  D    [            [        (       a  [          g [          M  rR   )r   rF  r#  rG  r7  r    r   r   r&  4TestRealCodeDomFront.test_infinite_loop.<locals>.foo  s    ;	 r   r@  rJ  r)  rL  r(  )r	  r  r  assertNotInr]   r  r*  rN  s         r   test_infinite_loop'TestRealCodeDomFront.test_infinite_loop  s    	 2237		..0 	f%e3K&89e3K&8999//1+./+./&+(=>&+(=>r   r    N)r   r  r  r  r  r   r	  r  r.  rB  rO  rZ  r`  r  r    r   r   r  r  (  s2    

 &20*@8(?T#?J?r   r  __main__),rZ   unittestnumbar   numba.core.controlflowr   r   
numba.corer   numba.core.bytecoder   r   r	   numba.tests.supportr
   r  rt   r   r   r"   r&   r)   r+   r-   r/   r3   r5   r7   r:   r<   r>   r@   rC   rF   rH   rK   rM   rP   rT   rV   r  r  r   mainr    r   r   <module>rj     s       ?  P P ( D1	
$ ]=h ]=@m
"( m
"`T?8 T?n zMMO r   