
    .Ph                     b   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZ 	 ddlZn# e$ r dZY nw xY wddlZddlmZmZ ddlmZmZmZmZmZ ddlmZm Z m!Z!m"Z" ddl#m$Z$ dd	l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ dd
l,m-Z-m.Z.m/Z/ g Z0dZ1e02                    e1           e3Z4e02                    e4            e5d          Z6e02                    e6            e7d          Z8e02                    e8            e9d          Z:e02                    e:            e;d          Z<e02                    e<            e=d          Z>e02                    e>           dZ?e02                    e?           g Z@e02                    e@           i ZAe02                    eA           eBZCe02                    eC           d ZD G d d          ZE G d deF          ZGe02                    eD           e02                    eE           e02                    eG            eE            ZHe02                    eH            eG            ZIe02                    eI            e-dddg           e-de0          d                         ZJd ZK e-ddd eL            g          d             ZMe* e-dg d          d                         ZNe*d             ZOe*d             ZPe*d             ZQe*d             ZRe*d              ZSe*e) e-dd!d"g          d#                                     ZTe*d$             ZUe*d%             ZVd& ZWdyd'ZXe*d(             ZYe*d)             ZZe*d*             Z[ e-d+d,d-g          d.             Z\ e-d/d0d1d2]                    d3          fd4d5]                    d3          fg          d6             Z^ e-d7d8d9g          d:             Z_e* e-dg d;           e-d<e          d=                                     Z`d> Zad? Zb e-d@dAebfdBeafg          dC             Zc e-dDg dE          dF             Zde*dG             Zee*dH             Zfe*dI             Zge*dJ             Zhe*dK             Zi e-dLdMdNdO]                     ejj        ddP          dPz            k                    dQ          z  gdRdSgT           e-dUg dV          dW                         Zl e-dXdddYdZdi g          d[             Zm e-d\g d]          d^             Zn e-d_ddi g          d`             Zoe'# G da dbe'jp                  Zqdc Zr G dd de          Zse*df             Ztdg Zue*dh             Zve*di             Zwe*dj             Zxe*dk             Zydl Zz e-dmddi g          dn             Z{do Z| G dp dqe          Z} G dr dse          Z~dt Ze(du             Ze+dv             Zej        gZej        ej        k    re2                    ej                   e* e-dwe          dx                         ZdS )zz@Test the numpy pickler as a replacement of the standard pickler.    N)closing)Path)numpy_pickleregister_compressor)_COMPRESSORS_LZ4_PREFIXLZ4_NOT_INSTALLED_ERRORBinaryZlibFileCompressorWrapper)_IO_BUFFER_SIZE_detect_compressor_ensure_native_byte_order#_is_numpy_array_byte_order_mismatch)data)memory_usednpwith_lz4with_memory_profiler
with_numpywithout_lz4)parametrizeraiseswarns    c              #      K   | V  d S Nr   )xs    ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/joblib/test/test_numpy_pickle.py	_functionr    U   s      
GGGGG    c                       e Zd Zd ZdS )_classc                     d S r   r   selfs    r   _methodz_class._methodZ       r!   N__name__
__module____qualname__r'   r   r!   r   r#   r#   Y   #            r!   r#   c                       e Zd Zd ZdS )	_newclassc                     d S r   r   r%   s    r   r'   z_newclass._method_   r(   r!   Nr)   r   r!   r   r/   r/   ^   r-   r!   r/   compressmemberc                     |                      d          j        }t          j        |||           t          j        |          }|t          j        |          k    r||k    sJ d S d S )Ntest.pklr1   )joinstrpathr   dumploadcopydeepcopy)tmpdirr1   r2   filename_members        r   test_standard_typesr?   p   sv     {{:&&.Hfh::::))G v&&&&     '&  r!   c                      t          t                    5  t          j        dt	                                 d d d            d S # 1 swxY w Y   d S )Nfoo)r   
ValueErrorr   r8   dictr   r!   r   test_value_errorrD   }   s    	
		 ) )%((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )s   "AAAwrong_compress
   c                     d                     |           }t          t                    5 }t          j        dd|            d d d            n# 1 swxY w Y   |                    |           d S )Nz%Non valid compress level given: "{0}"dummyrA   r5   )formatr   rB   r   r8   match)rE   exception_msgexcinfos      r   test_compress_level_errorrN      s     <BB>RRM	
		 Cw'5>BBBBC C C C C C C C C C C C C C CMM-     s   AAA)FTr      zlibc                    |                      d          j        }t          j                            d          }|                    d          }t          |f|j        f||f|||gf          D ]\  }}t          j	        |||          }t          |          dk    sJ |d         |k    sJ t          j                            |d                   sJ t          j        |          }|D ]}	t          |	t          j                  sJ t          j                            t          j        |          t          j        |                     t          j        |dz   ddt          j        	          }t          j	        |||          }t          |          dk    sJ t          j        |          }t-          |          t          j        ur/t/          |d
          rt          |t-          |                    sJ t          j                            ||           t1                      }t          j	        |||          }t          |          dk    sJ t          j        |          }
