
    ϑic                       S SK Jr  S SKrS SKrS SKJr  S SKJrJr  S SKrS SK	J
r
  S SKJrJr  S SKJrJr  S SKJr  S	S
KJr  S	SKJrJrJr  S	SKJrJr  S	SKJrJrJrJ r J!r!  \(       a  S SK"J#r#  S SKJ$r$  S SKJ%r%  \" S\$\#\$   5      r& S       SS jjr'    S S jr( " S S5      r) " S S5      r*S r+S SS4 S!S jjr,\
RZ                  SS"S jj5       r.\
RZ                   S#     S$S jj5       r/g)%    )annotationsN)OrderedDict)TYPE_CHECKINGTypeVar)	framework)ops_contain_noneprim_config)Operatordefault_main_program)
as_tensors   )
_composite)lookup_compositelookup_orig2primlookup_prim2orig)
_orig2prim
_prim2orig)flatten_and_remove_noneget_input_var_listget_output_var_listmap_output_for_compositeprepare_python_api_arguments)Sequence)Tensor)Block_TensorOrTensorsTc                N  ^^ Uc  [        5       R                  5       OUn/ n/ n[        5       m[        5       mU  H+  nUb  UR                  U:X  d   S5       eUT[	        U5      '   M-     U4S jnUR
                   HL  nU" U5      (       d  M  UR                  U5        [        [        U5      5       H  nUT[	        U5      '   M     MN     [        U4S jU 5       5      mU4S jn	[        U5       HL  nU	" U5      (       d  M  UR                  U5        [        [        U5      5       H  nUT[	        U5      '   M     MN     U  Vs/ s H  n[	        U5      T;  d  M  UPM     n
nU Vs/ s H  n[	        U5      T;  d  M  UPM     nn[        [        U5      5      X4$ s  snf s  snf )a  Returns the list of ops on the path from `xs` to `ys` in topological
order.

TODO(Tongxin): supporting control flow and nested blocks.
Args:
    xs: a list|tuple of vars as source
    ys: a list|tuple of vars as sink
    block: the program block containing the path, optional
Returns:
    (path, unused_xs, unreached_ys): a tuple comprised of the resulting op
    path, the unused variables in `xs`, and the unreached variables in `ys`
z"x is not None and x.block != blockc                R   > [        U4S j[        [        U 5      5       5       5      $ )Nc              3  @   >#    U  H  n[        U5      T;   v   M     g 7fNid).0vreached_varss     ^/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/incubate/autograd/primx.py	<genexpr>.topo_path.<locals>.<lambda>.<locals>.<genexpr>S   s!      @A 	1@   )anyr   r   )opr%   s    r&   <lambda>topo_path.<locals>.<lambda>S   s"    # ();B)?@     c              3  `   >#    U  H#  n[        U5      T;   d  M  [        U5      U4v   M%     g 7fr    r!   )r#   yr%   s     r&   r'   topo_path.<locals>.<genexpr>a   s&     L1be|6KJRUAJs   ..c                R   > [        U4S j[        [        U 5      5       5       5      $ )Nc              3  @   >#    U  H  n[        U5      T;   v   M     g 7fr    r!   )r#   out	used_varss     r&   r'   r(   b   s!      #CC 	39Cr)   )r*   r   r   )r+   r5   s    r&   r,   r-   b   s"    s #*+>r+BC#  r.   )r   current_blockr   blockr"   opsappendr   r   reversedr   list)xsysr7   pathbackpathxreachingr+   varback_reaching	unused_xsr0   unreached_ysr%   r5   s                @@r&   	topo_pathrF   4   s     7<m "002EDH=LI yAGGu, 	
0	
,  RU	 H iiB<<KKO./B2/FG(+RW% H  LLLIM tnOOB./A"/EF%(	"S'" G  9Bq"Q%y"8BI9!?r!RU,%>ArL?"#Y<< :?s   FF(F"?F"c                |    [        5       nU  H+  n[        [        U5      5       H  nX1[        U5      '   M     M-     U$ )zReturns the output variables of all the ops on the path from `xs`
to `ys`.

Args:
    path: a list of ops on which to find the output variables

Returns:
    vars: the output vars
)r   r   r   r"   )r>   varsr+   r4   s       r&   output_vars_on_pathrI   t   s=     =D*+>r+BCCCM D  Kr.   c                      \ rS rSr% Sr/ SQrS\S'   S\S'   S\S	'   SS
 jrSS jrSS jr	SS jr
SS jrSS jrSS jrSS jrSS jrSrg)VarMap   zvA general map data structure for linking variables to variables.

An example is linking variables to their gradients.
)namevarsettabstrrM   OrderedDict[int, Tensor]rN   zOrderedDict[int, int]rO   c                :    Xl         X l        [        5       U l        g r    )rM   rN   r   rO   )selfrM   rN   s      r&   __init__VarMap.__init__   s    	=r.   c                F    [        U5      U R                  [        U5      '   g r    r"   rO   )rS   key_var	value_vars      r&   add
VarMap.add   s     "9Gr.   c                l   Uc  g [        U[        R                  R                  R                  [        R
                  R                  45      (       a  [        U[        R                  R                  R                  [        R
                  R                  45      (       d  [        S[        U5       35      e[        U5      U R                  [        U5      '   g [        U5      [        U5      :X  d    S[        U5       S[        U5       S35       e[        X5       H  u  p4U R                  X45        M     g )Nz%value_vars must be Variable, but got zDlen(key_vars) should be equal to len(value_vars), but len(key_vars)=z and len(value_vars)=.)
isinstancepaddlebaser   VariablepirValue	TypeErrortyper"   rO   lenzipadd_rec)rS   key_vars
value_varsrX   rY   s        r&   rh   VarMap.add_rec   s   v{{,,55vzz7G7GH
 
 V[[22;;VZZ=M=MN   ;D<L;MN  &(
^DHHR\"x=C
O3 %%(]O3HZHYYZ\3 '*(&?"W0 '@r.   c                    U R                   R                  [        U5      5      nUb  U R                  R                  U5      $ g r    )rO   getr"   rN   )rS   rX   value_ids      r&   lookupVarMap.lookup   s4    88<<7,;;??8,,r.   c                f    [        U5      nX R                  ;   a  U R                  [        U5      	 g g r    rW   )rS   rX   varids      r&   deleteVarMap.delete   s*    7HHG% r.   c                h    U H,  n[        U5      nX0R                  ;   d  M  U R                  U	 M.     g r    rW   )rS   ri   rB   rr   s       r&   delete_keyvarsVarMap.delete_keyvars   s*    CsGE HHUO r.   c                    U Vs/ s H  n[        U5      PM     nnU R                  R                  5        VVs/ s H  u  pBX#;   d  M  UPM     nnnU H  nU R                  U	 M     g s  snf s  snnf r    )r"   rO   items)rS   rj   r$   idskkeyss         r&   delete_valuevarsVarMap.delete_valuevars   s^    ()jr!uj)"hhnn.;.da!(.;A  *;s   A(A-A-c                J    U R                   R                  [        U5      5      $ r    )rO   __contains__r"   )rS   rX   s     r&   contain_varVarMap.contain_var   s    xx$$R[11r.   c                N    [        U5      U R                  R                  5       ;   $ r    )r"   rO   values)rS   rY   s     r&   contain_valueVarMap.contain_value   s    )} 111r.   )rM   rO   rN   N)rM   rP   rN   rQ   returnNone)rX   r   rY   r   r   r   )ri   r   rj   Tensor | Noner   r   )rX   r   r   r   )rX   r   r   r   )ri   Sequence[Tensor]r   r   )rj   r   r   r   )rX   r   r   bool)rY   r   r   r   )__name__
__module____qualname____firstlineno____doc__	__slots____annotations__rT   rZ   rh   ro   rs   rv   r}   r   r   __static_attributes__ r.   r&   rK   rK      sL    
 *I
I$$	!
.1*&
$22r.   rK   c                      \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   SS
 jrSS jrSS jrSS jr	SS jr
SS jrSS jrSS jrSrg)	Transform   zUAn object that maintains the state of transformations applied to a
primitive program.r   r7   rQ   rH   rK   var2dotdot2barc                    U[        5       R                  5       :X  d   S5       eXl        U R                  U5      U l        [        SU R                  5      U l        [        SU R                  5      U l        g )Nz8only support transform on current block of main program.r   dot2var)r   r6   r7   	init_varsrH   rK   r   r   )rS   r7   s     r&   rT   Transform.__init__   sb    ,.<<>> 	
F	
> 
NN5)	i3i3r.   c                z    [        5       nUR                  R                  5        H  u  p4XB[        U5      '   M     U$ r    )r   rH   ry   r"   )rS   r7   rH   _rB   s        r&   r   Transform.init_vars   s2    }jj&&(FACM )r.   c                    U R                   R                  U Vs0 s H  o"c  M  [        U5      U_M     sn5        g s  snf r    )rH   updater"   )rS   new_varsr$   s      r&   add_varsTransform.add_vars   s0    		HFHq("Q%(HFGFs   <<c                   Uc  g [        U[        R                  R                  R                  [        R
                  R                  45      (       a'  U R                  R                  [        U5      U05        g [        U[        5      (       d  [        S[        U5       35      eU H  nU R                  U5        M     g )Nznew_vars must be list, but got )r^   r_   r`   r   ra   rb   rc   rH   r   r"   r;   rd   re   add_vars_rec)rS   r   rB   s      r&   r   Transform.add_vars_rec   s    v{{,,55vzz7G7GH
 
 IIblH56(D))=d8n=MNOOCc" r.   c                    U R                   n[        U5       H!  nUR                  R                  X3S-   5        M#     [        U5       H  nUR                  U	 M     UR                  5         g )Nr   )r7   r:   desc
_remove_opr8   _sync_with_cpp)rS   ordered_indexesr7   op_indexs       r&   	erase_opsTransform.erase_ops   s[    

 1HJJ!!(qL9 2 !1H		(# 2 	r.   c                   U H4  n[        U5      U R                  ;   d  M  U R                  [        U5      	 M6     U R                  R                  U5        U R                  R                  U5        U R                  nU HE  nUR                  nUR                  R                  UR                  5       5        UR                  U	 MG     UR                  5         g r    )r"   rH   r   rv   r   r}   r7   rM   r   _remove_varencoder   )rS   vars_to_eraserB   r7   rM   s        r&   
erase_dotsTransform.erase_dots  s     C#w$))#IIbg& ! 	##M2%%m4

 C88DJJ""4;;=1

4  ! 	r.   c                $   [        U[        R                  R                  R                  [        R
                  R                  45      (       a  U R                  R                  U5      nU$ U Vs/ s H  o0R                  U5      PM     nnU$ s  snf )zLookup var2dot recursively.)
r^   r_   r`   r   ra   rb   rc   r   ro   var2dot_rec)rS   rH   dotrB   dotss        r&   r   Transform.var2dot_rec  sn    dV[[22;;VZZ=M=MNOO,,%%d+CJ156#  %6 7s   /Bc                8   [        U[        R                  R                  R                  [        R
                  R                  45      (       a'  U R                  R                  U5      nUc   S5       eU$ U Vs/ s H  o0R                  U5      PM     nnU$ s  snf )Nzbar must be not None)
r^   r_   r`   r   ra   rb   rc   r   ro   dot2bar_rec)rS   r   barr   barss        r&   r   Transform.dot2bar_rec  s~    dV[[22;;VZZ=M=MNOO,,%%d+C?:$::?J156#  %6 7s   9B)r7   r   r   rH   N)r7   r   r   r   )r7   r   r   rQ   )r   zSequence[Tensor | None]r   r   )r   zTensor | list[Tensor] | Noner   r   )r   zSequence[int]r   r   )r   r   r   r   )rH   r   r   r   )r   r   r   r   )r   r   r   r   r   r   rT   r   r   r   r   r   r   r   r   r   r.   r&   r   r      sG     L
""OO4H#	r.   r   c                2	  ^^^ U4S jmU4S jmU4S jmU(       a  [         O[        nU(       a  [        O[        n0 n0 n0 nU R                  R                  5        H2  nU R                  UR                  5       5      XXR                  5       '   M4     / n	[        5       n
[        [        U R                  5      5       GH^  nU R                  U   nU	R                  U5        U" UR                  5      b  UR                  U;  a  [        U5      nT" XU5        [        T" [!        U5      5      T" [#        U" U/UQ76 5      5      5       Hs  u  pUS L US L -  (       a   S5       eU
R%                  UR                  5        XUR                  '   UR                  XnR                  '   UR                  XR                  '   Mu     GM  0 n[        [        UR&                  5      5       H8  nT" UR)                  UR&                  U   5      U5      UUR&                  U   '   M:     0 n[        [        UR*                  5      5       H1  nUR-                  UR*                  U   5      UUR*                  U   '   M3     0 n[/        UR0                  5       H  nUR3                  U5      UU'   M     SSKJn  U R                  R9                  5       nU" U5         U" U5         [;        U UUR                  UUUS9nS S S 5        S S S 5        U R                  R                  U5        GMa     [=        U	5       H.  nU R                  R?                  XS-   5        U R                  U	 M0     U RA                  5         [        [        U R                  5      5       Hr  nU R                  U   nURB                   H   nUU;   d  M  URE                  UUU   5        M"     URF                   H   nUU;   d  M  URI                  UUU   5        M"     Mt     [/        U
5       HU  nUU;   d   S	U S
35       eUUU   :w  d  M  U R                  RK                  URM                  5       5        U RN                  U	 MW     U RA                  5         g ! , (       d  f       GN= f! , (       d  f       GN= f)Nc                   > [        [        U 5      5       HW  n[        X   [        5      (       a  T" X   X5        M'  X   c  M.  X   R                  U;   d  MB  X!X   R                        X'   MY     g r    )rangerf   r^   r;   rM   argsto_bindvalue_tableibinds       r&   r   _lower.<locals>.bind'  s[    s4y!A$'4((TWg3$)@%dgll&;<	 "r.   c                   > / nU  HK  n[        U[        5      (       a  UR                  T" X15      5        M1  UR                  X1;   a  X   OU5        MM     U$ r    r^   r;   r9   namesr   return_listrM   	bind_names       r&   r   _lower.<locals>.bind_name.  P    D$%%""9T#;<""DO7=N	 
 r.   c                   > / nU  H6  n[        U[        5      (       a  UT" U5      -   nM%  UR                  U5        M8     U$ r    r   r<   r   r@   expand_nested_lists      r&   r   "_lower.<locals>.expand_nested_list7  E    A!T""),>q,AA""1%	 
 r.   "orig_out and new_out should match.r   )param_guard)r7   r   re   inputsoutputsattrsr   
var_name "" is not in to_bind_rev.)(r   r   r   r   r   all_varsrB   rM   setr   rf   r8   r9   re   r   rg   r   r   rZ   input_namesinputoutput_namesoutputsorted
attr_namesattrpaddle.base.dygraph.baser   	append_opr
   r:   r   r   input_arg_names_rename_inputoutput_arg_names_rename_outputr   r   rH   )r7   reverse	blacklistlower_fn	lookup_fnr   r   to_bind_revrB   ops_to_removevars_to_removeop_idxr+   
input_argsorig_outnew_outr   r   r   r   rM   r   new_op_descin_nameout_namevar_namer   r   r   s                             @@@r&   _lowerr   %  s   = %z*H$+ 1AIKGKzz""$"'))CHHJ"7HHJ % MUN EII'YYvV$RWW)bggY.F+B/Jk2%("#6r#:;":hr.GJ.G#HI&! %,DA 8A ""7<<0,3GLL))0&,4MMLL)& F3r~~./,5HHR^^A./-r~~a() 0
 G3r/0.0ii8J.K*+ 1 Er}}- ggdmd .<**..0KV$k'&:$!# ';$ IIR Y (^ =)

fqj1IIf * 
EII'YYv))G+%  +g*>? * ++H;&!!(K,AB , ( >*;& 	

":;	
& {8,,JJ""8??#45

8$ + 
E ';&:$$s$   	RQ5/R5
R?R
R	c                    g)NTr   )r@   s    r&   r,   r,     s    Tr.   c                  ^^ ^! U4S jmU 4S jm U!4S jm![        U [        R                  R                  R                  5      (       Ga}  [
        R                  " S5        [        n[        n0 n0 n0 nU R                  R                  5        H2  n	U R                  U	R                  5       5      XiR                  5       '   M4     / n
[        5       n[        5       nSn[        U R                  5      n[!        U5      nSUs=::  a  U::  d  O   SU SU 35       eSUs=::  a  U::  d  O   S	U S
U 35       eUS:  a  US:  a   SU SU 35       eUS:  a  [!        X-
  5      nUS:  a  [!        X.5      nS=nn[!        U5       GH  nU R                  U   nU
R#                  U5        UR$                  nU" U5      SL=(       a    U" U5      =(       a    UU;   nU(       d  U(       a  U R'                  5         UnU(       Ga3  Sn[(        S   R+                  U5        [-        U5      nT" UXv5        T!" [/        U5      5      nT!" [1        U" U/UQ76 5      5      n[        U5      [        U5      :X  d"   SU S[        U5       S[        U5       35       e[3        UU5       GH  u  nnUb  Uc  U[4        ;  a  [7        SU SU SU 35      eUc  M0  UGb?  UR8                  UR8                  :X  d>   SU SUR                   SUR8                   SUR                   SUR8                   3
5       eSUR:                  ;  d   SU S35       eUR:                  UR:                  :X  d>   SU SUR                   SUR:                   SUR                   SUR:                   3
5       eUSL USL -  (       a   S5       eUR+                  UR                  5        UUUR                  '   UR                  UUR                  '   UR                  UUR                  '   GMs  UR+                  UR                  5        GM     GM  U R                  R=                  5       nUR?                  UR                  5        GM     U R'                  5         [A        U
5       H/  nU R                  RC                  UUS-   5        U R                  U	 M1     U R'                  5         [!        [        U R                  5      5       Hr  nU R                  U   nURD                   H   nUU;   d  M  URG                  UUU   5        M"     URH                   H   nUU;   d  M  URK                  UUU   5        M"     Mt     [M        U5       HU  nUU;   d   SU S35       eUUU   :w  d  M  U R                  RO                  URQ                  5       5        U RR                  U	 MW     U R'                  5         [M        U5       H9  nU R                  RO                  URQ                  5       5        U RR                  U	 M;     U R'                  5         U R                   H}  nURU                  UR                  R%                  5       5      (       d  M3  UR                  RW                  U R                  5        UR                  RY                  U R                  5        M     U(       a  [[        U UUUS 9  g[        U [\        R^                  5      (       a  U  H  n[[        UUUUS 9  M     g[`        e)!z^The operators in block which satisfy the filter condition will be decomposite into primitives.c                  > [        [        U 5      5       H  n[        X   [        5      (       a  T" X   X5        [        X   [        R
                  R                  R                  [        R                  R                  45      (       d  Mv  X   c  M}  X   R                  U;   d  M  X!X   R                        X'   M     g r    )r   rf   r^   r;   r_   r`   r   ra   rb   rc   rM   r   s       r&   r   _lower_composite.<locals>.bind  s    s4y!A$'4((TWg3&++//88&**:J:JK  $)@%dgll&;< "r.   c                   > / nU  HK  n[        U[        5      (       a  UR                  T" X15      5        M1  UR                  X1;   a  X   OU5        MM     U$ r    r   r   s       r&   r   #_lower_composite.<locals>.bind_name  r   r.   c                   > / nU  H6  n[        U[        5      (       a  UT" U5      -   nM%  UR                  U5        M8     U$ r    r   r   s      r&   r   ,_lower_composite.<locals>.expand_nested_list  r   r.   z,Atomize composite op to primitive ops begin.Nr   z expect -1 <= backward_length <= z, but got backward_length: zexpect -1 <= start_idx <= z, but got start_idx: zgot start_idx: z and backward_length: FTcomposite_ops_recordzwhen replace origin op z[ with composite rule, num of origin outs should be equal to new outs, but len(orig_outs) = z and len(new_outs) = zop z2 should not contain any None value. original outs=z and its composite rule outs=zW with composite rule, origin out dtype should be equal to new out dtype, but orig_out: z.dtype=z and new_out: z1 with composite rule, composite out shape has -1.zW with composite rule, origin out shape should be equal to new out shape, but orig_out: z.shape=r   r   r   r   )	start_idxbackward_length)1r^   r_   r`   r   r   logginginfor   r   r   r   rB   rM   r   rf   r8   r   r9   re   r   r	   rZ   r   r   r   rg   r   
ValueErrordtypeshaper   	copy_fromr:   r   r   r   r   r   r   r   r   rH   _has_kernelinfer_var_typeinfer_shape_lower_compositetypingr   rd   )"r7   filter_r  r	  r   r   r   r   r   rB   r   r   none_vars_to_removechangelengthidx_listlower	lower_prer   r+   op_namer   	orig_outsnew_outsr   r   op_descr   r   r   itemr   r   r   s"                                  @@@r&   r  r    s   	= %..4455CD $	::&&(C&+ii
&;K
# )  "e UYY=_.. 	
.vh6QRaQbc	
. Y(&( 	
(0Ei[Q	
( $b(Y^ 	
i[(>>OP	
< RV56Hr>Y/H!!	FmF6"B  (ggG 7#4/ 'BK'h& 
 $$&I2377@9"=
Z6./G/KL	-x8Z89 9~X6 -gY 7,,/	N+;;PQTU]Q^P_a6
 *-*%Hg !(GO'77(!'*\]f\g  hE  FN  EO  P   '  ,'~~> 5gY ?--5]]O78>>BRR`ahamam`nnuv}  wD  wD  vEF>  "6 5gY>op6  (~~> 5gY ?--5]]O78>>BRR`ahamam`nnuv}  wD  wD  vEF> %-$4D#I @I '**7<<84;GLL118.4<MMGLL1+//>C*F  **..0!!"''*S $V 	}-FJJ!!&&1*5		&! . 	C		N+F6"B--k)$$Wk'.BC . //{*%%hH0EF 0 , ~.H{* XJ&>?* ;x00

&&x'89JJx( / 	23HJJ""8??#45

8$ 4 	))B~~bgglln--&&uzz2##EJJ/ 
 # /	 		E6??	+	+D# /	  	r.   c                    U c  [        5       R                  5       OU n U [        5       R                  5       :X  d   S5       e[        U S/ S9  g)a  
Note:
    **This API is ONLY available in the static graph mode.**
    **Args block must be None or current block of main program.**

All operators in the target block are processed as follows.
If it is an original operator, it will be transformed into
one or a series of automatic differential basic operators with
equivalent function.

Args:
    block(paddle.static.Block|None, optional): The
        target block to process on. Default None, and will
        process on the current block of main program.
N7block is neither None nor current block of main programFr   r   r   r6   r   )r7   s    r&   	orig2primr%  k  sO    $ 7<m "002E(*88:: A: 5%2.r.   c                    U c  [        5       R                  5       OU n U [        5       R                  5       :X  d   S5       eUc  / OUn[        U SUS9  g)a  
Note:
    **ONLY available in the static graph mode.**
    **Args block must be None or current block of main program.**

All operators in the target block are processed as follows.
If it is an automatic differential basic operator, it will be
transformed into one or a series of original operators with
equivalent function to support execution.

Args:
    block(paddle.static.Block|None, optional): The
        target block to process on. Default None, and will
        process on the current block of main program.
    blacklist(list[string]|None, optional): The names of automatic
        differential basic operator that will not be transformed
        into original operators. Default None, and the blacklist
        is treated as empty list.

Examples:

    .. code-block:: python

        >>> import paddle
        >>> from paddle.incubate.autograd import enable_prim, prim_enabled, prim2orig

        >>> paddle.enable_static()
        >>> enable_prim()

        >>> x = paddle.ones(shape=[2, 2], dtype='float32')
        >>> x.stop_gradient = False
        >>> y = x * x
        >>> dy_dx = paddle.static.gradients(y, x)
        >>> if prim_enabled():
        ...     prim2orig()
Nr"  Tr#  r$  )r7   r   s     r&   	prim2origr'    s\    R 7<m "002E(*88:: A:  'YI
5$)4r.   r    )r<   r   r=   r   r7   Block | Noner   z/tuple[list[Tensor], list[Tensor], list[Tensor]])r>   zSequence[Operator]r   zOrderedDict[int, list[Tensor]])r  z+typing.Callable[[framework.Operator], bool])r7   r(  r   r   )NN)r7   r(  r   zlist[str] | Noner   r   )0
__future__r   r
  r  collectionsr   r   r   r_   paddle.baser   paddle.base.corer   r	   paddle.base.frameworkr
   r   paddle.incubate.autograd.utilsr   composite_rulesr   primregr   r   r   	primrulesr   r   utilsr   r   r   r   r   collections.abcr   r   r   r   rF   rI   rK   r   r   r  static_onlyr%  r'  r   r.   r&   <module>r5     s2   #   # )  ! : @ 5 ' 
 .  (+ 3VXf=MN GK====.==7C==4==@
#(E2 E2RP Phnf <J	R8Rj / /0 >B-5-5+;-5	-5 -5r.   