
     ea                        d dl mZmZmZ d dlZd dlmZ d dlmZm	Z	 d dl
Zd dlZd dlmZmZmZmZmZmZ d dlZd dlmZ ej        ej        ej        ej        ej        ej        gZej        ej        ej        ej        ej        ej        gZdZdZ d	 Z!d
 Z"d Z#d Z$d Z%d Z&d Z'd Z(ej)        j*        d$d            Z+d Z,d$dZ-d Z.d Z/ej)        j*        d$d            Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9d  Z:d! Z;d" Z<d# Z=dS )%    )divisionprint_functionabsolute_importN)deepcopy)combinationspermutations)assert_allcloseassert_assert_equalassert_raisesassert_array_equalassert_warns)swt_axisư>gvIh%<=c                  &   g d} t          j        d          }t          }t          j        | |d          \  \  }}\  }}\  }}g d}	t	          ||	d|           g d}
t	          ||
d|           g d	}t	          ||t          |           g d
}t	          ||t          |           dgdz  }t	          ||d|           g d}t	          ||d|           t          j        ||dd          }|d         \  }}t	          ||t          |           t	          ||t          |           t          j        | |          }t          t          |          dk               t          t          j        t          |                     d           d S )N         r         r   db1r   level)MH@gVf@'e@g'e?r   r   r   gQyC3t@g:0yE>rtolatol)g'e^v@'eʪ H@gVfg'e?r"   ev @)r   g      @r   g      @r   g      #@
   g      !@)r   g      @r   g            ?r   r'   gZo̙#@   )        gʪ Hg^vgev r)   r#   r!   r$   r   r   start_levelr   )pywtWavelet
tol_doubleswtr	   r
   lenswt_max_level)xr   r    cA3cD3cA2cD2cA1cD1expected_cA1expected_cD1expected_cA2expected_cD2expected_cA3expected_cD3rescoeffss                    3lib/python3.11/site-packages/pywt/tests/test_swt.pytest_swt_decompositionrB       s   !!!A
,u

CD)-!S)B)B)B&JS#
cJS#D D DLCDt<<<<F F FLCDt<<<<444LCJTBBBB555LCJTBBBB>A%LCDt<<<<D D DLCDt<<<< (31!
4
4
4C1vHCCJTBBBBCJTBBBBXaFCKK1Ds1vv&&*****    c                  $   t          t          t          j        d           t	          j                    5  t	          j        dt                     t          t          j        d          d           d d d            n# 1 swxY w Y   t          t          j        d          d           t          t          j        d          d           t          t          j        d          d           t          t          j        d	          d           d S )
N   ignorer      r         r   0   )r   UserWarningr,   r1   warningscatch_warningssimplefilterr    rC   rA   test_swt_max_levelrP   @   s   d0"555		 	"	" 0 0h444T'++Q///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 #A&&***#C((!,,,#B''+++#D))1-----s   =A==BBc                     g d} t          j        d          }t          j        | |d          \  \  }}\  }}dD ]p}t          j        |                               d          }t          j        |fdz  d	          }|d
k    rt          j        |          }n|dk    rt          j        |          }t          j        ||d          \  \  }}	\  }
}||	|
|fD ]}t          |j
        |j
        k                |
D ]}t          ||           |D ]}t          ||           |D ]}t          ||           |	D ]}t          ||           t          j        |                               d          }t          j        |fdz  d	          }|d
k    rt          j        |          }n|dk    rt          j        |          }t          j        ||dd          \  \  }}	\  }
}||	|
|fD ]}t          |j
        |j
        k                |
                    d          D ]}t          ||           |                    d          D ]}t          ||           |                    d          D ]}t          ||           |	                    d          D ]}t          ||           rt          t          t           j        | |dd           d S )Nr   r   rG   r   )CF)r      r   )axisrR   rS   )rT   r   r   )r   rV   r   r   )r,   r-   r/   npasarrayreshapeconcatenateascontiguousarrayasfortranarrayr
   shaper   	transposer   
ValueError)r2   r   r5   r6   r7   r8   orderx_2dcA2_2dcD2_2dcA1_2dcD1_2dcrows                 rA   test_swt_axisri   N   sO   !!!A
,u