t          |
t-          |                    sJ t          j                            |
j        |j                   t          j                            |
j        |j                   t          j                            |
j        |j                   d S )Nr4   r   )rG      r5   r   mmapw+   )modeshapedtype__array_prepare__)r6   r7   r   randomRandomStaterandom_sample	enumerateTr   r8   lenospathexistsr9   
isinstancendarraytestingassert_array_equalarraymemmapfloat64typehasattrComplexTestObjectarray_float	array_int	array_obj)r<   r1   r=   rndaindexobj	filenamesobj_item
obj_loadeds              r   test_numpy_persistencerx      s    {{:&&.H
)


"
"C'""A!v1v1ay ABB E E
s %c8hGGG	 9~~""""|x''''w~~il+++++  ** 	0 	0DdBJ//////

%%bhsmmRXd^^DDDD )Hv%D
L
L
LC!#x(CCCIy>>QX&&DCyy	!!gc3F&G&G!$S		*****J!!$,,, 

C!#x(CCCIy>>Q"8,,Jj$s)),,,,,J!!*"8#/JJJJ!!*"6FFFJ!!*"6FFFFFr!   c                     t          j        t          dz   t           j                  }|                     d          j        }t          j        ||d           t          j        |          }t           j	        
                    ||           d S )Nd   rX   r4   Tr5   )r   onesr   uint8r6   r7   r   r8   r9   re   rf   )r<   	big_arrayr=   arr_reloadeds       r   2test_numpy_persistence_bufferred_array_compressionr      sw    3.rx@@@I{{:&&.HiD9999$X..LJ!!)\:::::r!   c                 ^   t           j                            d          }|                    d          }|                     d          j        }t          j        ||           t          j        |d          }t          |t           j
                  sJ |                     d          j        }t                      }t          j        ||           t          j        |d          }t          |t          |                    sJ t          |j        t           j
                  sJ |j        j        j        rJ t          |j        t           j
                  sJ |j        j        j        rJ t          |j        t           j
                  rJ t           j                            |j        |j                   t           j                            |j        |j                   t           j                            |j        |j                   t          j        |d          }|j        j        j        sJ d|j        dd<   |j        j        j        sJ d|j        dd<   t          j        |d          }t           j                            |j        |j                   t           j                            |j        |j                   t          j        |d	           |j        j        j        sJ |j        j        dk    sJ |j        j        j        sJ |j        j        dk    sJ d S )
Nr   rG   z	test1.pklr	mmap_modez	test2.pklr+g      $@rT   )r   rZ   r[   r\   r6   r7   r   r8   r9   rc   rh   rl   rj   rm   flags	writeablern   ro   re   rf   rV   )r<   rp   rq   r=   brs   rw   obj_reloadeds           r   test_memmap_persistencer      s   
)


"
"C"A{{;''/Ha"""(c222Aa##### {{;''/H


Cc8$$$"8s;;;Jj$s)),,,,,j,bi88888%+5555j*BI66666#)3333*.	:::::J!!*"8#/JJJJ!!*"6FFFJ!!*"6FFF "8t<<<J!'1111#'J1R4 %////!#J2$X===LJ!!,":J<RSSSJ!!,"8*:NOOO h$////%////$,,,,!'1111!&$......r!   c                    t           j                            d          }|                    d          }t          j        ddgt
                    }||f}|                     d          j        }t          j	        ||           t          j
        |d          \  }}t          |t           j                  sJ t          |t           j                  rJ d S )	Nr   rG   r   r   r{   r4   r   r   )r   rZ   r[   r\   rg   objectr6   r7   r   r8   r9   rc   rh   )r<   rp   rq   r   	constructr=   a_cloneb_clones           r   $test_memmap_persistence_mixed_dtypesr      s     )