C!XaA666JS#
c  *) *)z!}}$$W--~thqjq111C<<'--DDc\\$T**D-1XdCq-I-I-I**66&&&1 	+ 	+AAGtz)**** 	) 	)CsC(((( 	) 	)CsC(((( 	) 	)CsC(((( 	) 	)CsC(((( z!}}$$W--~thqjq111C<<'--DDc\\$T**D-1XdCq;<.> .> .>**66 &&&1 	+ 	+AAGtz)****##F++ 	) 	)CsC((((##F++ 	) 	)CsC((((##F++ 	) 	)CsC((((##F++ 	) 	)CsC((((	) *dh3aa@@@@@@rC   c                     d} t          j        d          }d|v r|                    d           |D ]}t          j        |          }t	          t          j        t          j        t          |j	        |j
                                                }d|| z   dz
  z  }t          j        |          }dD ]T}|r|j        sdD ]E}t          j        ||| ||          }	t          j        |	||	          }
t          |
|d
d           FUd S )Nr   discretekinddmeyrG   r   TFtrim_approxnormrr   h㈵>Hz>r   )r,   wavelistremover-   intrX   ceillog2maxdec_lenrec_lenarange
orthogonalr/   iswtr	   )	max_levelwaveletscurrent_wavelet_strcurrent_waveletinput_length_powerinput_lengthXrr   rq   r@   Ys              rA   test_swt_iswt_integrationr      s]    I}*---H' < <,':;; ##2% 2% *& *& "' "' ( ( -	9A=>Il##! 	< 	<D O6 , < <!_i.9F F FIfoDAAA14d;;;;;	<		<< <rC   c                     t          j        d          } t          t          t                    D ]\  }}d                    |          }t          j        d|          }t          j        || d          \  \  }}\  }}t          |j
        |j
        cxk    o|j
        cxk    o|j
        cxk    o|k    nc d|z              t          j        d|          }t          j        || d	          d
         \  }	\  }
}}t          |	j
        |
j
        cxk    o|j
        cxk    o|j
        cxk    o|k    nc d|z              d S )Nhaarz"wrong dtype returned for {0} inputr(   )dtyperG   r   zswt: r(   r(   r   r   zswt2: )r,   r-   zip	dtypes_in
dtypes_outformatrX   onesr/   r
   r   swt2)waveletdt_indt_outerrmsgr2   r5   r6   r7   r8   cAcHcVcDs                rA   test_swt_dtypesr      s}   l6""GY
33 # #v5<<UCC GAU###!%!WA!>!>!>
cJS#	SYJJJJ#)JJJJsyJJJJFJJJJ& 	" 	" 	" GF%(((9Qq999!<LRRBHFFFFFFFFBHFFFFFFFF6!	# 	# 	# 	## #rC   c                  H   t           j                            d          } t          j        d          }t          t          t                    D ]\  }}|                     d          	                    |          }t          j
        ||d          }t          j        ||          }t          ||dd           |                     d	          	                    |          }t          j        ||d          }t          j        ||          }t          ||dd           d S )
NrU   r   )r(   rG   r   r   ru   r   r   )rX   randomRandomStater,   r-   r   r   r   standard_normalastyper/   r   r	   r   iswt2)rstater   r   r   r2   rg   xrs          rA   test_swt_roundtrip_dtypesr      s   Y""1%%Fl6""GY
33 5 5v""5))0077HQq)))Yq'""2Dt4444 ""6**11%88Ia***Z7##2Dt444445 5rC   c                      d} t          j        d          }dD ]U}t          j        || d d|          }t	          t          |          t          j        |j        |                              Vd S )Ndb2)r(   rI       r   r   rG   r   r   r+   rV   )rX   r   r,   r/   r   r0   r1   r^   )wavr2   rV   sdecs       rA   test_swt_default_level_by_axisr      sx    
C
"##A C Cx3dEEESYY 2174= A ABBBBC CrC   c                      t          j        d          } t          j                    5  t          j        dt
                     t          t          t          j	        | dd           d d d            d S # 1 swxY w Y   d S )Nr(   rF   r   r   r   )
rX   r   rL   rM   rN   FutureWarningr   r`   r,   r   r2   s    rA   test_swt2_ndim_errorr      s    


A		 	"	" A Ah666j$)Qa@@@@A A A A A A A A A A A A A A A A A As   >A33A7:A7c                 L   d}| .t          j        d          } d| v r|                     d           | D ]}t          j        |          }t	          t          j        t          j        t          |j	        |j
                                                }d||z   dz
  z  }t          j        |dz                                ||          }dD ]T}|r|j        sdD ]E}t          j        |||||          }	t          j        |	||	          }
t!          |
|d
d
           FUd S )Nr   rk   rl   rn   rG   r   ro   rp   rs   rt   r   )r,   rv   rw   r-   rx   rX   ry   rz   r{   r|   r}   r~   rZ   r   r   r   r	   )r   r   r   r   r   r   r   rr   rq   r@   r   s              rA   test_swt2_iswt2_integrationr      sw    I=j111XOOF###' < <,':;; ##2% 2% *& *& "' "' ( ( -	9A=>IlAo&&..|\JJ! 	< 	<D O6 , < <1oy/:G G GJvTBBB14d;;;;;	<		<< <rC   c                  (    t          dg           d S Nr   )r   )r   rO   rC   rA   test_swt2_iswt2_quickr          %333333rC   c                    dD ]}t          j        |dz                                |d          }d}t          j                    5  t          j        dt                     t          j        ||d          }t          j	        ||          }d d d            n# 1 swxY w Y   t          ||t          t                     d S )N)r(   rI   rJ   r   r   rF   rG   r   r   )rX   r~   rZ   rL   rM   rN   r   r,   r   r   r	   
tol_single)r   nrowsr   r   r@   r   s         rA   test_swt2_iswt2_non_squarer     s    @ @IeBh''r22$&& 	4 	4!(M:::Yq/;;;F
6?33A	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	1:J?????@ @s   ABB	B	c            
         d} t          j        d          }t          t          j        t          j        t          |j        |j                                                }d|z  }t          j	        |dz            
                    ||          }t          j        ||d          d         \  }\  }}}t          j        ||dd          d         \  }	\  }
}}t          ||	| 	           t          ||| 	           t          ||
| 	           t          ||| 	           t          j        ||||fg|          }t          ||| 	           t          j        |	|
||fg|d
          }t          ||| 	           t          t          t           j        ||dd
           t          t          t           j        ||dd
           d S )N+=r   rG   r   r   r   rW   r   axesr    r   r   r   r   )r,   r-   rx   rX   ry   rz   r{   r|   r}   r~   rZ   r   r	   r   r   r`   )r    r   r   r   r   r7   cH1cV1r8   r5   cH2cV2r6   r1r2s                  rA   test_swt2_axesr     s   Dl5))ORWRWS.! .! &" &" # # $ $ )*L
	,/""**<FFA!Yq/CCCAFS/3S!Yq/,24 4 4457S/3SC4((((C4((((C4((((C4(((( 
S3S/*O	<	<BAr%%%%	S3S/*O&	I	I	IBAr%%%% *diOQ    *diOQUKKKKKKrC   c            
      l   d} t          j        d          }t          t          j        t          j        t          |j        |j                                                }d|z  }t          j	        |dz            
                    ||          }t          j        ||dd           d         }t          j        ||dd          d         }t          |d         |d         | 	           t          |d
         |d         | 	           t          |d         |d
         | 	           t          |d         |d         | 	           t          j        ||d          }t          |g            t          t          t           j        ||dd           t          t          t           j        t          j        g           |d           t          t          t           j        ||dd           t          t          t"          ||dd           t          t          t"          |d dd d f         |ddd           d S )Nr   r   rG   r   r   r   rW   aar   addaddr   r   r   r*   rT   r   )r,   r-   rx   rX   ry   rz   r{   r|   r}   r~   rZ   swtnr	   r   r   r`   rY   r   )r    r   r   r   r   r@   coeffs2emptys           rA   test_swtn_axesr   -  s1   Dl5))ORWRWS.! .! &" &" # # $ $ )*L
	,/""**<FFAYq/>>>qAFi?!&AAA!DGF4L'$-d;;;;F4L'$-d;;;;F4L'$-d;;;;F4L'$-d;;;; Ia222E *diOQVLLLL *diB!LLL *diOq* * * * *h?!! ! ! ! *h#2#qqq&	?!a) ) ) ) ) )rC   c                    d}| .t          j        d          } d| v r|                     d           t          dd          D ]}|dz   }t	          t          |          |          D ]\}| D ]U}t          j        |          }|j        dk    r#t          t          j	        t          j
        t          |j        |j                                                }d||z   dz
  z  }t          j        ||z                                |f|z            }	dD ]e}
|
r|j        sdD ]V}t          j        |	|||||
	          }t#          |          }t          j        ||||

          }t'          ||	dd           Wft)          ||          D ]5\  }}|                                D ]\  }}t-          ||         |           6W^d S )Nr   rk   rl   rn   r   r(   rG   ro   )r   rq   rr   )r   rr   rt   r   )r,   rv   rw   ranger   r-   r|   rx   rX   ry   rz   r{   r}   r~   rZ   r   r   r   iswtnr	   r   itemsr   )r   r   ndim_transformndimr   r   r   r   Nr   rr   rq   r@   coeffs_copyr   rg   c2kvs                      rA   test_swtn_iswtn_integrationr   S  s<    I=j111XOOF###1++ 5 5! tn== 	5 	5D'/ 5 5#l#677;??%(KK:! :! 2" 2" *# *# &$ &$" *Y6:;Iag&&..uTz::) 	D 	DD !CN ! '4 D D!%1c947B"O "O "O&.v&6&6 JvsDIII'14dCCCCCD !55 5 5EAr !		 5 51*2a5!444455-5	55 5rC   c                  (    t          dg           d S r   )r   rO   rC   rA   test_swtn_iswtn_quickr     r   rC   c                     t          j        d                              ddd          } d}d}t          j        d          }t          j        | |||          }t          t          t          j        ||d           t          t          t          j        ||d           |d	         d
         d dd d f         |d	         d
<   t          t          t          j        |||           d S )Ni   r(   rG   )r   r   r   r   r   r   r   r   rT   )
rX   r~   rZ   r,   r-   r   r   r`   r   RuntimeError)r2   r   r   wr@   s        rA   test_iswtn_errorsr     s    
	$1a((AIDUAYq!YT222F *dj&!)DDDD*dj&!&AAAAQiocrc111f-F1IdO,
FADAAAAAArC   c                  T   d} d}d}t           j                            d          }t          |           D ]r}d t	          |          D             }|                    |          }t          j        ||||          }t          j        |||          }t          ||dd           sd S )	N)r   rJ   r   sym2r   r   c                 $    g | ]\  }}|d k    |S )r   rO   ).0axss      rA   
<listcomp>z9test_swtn_iswtn_unique_shape_per_axis.<locals>.<listcomp>  s!    ;;;ur1AFFFFFrC   r   g|=r   )
rX   r   r   r   	enumerater   r,   r   r   r	   )	_shaper   r   r   r^   r   r2   rg   rs	            rA   %test_swtn_iswtn_unique_shape_per_axisr     s    F
CIY""1%%Ff%% 6 6;;	% 0 0;;;""5))Iaid333Jq#D)))15u555556 6rC   c            	         t           j                            d          } |                     ddd          }d}t	          j        d          ddf}t	          j        |||          }t          t	          j        ||          |d	           t	          j        ||d d
         |          }t          t	          j        ||d d
                   |d	           t          t          t          j        ||d d         |           t          t          t          j        ||d d                    t          j                    5  t          j        dt                     |d         }t	          j        ||d d         |          }t          t	          j        ||d d                   |d	           d d d            d S # 1 swxY w Y   d S )Ni  rI   r   r   r   db4r   r   r   r   rG   rF   ).r   )rX   r   r   randnr,   r-   r   r	   r   r   r`   rL   rM   rN   r   r   r   )r   datar   r   coefsdata2coefs2s          rA   test_per_axis_waveletsr     s   Y""4((F<<B##DE V$$fe4HIdHE222EDJuh//EBBBB IdHRaRL666EDJuhrrl33TFFFF *dix|UCCC*dj%"1">>>		 	"	" M Mh666V5(2A2,66
68BQB<88%eLLLLM M M M M M M M M M M M M M M M M Ms   >A.F99F= F=c            	         t          j        d          } t          t          j        t          j        t          j        gt          j        t          j        t          j	        g          D ]]\  }}dt          j
        d          fD ]A}t          t          || |d            || dd          }t          t          |||           B^d S )N)rI   rI   morlr   )r   r   r   r   )r   )rX   r   r   r,   r/   r   r   r   r   r   DiscreteContinuousWaveletr   r`   )r   dec_funcrec_funccwaverg   s        rA    test_error_on_continuous_waveletr     s    78D!48TY	"B#'9dj$*"EG G B B(d<VDDE 	B 	BE*he !# # # # uA...A*h5AAAAA	BB BrC   c                     t          j        d                              t           j                  } | d| z  z   }d}t           j        t           j        ft           j        t           j        ft           j        t           j        ft           j        t           j        ft           j        t           j        ffD ]\  }}|t           j        t           j        fv r|}t           j        }n| }t           j        }t          j	        ||d          }|d         d                             |          |d         d                             |          g|d<   t          j
        ||          }t          ||j                   t          ||dd           d S )	NrI                 ?r   rG   r   r   MbP?r   )rX   r~   r   float64float32float16
complex128	complex64r,   r/   r   r   r   r	   )	x_real	x_complexr   dtype1dtype2r2   output_dtyper@   ys	            rA   test_iswt_mixed_dtypesr    sJ   Yr]]!!"*--FF"I
CJ
3J
3J
3M2<8L"-8	: 4 4 blBM222A=LLA:L!S!$$AYq\((00AYq\((002q	Ifc""\17+++14d33333'4 4rC   c                  &  	 t           j                            d          } |                     dd          }|d|z  z   }d}t           j        t           j        ft           j        t           j        ft           j        t           j        ft           j        t           j        ft           j        t           j        ffD ]\  }	|t           j        t           j        fv r|}t           j        }n|}t           j        }t          j
        ||d          }|d         d                             |          t          	fd|d         d         D                       g|d<   t          j        ||          }t          ||j                   t!          ||dd	           d S )
Nr   r(   r  r   rG   c                 :    g | ]}|                               S rO   r   )r   rg   r  s     rA   r   z+test_iswt2_mixed_dtypes.<locals>.<listcomp>  s%    CCCAHHV,,CCCrC   r   r  r   )rX   r   r   r   r  r  r  r  r  r,   r   r   tupler   r   r   r	   )
r   r  r	  r   r
  r2   r  r@   r  r  s
            @rA   test_iswt2_mixed_dtypesr    sf   Y""1%%F\\!QFF"I
CJ
3J
3J
3M2<8L"-8	: 4 4 blBM222A=LLA:L1c1%%AYq\((00CCCCfQilCCCDDFq	Jvs##\17+++14d33333'4 4rC   c                  ~  
 t           j                            d          } |                     ddd          }|d|z  z   }d}t           j        t           j        ft           j        t           j        ft           j        t           j        ft           j        t           j        ft           j        t           j        ffD ]\  }
|t           j        t           j        fv r|}t           j        }n|}t           j        }t          j
        ||d          }|d                             d|j        z            }|                    |          }
fd|d                                         D             |d<   ||d         d|j        z  <   t          j        ||          }	t!          ||	j                   t%          |	|dd	           d S )
Nr   r(   r  r   rG   ac                 B    i | ]\  }}||                               S rO   r  )r   r   rg   r  s      rA   
<dictcomp>z+test_iswtn_mixed_dtypes.<locals>.<dictcomp>  s+    GGGTQQ((GGGrC   r  r   )rX   r   r   r   r  r  r  r  r  r,   r   popr   r   r   r   r   r   r	   )r   r  r	  r   r
  r2   r  r@   r  r  r  s             @rA   test_iswtn_mixed_dtypesr    s   Y""1%%F\\!Q""FF"I
CJ
3J
3J
3M2<8L"-8	: 4 4 blBM222A=LLA:L1c1%%1IMM#,''HHVGGGGVAY__5F5FGGGq	"#q	#,Jvs##\17+++14d33333+4 4rC   c                      t          t          t          j        g d           t	          j        d          ddd d f         } t          t          t          j        | ddd           d S )Nr   )r   r   r   r   r   r   )r   r`   r,   r/   rX   r   r   r   s    rA   test_swt_zero_size_axesr  #  s[    *dhE222 	!QQQA*diEFFFFFFrC   c                      d} t           j                            d          }|                    d          }t	          j        || dd          }d |D             }t          t          j        |          t          j        |                     t          t           j	        
                    |          t           j	        
                    t          j        |                               t          t          t          j        |dd           d	S )
zBVerify that the 1D SWT partitions variance among the coefficients.r   rU      Trp   c                 6    g | ]}t          j        |          S rO   rX   var)r   rg   s     rA   r   z=test_swt_variance_and_energy_preservation.<locals>.<listcomp>4  s     +++q+++rC   bior2.2rs   N)rX   r   r   r   r,   r/   r	   sumr   linalgrr   r[   r   rK   )r   r   r2   r@   	variancess        rA   )test_swt_variance_and_energy_preservationr%  ,  s     CY""1%%FSAXa$T:::F++F+++IBF9%%rvayy111 BINN1%%INN2>&#9#9::< < < dh94@@@@@@rC   c                     d} t           j                            d          }|                    dd          }t	          j        || ddd          }|d                                         g}|dd	         D ].}|D ])}|                    |                                           */d
 |D             }t          t          j	        |          t          j
        |                     t          t           j                            |          t           j                            t          j        |                               t          t          t          j        |ddd           d	S )zBVerify that the 2D SWT partitions variance among the coefficients.r   rU   @   r   Tr   rq   rr   r   r   Nc                 6    g | ]}t          j        |          S rO   r  r   r   s     rA   r   z>test_swt2_variance_and_energy_preservation.<locals>.<listcomp>K       ///q///rC   r!  r   rr   )rX   r   r   r   r,   r   ravelappendr	   r"  r   r#  rr   r[   r   rK   )r   r   r2   r@   
coeff_listdr   r$  s           rA   *test_swt2_variance_and_energy_preservationr1  ?  sG    CY""1%%FRAYq#QDtDDDF)//##$JABBZ ) ) 	) 	)Aaggii((((	)//J///IBF9%%rvayy111 BINN1%%INN2>*#=#=>>@ @ @ diIQTJJJJJJrC   c                     d} t           j                            d          }|                    dd          }t	          j        || ddd          }|d                                         g}|dd	         D ]C}|                                D ],\  }}|                    |                                           -Dd
 |D             }t          t          j
        |          t          j        |                     t          t           j                            |          t           j                            t          j        |                               t          t           t          j        |ddd           d	S )zBVerify that the nD SWT partitions variance among the coefficients.r   rU   r'  r   Tr(  r   r   Nc                 6    g | ]}t          j        |          S rO   r  r*  s     rA   r   z>test_swtn_variance_and_energy_preservation.<locals>.<listcomp>b  r+  rC   r!  r,  )rX   r   r   r   r,   r   r-  r   r.  r	   r"  r   r#  rr   r[   r   rK   )	r   r   r2   r@   r/  r0  r   r   r$  s	            rA   *test_swtn_variance_and_energy_preservationr4  V  sS    CY""1%%FRAYq#QDtDDDF)//##$JABBZ ) )GGII 	) 	)DAqaggii((((	)//J///IBF9%%rvayy111 BINN1%%INN2>*#=#=>>@ @ @ diIQTJJJJJJrC   c                     dt           j        t           j        dfdt           j        t           j        dfdt           j        t           j        dffD ]y\  } }}}t          j        d| z            } ||ddd	
          }t          j	        |          \  }}}t          j
        ||||          } ||d          }	t          ||	           zd S )Nr   r/   rG   r   r   r   )rI   r   T)r   rq   )output_format)r,   r/   r   r   r   r   r   rX   r   ravel_coeffsunravel_coeffsr	   )
r   _swt_iswt
ravel_typer2   rg   arrslicesshapesr   s
             rA   test_swt_ravel_and_unravelr?  m  s     $)U+	4:v.	4:v.*0 	 	%dE: GFTM""DF!666"/22VVVV:NNNE!V1	 	rC   )N)>
__future__r   r   r   rL   copyr   	itertoolsr   r   numpyrX   pytestnumpy.testingr	   r
   r   r   r   r   r,   pywt._extensions._swtr   int8r  r  r  r  r  r   r   r   r.   rB   rP   ri   r   r   r   r   r   markslowr   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r%  r1  r4  r?  rO   rC   rA   <module>rJ     s8   A @ @ @ @ @ @ @ @ @        0 0 0 0 0 0 0 0     L L L L L L L L L L L L L L L L  * * * * * * Wbj"*bj",]	j"*bj"*blm
 

+ + +@. . .5A 5A 5Ap< < <B# # #$5 5 5$C C CA A A  <  <  <  <F4 4 4@ @ @ @L L L>#) #) #)L +5 +5 +5 +5\4 4 4B B B 6 6 6M M M8
B 
B 
B4 4 464 4 484 4 4<G G GA A A&K K K.K K K.    rC   