"
"C"A
!S(((AAI{{:&&.Hi***#(SAAAGW gry))))) '29-------r!   c                 z   t           j                            d          }|                    d          }t           j                            |d          }|                     d          j        }t          j	        ||           t          j
        |d          }t          |t           j        j                  sJ d S )Nr   rG   g      ?r4   r   r   )r   rZ   r[   r\   mamasked_greaterr6   r7   r   r8   r9   rc   masked_array)r<   rp   rq   r=   r   s        r   test_masked_array_persistencer   	  s     )


"
"C"A
Q$$A{{:&&.Ha"""(c222Aa+,,,,,,,r!   c                    t           j                            d          }|                    d          }|                     d          j        }t          j        ||d           t          t                    5 }t          j
        |d          }d d d            n# 1 swxY w Y   d                    d	 |D                       }d
 |D             }t          |t           j                  rJ t           j                            ||           t          |          dk    s
J |            t!          |d                   d| dk    sJ d S )Nr   rG   r4   r   r5   r   r   
c                 ,    g | ]}t          |          S r   )str.0ws     r   
<listcomp>z3test_compress_mmap_mode_warning.<locals>.<listcomp>  s    444a3q66444r!   c                     g | ]	}|j         
S r   messager   s     r   r   z3test_compress_mmap_mode_warning.<locals>.<listcomp>   s    ,,,a	,,,r!   z6mmap_mode "r+" is not compatible with compressed file z. "r+" flag will be ignored.)r   rZ   r[   r\   r6   r7   r   r8   r   UserWarningr9   rc   rh   re   rf   r_   r   )r<   rp   rs   this_filenamewarninforeloaded_obj	debug_msgs          r   test_compress_mmap_mode_warningr     s    )


"
"C


B

CKK
++3Mc=15555	{		 Hx#($GGGH H H H H H H H H H H H H H H		44844455I,,8,,,H,	22222J!!#|444x==AyHQK << < < 	< 	< 	< 	< 	< 	<s   :BB!$B!TFc                     |                      d          j        }t          j        d          }t          j        dt	          d          z  t          j                  }||fD ]}|j        dz  }|t          t          j        	                    dd                    z   }t          t          j        |||          }t          d	z   }	||	k    sJ t          t          j        |          }d
t          z   }
|||
z   k     sJ d S )Nr4   rG   rG   rz   g    .ArW   rX   r     r5   g0@    )r6   r7   r   r|   intr}   nbytesr   rZ   randintr   r   r8   r   r9   )r<   r1   r=   small_arrayr~   rs   sizeobj_filenamemem_usedwrite_buf_sizeread_buf_sizes              r   test_memory_usager   *  s   
 {{:&&.H'(##KcCHHnBH===IY' / /zC#bi&7&74&@&@"A"AA|0#|hWWW )+==>))))|0,?? _,$....../ /r!   c                    t          j        dt          j        d                    t          j        dt          j        d                    t          j        dt          j        d                    t          j        dt          j        d                    t          j        dddd	d
gd          t          j        dt           j                                                  dg}|                     d          j        }t          j	        ||d          }t          |          dk    sJ t          j        |          }t          ||          D ]i\  }}t          |t           j                  rBt          |          }|j        |j        k    sJ t           j                            ||           a||k    sJ jd S )N   <i8r{   >i8<f8>f8r   abcrR   rq   r   O      C'est l'été !ztemp.pkl.gzr5   )r   arangerX   rg   r}   tobytesr6   r7   r   r8   r_   r9   ziprc   rd   r   re   assert_equal)r<   expected_listfnamedumped_filenamesresult_listresultexpecteds          r   $test_compressed_pickle_dump_and_loadr   D  s    		!28E??+++
	!28E??+++
	!28E??+++
	!28E??+++
!U!!,,-S999
	#RX&&&..00M KK&&.E#(JJJ  A%%%%#E**K];; & &h
++ 	&0::H<8>1111J##FH5555X%%%%%& &r!   c                    t          j        d          }t          j        d          }||f}t          j        d|          }t          j        d|          }|                     d          j        }t          j        ||g|           t          j        |d          \  }}|j        |j        k    sJ |j        |v sJ t          j        |d          \  }	}
|	j        |j        k    sJ |
j        |j        k    sJ d S )	Nr   r   r   r{   ztemp.pklT)ensure_native_byte_orderF)r   rX   r   r6   r7   r   r8   r9   )r<   little_endian_dtypebig_endian_dtype
all_dtypesle_arraybe_arrayr   le_array_native_loadbe_array_native_loadle_array_nonnative_loadbe_array_nonnative_loads              r   test_memmap_loadr   ^  s'   (5//x%'78Jy"5666Hy"2333HKK
##+Ex*E2221=1B2 2 2..  %)=)CCCCC%33337C7H8 8 844 #(HN::::"(HN::::::r!   c                      d} t          t          t          j        |                     5  t	          j        ddd           d d d            d S # 1 swxY w Y   d S )NzrNative byte ordering can only be enforced if 'mmap_mode' parameter is set to None, but got 'mmap_mode=r+' instead.)rK   z/path/to/some/dump.pklTr   )r   r   )r   rB   reescaper   r9   )expected_msgs    r   test_invalid_parameters_raiser   z  s    	: 
 

")L"9"9	:	:	: 
 
$tt	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   AAAc                    t          j        d|           }t          |                    d                    }ddd}|                    dd          }|                    |d          }||k    r	 t          j        d          5 }t          j        d	           t          j	        | |
          }	ddd           n# 1 swxY w Y   t          j                            |           }
d|
v sd|
v rdnd}t          j        d|
          r|dnd}||z   }t          |          |k    sJ d| dd |D                          d |D             }d |D             }|D ]/}t          |j                  d                    |           k    sJ 0|D ]C}t          j        |           }t          j        d| dt          |j                            sJ Dt'          |	|          D ]i\  }}t)          |t*          j                  rBt/          |          }|j        |j        k    sJ t*          j                            ||           a||k    sJ jdS # t6          $ r}|dk    r-t)          |t8                    sJ d}|t          |          v sJ nX|                     d          rBt<          j        d         r0t)          |t8                    sJ t@          t          |          v sJ n Y d}~dS Y d}~dS d}~ww xY w	 t          j	        |            tC          d          # t8          $ r8}d                    |          }|t          |j                  v sJ Y d}~dS d}~ww xY w)zHelper function to test joblib pickle content.

    Note: currently only pickles containing an iterable are supported
    by this function.
    z.+py(\d)(\d).+r   rR   rO   )rR   rO   rU   T)recordalwaysr   Nz_0.9z_0.8.4r   z_0.1.+.pkl$z6Did not get the expected number of warnings. Expected z but got warnings: c                     g | ]	}|j         
S r   r   r   s     r   r   z!_check_pickle.<locals>.<listcomp>  s    000!AI000r!   c                 F    g | ]}t          |j        t                    |S r   )
issubclasscategoryDeprecationWarningr   s     r   r   z!_check_pickle.<locals>.<listcomp>  s:     $ $ $z!*>P'Q'Q$$ $ $r!   c                 F    g | ]}t          |j        t                    |S r   )r   r   r   r   s     r   r   z!_check_pickle.<locals>.<listcomp>  s)    XXX1Jqz;4W4WXQXXXr!   zkThe file '{0}' has been generated with a joblib version less than 0.10. Please regenerate this pickle file.zmemmapped.+z.+segmentation faultzPYou may be trying to read with python 3 a joblib pickle generated with python 2..lz4z>Numpy pickle loading should have raised a ValueError exceptionz unsupported pickle protocol: {0})"r   rK   r   groupgetwarningscatch_warningssimplefilterr   r9   r`   ra   basenamesearchr_   r   r   rJ   r   r   rc   r   rd   r   rX   re   r   	ExceptionrB   endswithr   argsr	   AssertionError)r=   r   r   version_matchpy_version_used_for_writing%py_version_to_default_pickle_protocolpickle_reading_protocolpickle_writing_protocolr   r   filename_base expected_nb_deprecation_warningsexpected_nb_user_warningsexpected_nb_warningsdeprecation_warningsuser_warningsr   escaped_filenamer   r   excr   es                          r   _check_pickler     s    H.99M"%m&9&9!&<&<"="=01aLL)CGG1MMCGG#Q  "999>	(555 O%h///*/INNNO O O O O O O O O O O O O O O G,,X66M--]1J1JQR - Im];;@I@U  & 13LL ! x==$88883'3 300x0003 3 988$ $#$ $ $  YXXXXM)  	NN##)6(#3#34 4 4 4 4 #  #%9X#6#6 yH"2HHH#ai..      %(]$C$C . . h
33 .8BBH!<8>9999J++FH====!X-----. .  	 	 	 +a//!#z22222H  #c((*****""6** x}Q/? !#z22222.#c((::::: +***** ;:::::	$	*h''' P    	* 	* 	*8??@WXXGc!&kk))))))))))	*sV   1I +B=1I =CI CFI 
K2BK--K26#L 
M#-MMc            
         t          j        dt          j        d                    t          j        dt          j        d                    t          j        dddddgd	          t          j        d
t           j                                                  t          j        g dt          j        d                    dg} t          j        	                    t          j        
                    t          j                            dt          dz  fdt          j                  D             }|D ]}t          ||            d S )Nr   r   r{   r   r   r   rR   r   r   r   r   r   rR   r   ).pkl.gzz.gzip.bz2lz4).xz.lzmac                     g | ]=t          fd D                       t          j                                      >S )c              3   B   K   | ]}                     |          V  d S r   )r   )r   extfns     r   	<genexpr>zGtest_joblib_pickle_across_python_versions.<locals>.<listcomp>.<genexpr>  s/      ==Cr{{3======r!   )anyr`   ra   r6   )r   r  pickle_extensionstest_data_dirs    @r   r   z=test_joblib_pickle_across_python_versions.<locals>.<listcomp>  s^       ====+<=====
]B''  r!   )r   r   rX   rg   r}   r   matrixr`   ra   dirnameabspathr   __file__lzmalistdirr   )r   pickle_filenamesr   r  r  s      @@r   )test_joblib_pickle_across_python_versionsr    sH    		!28E??+++
	!28E??+++
!U!!,,-S999
	#RX&&&..00 		)))28E??333
M  GOOBGOODM$B$BCCM?--    *]++   " , ,e]++++, ,r!   c            
         t          j        dt          j        d                    t          j        dt          j        d                    t          j        dddddgd	          t          j        d
t           j                                                  t          j        g dt          j        d                    dg} t          j        	                    t          j        
                    t          j                            fdt          j                  D             }|D ]}t          || d           d S )Nr   r   r{   r   r   r   rR   r   r   r   r  r   c                 z    g | ]7}|                     d           t          j                            |          8S )r  )r   r`   ra   r6   )r   r  r  s     r   r   zGtest_joblib_pickle_across_python_versions_with_mmap.<locals>.<listcomp>  sK       ;;v
]B''  r!   r   r   )r   r   rX   rg   r}   r   r  r`   ra   r  r  r   r  r  r   )r   r  r   r  s      @r   3test_joblib_pickle_across_python_versions_with_mmapr    s/    		!28E??+++
	!28E??+++
!U!!,,-S999
	#RX&&&..00 		)))28E??333
M GOOBGOODM$B$BCCM   *]++  
 " ; ;e]c:::::; ;r!   c                  
   t          j        ddgddg          t          j        dt          j        d                    t          j        dt          j        d                    g} | D ]}t          j        d	k    rt          |          rJ nt          |          sJ t          |          }|j        j        r3|j        j        	                                D ]}|d
         j        dk     |j        j        dk    sJ t          j        ddgddg          t          j        dt          j        d                    t          j        dt          j        d                    g}|D ]}t          j        dk    rt          |          rJ nt          |          sJ t          |          }|j        j        r3|j        j        	                                D ]}|d
         j        dk     |j        j        dk    sJ d S )N)r   g       @)rO   g      @) r   )r  r   r{   rO   r   r   bigr   =)r  r   )r  r   r   r   little)
r   rg   r   rX   sys	byteorderr   r   fieldsvalues)	be_arraysrg   	convertedf	le_arrayss        r   .test_numpy_array_byte_order_mismatch_detectionr)    s,    	(H%k;-GHHH
	!28E??+++
	!28E??+++I  
4 
4=E!!:5AAAAAA6u=====-e44	?! 	4_+2244 & &!#%%%& ?,33333 	(H%k;-GHHH
	!28E??+++
	!28E??+++I  
4 
4=H$$:5AAAAAA6u=====-e44	?! 	4_+2244 & &!#%%%& ?,33333
4 
4r!   compress_tuple)rP   rO   gziprO   c                     |                      d          j        }t          j        d||           t	          |d          5 }t          |          |d         k    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr4   rI   r5   rbr   r6   r7   r   r8   openr   )r<   r*  r=   r'  s       r   test_compress_tuple_argumentr1  J  s     {{:&&.Hgx.AAAA	h		 :!!$$q(999999: : : : : : : : : : : : : : : : : :s   A,,A03A0zcompress_tuple,message))rP   rO   extraz9Compress argument tuple should contain exactly 2 elements)wrongrO   z(Non valid compression method given: "{}"r3  )rP   r3  z$Non valid compress level given: "{}"c                     |                      d          j        }t          t                    5 }t	          j        d||           d d d            n# 1 swxY w Y   |                    |           d S )Nr4   rI   r5   )r6   r7   r   rB   r   r8   rK   )r<   r*  r   r=   rM   s        r   &test_compress_tuple_argument_exceptionr5  T  s    $ {{:&&.H	
		 Fw'8nEEEEF F F F F F F F F F F F F F FMM's   AAAcompress_stringrP   r,  c                     |                      d          j        }t          j        d||           t	          |d          5 }t          |          |k    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr4   rI   r5   r.  r/  )r<   r6  r=   r'  s       r   test_compress_string_argumentr8  m  s     {{:&&.Hgx/BBBB	h		 8!!$$777778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   A&&A*-A*)r   rO      cmethodc                    |                      d          j        }t          j        dd          t	          d          dddg d	i d
df}|dv rt
          t          j        d           n,|dk    r&t          j	        d
         rt          j        d           |dz   |z   }|D ]}t          j        ||||f           t          |d          5 }t          |          |k    sJ 	 d d d            n# 1 swxY w Y   t          j        |          }t          |t!          |                    sJ t          |t          j                  r!t          j                            ||           ||k    sJ d S )Nr4   )rz   rz   f8r   rG   r   r   )rq   rR   r   r   g      ?r  xzzlzma is support not availabler  zlz4 is not installed..r5   r.  )r6   r7   r   r|   ranger  pytestskipr   r   r   r8   r0  r   r9   rc   rj   rd   re   rf   )	r<   r1   r:  r=   objectsdump_filenamers   r'  r   s	            r   test_joblib_compression_formatsrE  w  s    {{:&&.H
j---b		C


		G .  T\34444	E		hmA.	 	+,,,sNW,M ' '#}7JKKKK-&& 	4!%a((G33333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 $(77,S		22222c2:&& 	'J)),<<<<3&&&&&' 's   
C--C1	4C1	c                    t          t          j        | d                    5 }|                                }ddd           n# 1 swxY w Y   t	          |d          5 }|                    |           ddd           dS # 1 swxY w Y   dS )zDecompress a gzip file.r.  Nwb)r   r,  GzipFilereadr0  writesource_filenametarget_filenamefobufs       r   _gzip_file_decompressrP    s    	55	6	6 "ggii               
ot	$	$ 
                 s#   AAABB	Bc                    t          | d          5 }t          j        |                                          }ddd           n# 1 swxY w Y   t          |d          5 }|                    |           ddd           dS # 1 swxY w Y   dS )zDecompress a zlib file.r.  NrG  )r0  rP   
decompressrI  rJ  rK  s       r   _zlib_file_decompressrS    s    	ot	$	$ )obggii(() ) ) ) ) ) ) ) ) ) ) ) ) ) ) 
ot	$	$ 
                 s#   'AAABB	Bzextension,decompress.zr  c                     d}|                      d          j        }||z   }t          j        ||            |||           t          j        |          }||k    sJ d S )Nza string to persistr4   )r6   r7   r   r8   r9   )r<   	extensionrR  rs   filename_rawfilename_compressedr   s          r   'test_load_externally_decompressed_filesrY    sz      C;;z**2L&2c./// J"L111  $\22L,r!   zextension,cmethod))rT  rP   )r  r,  )r  bz2)r  r  )r  r>  )r  not-compressed)r  r[  c                    |dv rt           t          j        d           |                     d          j        }d}||z   }t          j        ||           t          |d          5 }t          |          |k    sJ 	 d d d            n# 1 swxY w Y   t          j	        |          }t          |t          |                    sJ ||k    sJ d S )Nr=  zlzma is missingr4   zobject to dumpr.  )r  rA  rB  r6   r7   r   r8   r0  r   r9   rc   rj   )r<   rV  r:  r=   rs   
dump_fnamer'  r   s           r   %test_compression_using_file_extensionr^    s    .  T\%&&&{{:&&.H
CI%Jc:&&&	j$		 01!!$$/////0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  $Z00LlDII.....3s   &B		BBc                 (   t           j                            d          dg}t          j        t          j        g}t          |t          j        gz  }|                     d          j	        }|D ]#}|D ]} ||d          5 }t          j        ||           d d d            n# 1 swxY w Y    ||d          5 }t          j        |          }d d d            n# 1 swxY w Y   t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   t          |t           j                  rBt           j                            ||           t           j                            ||           ||k    sJ ||k    sJ %d S )Nr   	some datar4   rG  r.  )r   rZ   rZ  BZ2Filer,  rH  r  LZMAFiler6   r7   r   r8   r9   r0  rc   rd   re   rf   )	r<   objsfobjsr=   rs   fobjr'  r   obj_reloaded_2s	            r   test_file_handle_persistencerg    sN   IX&&4D[$-(E$- {{:&&.H - - 	- 	-Dh%% *!#q)))* * * * * * * * * * * * * * *
 h%% 4+0334 4 4 4 4 4 4 4 4 4 4 4 4 4 4
 h%% 6!-!21!5!56 6 6 6 6 6 6 6 6 6 6 6 6 6 6 #rz** -
--lC@@@
--ncBBBB#s****%,,,,,'	-- -s6   B##B'*B':CC"C6DDDc                  P   t           j                            d          dg} | D ]}t          j                    }t	          j        ||           t	          j        |          }t          |t           j                  r!t           j	        
                    ||           y||k    sJ d S )Nr   r`  )r   rZ   ioBytesIOr   r8   r9   rc   rd   re   rf   )rc  rs   r'  r   s       r   test_in_memory_persistencerk    s    IX&&4D ' 'JLL#q!!!#(++c2:&& 	'J)),<<<<3&&&&&' 'r!   c                    t           j                            d          }|                     d          j        }t	          |d          5 }t          j        ||           d d d            n# 1 swxY w Y   t	          |d          5 }t          j        |d          }d d d            n# 1 swxY w Y   t           j        	                    ||           d S )Nr   r4   rG  r.  r   r   )
r   rZ   r6   r7   r0  r   r8   r9   re   rf   )r<   rs   r=   r'  r   s        r   !test_file_handle_persistence_mmaprm    s9   
)

8
$
$C{{:&&.H	h		 "#q!!!" " " " " " " " " " " " " " " 
h		 <#(d;;;< < < < < < < < < < < < < < < J!!,44444s$   
A,,A03A0B**B.1B.c                 h   t           j                            d          }|                     d          j        }t	          |d          5 }t          j        ||d           d d d            n# 1 swxY w Y   t          t          j	        |d                    5 }t          t                    5 }t          j        |d           d d d            n# 1 swxY w Y   t          |          d	k    sJ t          |d
         j                  d|ddz  k    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   r4   rG  r+  r5   r.  r   r   r   r   zP"%(fileobj)r" is not a raw file, mmap_mode "%(mmap_mode)s" flag will be ignored.)fileobjr   )r   rZ   r6   r7   r0  r   r8   r   r,  rH  r   r   r9   r_   r   r   )r<   rs   r=   r'  r   s        r   ,test_file_handle_persistence_compressed_mmaprp     s   
)

8
$
$C{{:&&.H	h		 8#q;77778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 
x..	/	/ 
1; 	18a40000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	18}}!!!!#$$$23$&G&GHH H H H H
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
sH   
A..A25A2D'0CD'C	D'C	>D''D+.D+c                     t           j                            d          } t          j                    }t	          j        | |           t          t                    5 }t	          j        |d           d d d            n# 1 swxY w Y   t          |          dk    sJ t          |d         j                  dddiz  k    sJ d S )Nr   r   r   r   r   zuIn memory persistence is not compatible with mmap_mode "%(mmap_mode)s" flag passed. mmap_mode option will be ignored.r   )r   rZ   ri  rj  r   r8   r   r   r9   r_   r   r   )rs   rO  r   s      r   +test_file_handle_persistence_in_memory_mmaprr  3  s   
)

8
$
$C
*,,Cc3	{		 /x#..../ / / / / / / / / / / / / / /x==AHQK  !4()	) 	) 	) 	) 	) 	)s   A??BBr   s   a little data as bytes.i'  z{}r   zlatin-1za little data as bytes.za large data as bytes.)idscompress_level)r   rO   	   c                 X   |                      d          j        }t          |d          5 }t          |d|          5 }|                                sJ |                    |           |                                |                                k    sJ t          t          j	                  5  |
                                 d d d            n# 1 swxY w Y   t          t          j	                  5  |                                 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |j        sJ t          t                    5  |                                 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          |d          5 }t          |          5 }|                                sJ |                                sJ |                                |                                k    sJ |                                |k    sJ t          t          j	                  5  |                                 d d d            n# 1 swxY w Y   |                                sJ |                    d           |                                dk    sJ 	 d d d            n# 1 swxY w Y   |j        sJ 	 d d d            n# 1 swxY w Y   t          |d|          5 }|                                sJ |                    |           d d d            n# 1 swxY w Y   t          |d          5 }|                                |k    sJ |                                sJ 	 d d d            n# 1 swxY w Y   t          |d|          }|                                sJ |                    |           |                                 t          |d          }|                                |k    sJ |                                 d S )Nr4   rG  compresslevelr.  r   )r6   r7   r0  r
   writablerJ  filenor   ri  UnsupportedOperation_check_can_read_check_can_seekclosedrB   _check_not_closedreadableseekablerI  _check_can_writeseektellclose)r<   r   rt  r=   r'  fzs         r   test_binary_zlibfiler  E  s&    {{:&&.H	h		 #At>BBB 	%b;;==   HHTNNN99;;!((**,,,,/00 % %""$$$% % % % % % % % % % % % % % % /00 % %""$$$% % % % % % % % % % % % % % %	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% yJ 	# 	#  """	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	## # # # # # # # # # # # # # # 
h		 A 		"";;==   ;;==   99;;!((**,,,,7799$$$$/00 & &##%%%& & & & & & & & & & & & & & &;;==   GGAJJJ7799>>>>>		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" y               
$n	E	E	E {{}}
               
$	'	' 2wwyyD    {{}}              
 
$n	E	E	EB;;==HHTNNNHHJJJ	$	'	'B7799HHJJJJJs!  FA1D,/CD,CD,CD,4D	D,DD,DD, F,D0	0F3D0	4 FE5)F5E9	9F<E9	=FFF'K"7BKI$K$I((K+I(,AK5K"K	K"K		K""K&)K&?,L77L;>L;1NNN	bad_value   rq   c                 .   |                      d          j        }t          t                    5 }t	          |d|           d d d            n# 1 swxY w Y   t          j        d                    |                    }|                    |           d S )Nr4   rG  rw  zS'compresslevel' must be an integer between 1 and 9. You provided 'compresslevel={}')	r6   r7   r   rB   r
   r   r   rJ   rK   )r<   r  r=   rM   patterns        r   +test_binary_zlibfile_bad_compression_levelsr    s    {{:&&.H	
		 @wxY????@ @ @ @ @ @ @ @ @ @ @ @ @ @ @i	**0&*;*; G MM's   AAAbad_mode)rq   r   r   r   r   rR   c                     |                      d          j        }t          t                    5 }t	          ||           d d d            n# 1 swxY w Y   |                    d           d S )Nr4   zInvalid mode)r6   r7   r   rB   r
   rK   )r<   r  r=   rM   s       r   "test_binary_zlibfile_invalid_modesr    s    {{:&&.H	
		 +wx***+ + + + + + + + + + + + + + +MM.!!!!!s   AAAbad_filec                     t          t                    5 }t          | d           d d d            n# 1 swxY w Y   |                    d           d S )Nr.  z1filename must be a str or bytes object, or a file)r   	TypeErrorr
   rK   )r  rM   s     r   *test_binary_zlibfile_invalid_filename_typer    s    				 'gx&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' 'MMEFFFFF   266c                       e Zd Zd ZdS )SubArrayc                 :    t           t          j        |           ffS r   )_load_sub_arrayr   asarrayr%   s    r   
__reduce__zSubArray.__reduce__  s    "RZ%5%5$777r!   N)r*   r+   r,   r  r   r!   r   r  r    s#        	8 	8 	8 	8 	8r!   r  c                 <    t          | j                  }| |d d <   |S r   )r  rW   )arrds     r   r  r    s#    SY!!!r!   c                       e Zd ZdZd ZdS )rl   z7A complex object containing numpy arrays as attributes.c                     t          j        dd          | _        t          j        dd          | _        t          j        g dd          | _        d S )Nrz   ri   r{   int32)rq   rG   g      4@r   )r   r   rm   r|   rn   rg   ro   r%   s    r   __init__zComplexTestObject.__init__  sM    !yI>>>DWS888DNXoooXFFFDNNNr!   N)r*   r+   r,   __doc__r  r   r!   r   rl   rl     s.        EE	G 	G 	G 	G 	Gr!   rl   c                    |                      d          j        }t          d          }t          j        ||           t          j        |          }t          |t                    sJ t          j        	                    ||           d S )Nr4   )rG   )
r6   r7   r  r   r8   r9   rc   r   re   rf   )r<   r=   rq   cs       r   test_numpy_subclassr    sx    {{:&&.HAa"""(##Aa"""""J!!!Q'''''r!   c                 .   |                      d          j        }d}t          j        |t	          |                     t          j        |          |k    sJ t          j        ||           t          j        t	          |                    |k    sJ d S )Nr4   {   )r6   r7   r   r8   r   r9   )r<   r=   values      r   test_pathlibr    s    {{:&&.HEeT(^^,,,X&&%////eX&&&T(^^,,555555r!   c                    |                      d          j        }t          j        ddgddgg          dd          t          j        dd          d d d dd d f         fD ]g}|j        j        rJ |j        j        rJ t          j	        ||           t          j
        |          }t          j                            ||           hd S )	Nr4   r   rR   rO   rU   )rG   2      F)order)r6   r7   r   asfortranarrayr|   r   c_contiguousf_contiguousr   r8   r9   re   rf   )r<   r=   rg   array_reloadeds       r   "test_non_contiguous_array_picklingr    s    {{:&&.H
 	Aq6Aq6*++ABB/
C(((BQB2 = = ;++++;++++%***%*844

%%ne<<<<= =r!   c                    |                      d          j        }t          j        d          }t	          j        ||t          j                   t	          j        |          }t          j	        
                    ||           d S )Nr4   rG   protocol)r6   r7   r   zerosr   r8   pickleHIGHEST_PROTOCOLr9   re   rf   )r<   r=   
test_arrayr  s       r   test_pickle_highest_protocolr    sn     {{:&&.H"Jj(V5LMMMM!&x00NJ!!.*=====r!   c                     t          j        d          } d}t          j        t          j        t          j                  }|                    |           |                    d           t          j        |          5 }|                                \  }}|	                    d          5 }t          j        | |           d d d            n# 1 swxY w Y   |	                    d          5 }t          j        |          }d d d            n# 1 swxY w Y   t           j                            ||            t          j                    }	t          j        | |	           |                    |	                                           |	                    d          5 }t          j        |          }d d d            n# 1 swxY w Y   t           j                            ||            d d d            d S # 1 swxY w Y   d S )NrG   )	localhosti90  r   rG  r.  )r   r   socketAF_INETSOCK_STREAMbindlistencreate_connectionacceptmakefiler   r8   r9   re   rf   ri  rj  sendgetvalue)
r  _ADDRlistenerclientserverclient_addrsfcfr  bytes_to_sends
             r   test_pickle_in_socketr    s    2J E}V^V-?@@HMM%OOA		!%	(	( BF&oo//__T"" 	.bj"---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. __T"" 	3b).r22N	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	
%%njAAA 
*m444M**,,---__T"" 	3b).r22N	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	
%%njAAA)B B B B B B B B B B B B B B B B B Bs   >-G6+CG6C	G6C	G6-DG6D	G6D	BG6F>2G6>G	G6G	#G66G:=G:c                    |                      d          j        }t          j        }t	          j        |d          t	          j        |d          g}t          j        ||           t          j	        |d          }t          |d         t          j                  sJ |d         j        |k    sJ t          j                            ||           d S )N	test.mmapr}   r{   r   r   r   )r6   r7   rS   ALLOCATIONGRANULARITYr   r  r|   r   r8   r9   rc   rh   offsetre   rf   )r<   r   r   rs   memmapss        r    test_load_memmap_with_big_offsetr    s     KK$$,E%D8D((("'$g*F*F*F
GCc5!!!555Ggaj"),,,,,1:t####J!!#w/////r!   c                 &   d}d G d dt           j                   G fddt                    }t          | |                       t          |         j        k    sJ t          |         j        k    sJ t	          j        |           d S )N	test-nameztest-prefixc                       e Zd ZdS ):test_register_compressor.<locals>.BinaryCompressorTestFileNr*   r+   r,   r   r!   r   BinaryCompressorTestFiler            r!   r  c                       e Zd Z fdZdS )=test_register_compressor.<locals>.BinaryCompressorTestWrapperc                 6    t          j        |            d S )Nrs   prefixr   r  )r&   r  compressor_prefixs    r   r  zFtest_register_compressor.<locals>.BinaryCompressorTestWrapper.__init__  s0    &2;L     r!   Nr*   r+   r,   r  )r  r  s   r   BinaryCompressorTestWrapperr    s3        	 	 	 	 	 	 	 	r!   r  )ri  BufferedIOBaser   r   r   fileobj_factoryr  pop)r<   compressor_namer  r  r  s      @@r   test_register_compressorr    s    !O%    2#4          &7    )D)D)F)FGGG(8<TTTTT(/3DDDDD _%%%%%r!   invalid_namec                     t          t                    5 }t          | d            d d d            n# 1 swxY w Y   |                    d           d S )Nz"Compressor name should be a string)r   rB   r   rK   )r  rM   s     r   %test_register_compressor_invalid_namer  .  s     

		 0wL$///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0MM677777r  c                       G d d           G fddt                     } t          t                    5 }t          d |                        d d d            n# 1 swxY w Y   |                    d           d S )Nc                       e Zd ZdS )Ctest_register_compressor_invalid_fileobj.<locals>.InvalidFileObjectNr  r   r!   r   InvalidFileObjectr  9  r  r!   r  c                       e Zd Z fdZdS )Jtest_register_compressor_invalid_fileobj.<locals>.InvalidFileObjectWrapperc                 6    t          j        | d           d S Ns   prefixr  r  )r&   r  s    r   r  zStest_register_compressor_invalid_fileobj.<locals>.InvalidFileObjectWrapper.__init__=  s"    &t1B9UUUUUUr!   Nr  )r  s   r   InvalidFileObjectWrapperr  <  s5        	V 	V 	V 	V 	V 	V 	Vr!   r  invalidzQCompressor 'fileobj_factory' attribute should implement the file object interface)r   r   rB   r   rK   )r  rM   r  s     @r   (test_register_compressor_invalid_fileobjr  6  s          V V V V V V V#4 V V V 

		 CwI'?'?'A'ABBBC C C C C C C C C C C C C C C MM	$    s   AA!$A!c                       e Zd Zd ZdS )AnotherZlibCompressorWrapperc                 >    t          j        | t          d           d S r  )r   r  r
   r%   s    r   r  z%AnotherZlibCompressorWrapper.__init__J  s     "4^INNNNNNr!   Nr  r   r!   r   r  r  I  s(        O O O O Or!   r  c                       e Zd Zd ZdS ) StandardLibGzipCompressorWrapperc                 H    t          j        | t          j        d           d S r  )r   r  r,  rH  r%   s    r   r  z)StandardLibGzipCompressorWrapper.__init__O  s"    "4T]9MMMMMMr!   Nr  r   r!   r   r  r  N  s(        N N N N Nr!   r  c                     d} t          | t                                 t          t                    5 }t          | t	                                 d d d            n# 1 swxY w Y   |                    d                    |                      t          | t	                      d           | t          v sJ t          |          j        t          j
        k    sJ t          j        |            d S )Nr  z#Compressor '{}' already registered.T)force)r   r  r   rB   r  rK   rJ   r   r  r,  rH  r  )r  rM   s     r   +test_register_compressor_already_registeredr  S  s*   !O )E)G)GHHH	
		 QwO-M-O-OPPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q QMM7>>OOPPP)I)K)KSWXXXXl****(8DMIIII _%%%%%s   AA #A c                    dd l }d}|t          v sJ t          |         j        |j        j        k    sJ |                     d          j        }d}t          j        |||           t          |d          5 }|
                    t          t                              t          k    sJ 	 d d d            n# 1 swxY w Y   t          j        |          |k    sJ t          j        ||dz              t          |d          5 }|
                    t          t                              t          k    sJ 	 d d d            n# 1 swxY w Y   t          j        |          |k    sJ d S )Nr   r  r4   	test datar5   r.  r   )	lz4.framer   r  frameLZ4FrameFiler6   r7   r   r8   r0  rI  r_   r   r9   )r<   r  
compressorr   r   r'  s         r   test_lz4_compressionr	  h  s    J%%%%
#3sy7MMMMMKK
##+EDdEJ7777	eT		 7avvc+&&'';666667 7 7 7 7 7 7 7 7 7 7 7 7 7 7U##t++++ dEFN+++	eT		 7avvc+&&'';666667 7 7 7 7 7 7 7 7 7 7 7 7 7 7U##t++++++s$   73B77B;>B;3EEEc                    |                      d          j        }d}t          }t          t                    5 }t          j        ||d           d d d            n# 1 swxY w Y   |                    |           t          t                    5 }t          j        ||dz              d d d            n# 1 swxY w Y   |                    |           d S )Nz
test.nolz4r  r  r5   r   )r6   r7   r	   r   rB   r   r8   rK   )r<   r   r   msgrM   s        r    test_lz4_compression_without_lz4r    s;    KK%%-ED
!C	
		 7w$66667 7 7 7 7 7 7 7 7 7 7 7 7 7 7MM#	
		 0w$///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0MM#s#   AA #A B55B9<B9r  c                    |                      d          j        }t          j                            d          }t          j        |||           t          j        |d          }t          |t          j	                  sJ t          j
                            ||           |j        j        t
          j        z  dk    sJ |j        j        sJ t          j                            d          t          j                            d          t          j                            d          t          j                            d          g}|                      d          j        }t          j        |||           t          j        |d          }t#          |          D ]t\  }}t          |t          j	                  sJ t          j
                            ||         |           |j        j        t
          j        z  dk    sJ |j        j        sJ ut          j        dt          j                  t          j        d	t          j                  t          j        d
t          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  d	}|                      d          j        }t          j        |||           t          j        |d          }	|	                                D ]t\  }
}t          |t          j	                  sJ t          j
                            ||
         |           |j        j        t
          j        z  dk    sJ |j        j        sJ ud S )Nr  rR   r  r   r   r   z
test1.mmapr{   rO   r                     )	a0a1a2a3a4a5a6a7a8z
test2.mmap)r6   r7   r   rZ   randnr   r8   r9   rc   rh   re   rf   ctypesr   NUMPY_ARRAY_ALIGNMENT_BYTESr   alignedr]   r   r}   items)r<   r  r   rq   rh   
array_list
l_reloadedidx
array_dict
d_reloadedkeys              r   test_memmap_alignment_paddingr(    s^    KK$$,E
	Aa2222u444Ffbi(((((J!!!V,,,= HHAMMMM< 		
	
	
		J KK%%-Ej%(;;;;"5C888J ,, $ $V&"),,,,,

%%jov>>>}!L$LLPQQQQQ|##### i***i***i***i***i"(+++i"(+++i"(+++i"(+++i"(+++
 
J KK%%-Ej%(;;;;"5C888J!'')) $ $V&"),,,,,

%%jov>>>}!L$LLPQQQQQ|#####	$ $r!   r   )r  rZ  r:   r,  ri  rS   r`   r  rZ   r   r  r!  r   rP   
contextlibr   pathlibr   r  ImportErrorrA  joblibr   r   joblib.compressorr   r   r	   r
   r   joblib.numpy_pickle_utilsr   r   r   r   joblib.testr   joblib.test.commonr   r   r   r   r   r   joblib.testingr   r   r   typelist_noneappendrj   _typebool_boolr   _intfloat_floatcomplex_complexr   _string_tuple_list_dictr_   _builtinr    r#   r   r/   	_instance_objectr?   rD   rC   rN   rx   r   r   r   r   r   r   r   r   r   r   r  r  r)  r1  rJ   r5  r8  rE  rP  rS  rY  r^  rg  rk  rm  rp  rr  r   encoder  r  r  r  rd   r  r  rl   r  r  r  r  r  r  r  r  r  r  r  r  r	  r  DEFAULT_PROTOCOL	protocolsr  r(  r   r!   r   <module>rG     s   F F 



   				  				   				  



              KKKK   DDD  5 4 4 4 4 4 4 4                                              6 5 5 5 5 5 5 5 5 5  	        Q    
s1vv    	q    71::    
#a&&    	    
    
                 
       
 		        	   FHH	 	   
)++     Z!Q  Xx  ! ! !  ! !) ) ) B/00! ! 10! Z44455.G .G 65 .Gb ; ; ; )/ )/ )/X . . .$ 	- 	- 	-   & Z$''/ / ('  /. & & &2 ; ; ;6	
 	
 	
X* X* X* X*v !, !, !,H ; ; ;0 '4 '4 '4T [9::: : ;:: 	

 6==gFF	

 299'BB	
 " # "  0118 8 218 Z##Y%%!' !' &% $# !'H     
!"U,A$BC  	 $ 	 	 	   $ - - -< 	' 	' 	' 
5 
5 
5 
 
 
$   " 
"NFN1d33d:;;BB9MMM
 
#$<=   yyy))/ / *) /d [2r2sB344  54 Z33344" " 54" Z!R%%G G &%G >8 8 8 8 82: 8 8 8  
G G G G G G G G ( ( (6 6 6 = = =" > > > B B B> 0 0 0& & &0 ^aR[))8 8 *)8  &O O O O O#4 O O O
N N N N N'8 N N N
& & &* 
, , 
,.    $%		f555V,--- Z##3$ 3$ $# 3$ 3$ 3$s   A	 	AA