o
    îÇhç×  ã                   @   sb  d dl Zd dlmZmZmZ d dlm  mZ	 d dl
Z
d dlZd dlmZ d dlmZ d dlmZ d dlmZmZ G dd„ dƒZdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Ze
j  dg g fdgdgfddgddgfg d¢g d¢fg d¢g d¢fg d¢g d¢fg¡dd„ ƒZ!d d!„ Z"ed"gƒd#d$„ ƒZ#d%d&„ Z$d'd(„ Z%d)d*„ Z&d+d,„ Z'd-d.„ Z(d/d0„ Z)d1d2„ Z*d3d4„ Z+d5d6„ Z,d7d8„ Z-d9d:„ Z.ed;gd<d=d>d?d@„ ƒZ/edAgd<dBd>dCdD„ ƒZ0dEdF„ Z1dGdH„ Z2e
jj dIej3ej4gdJdKgdLdMdN„ ƒZ5dOdP„ Z6dQdR„ Z7dSdT„ Z8dUdV„ Z9dWdX„ Z:dYdZ„ Z;dld\d]„Z<d^d_„ Z=d`da„ Z>dbdc„ Z?eƒ ddde„ ƒZ@dfdg„ ZAdhdi„ ZBdjdk„ ZCdS )mé    N)Úassert_array_equalÚassert_array_almost_equalÚassert_array_less)ÚPath)Úimage_comparisonÚcheck_figures_equalc                   @   sà   e Zd Zg d¢Zg d¢Zg d¢g d¢gZddgZej 	deegi eeddgfeeegi eeedgfeege
ed	eeedgfeege
ed
eedegfeeege
ed
eeeegfeege
eedeeeegfg¡dd„ ƒZdS )ÚTestTriangulationParams©éÿÿÿÿr   é   r   ©r   r
   r   r   ©r   r   é   ©r   r   é   FTzargs, kwargs, expectedN©Ú	triangles©Úmask©r   r   c                 C   sŽ   ddg}dddœ}t j || i |¥|¥¡\}}}}	}
}|\}}}}||u s(J ‚||u s.J ‚t||ƒ |	|u s9J ‚|
|ks?J ‚||ksEJ ‚d S )Nr   r   r   Ú4)ÚaÚb)ÚmtriÚTriangulationÚ_extract_triangulation_paramsr   )ÚselfÚargsÚkwargsÚexpectedÚ
other_argsÚother_kwargsÚx_Úy_Ú
triangles_Úmask_Úargs_Úkwargs_ÚxÚyr   r   © r*   úw/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/matplotlib/tests/test_triangulation.pyÚ!test_extract_triangulation_params   s   	
ÿÿ
z9TestTriangulationParams.test_extract_triangulation_params)Ú__name__Ú
__module__Ú__qualname__r(   r)   r   r   ÚpytestÚmarkÚparametrizeÚdictr,   r*   r*   r*   r+   r      s    úr   c                  C   sX   dg} g d¢g d¢g d¢g| g}t j |i ¡\}}}}}}|d u s#J ‚|| gks*J ‚d S )NT©r   r   r   ©r   r   r   r   )r   r   r   )r   r   r"   r#   r$   r%   r&   r'   r*   r*   r+   Ú*test_extract_triangulation_positional_mask+   s   ÿr6   c                  C   sT  g d¢} g d¢}t jtdd t | ddg¡ W d   ƒ n1 s"w   Y  t jtdd t | |g d¢¡ W d   ƒ n1 sBw   Y  t jtd	d t | |d
¡ W d   ƒ n1 s`w   Y  t jtdd t | |g d¢g¡ W d   ƒ n1 sw   Y  t jtdd t | |g d¢g¡ W d   ƒ d S 1 s£w   Y  d S )Nr	   r   zx and y must be equal-length©Úmatchr   r   z>triangles must be a \(N, 3\) int array, but found shape \(3,\)r   z3triangles must be a \(N, 3\) int array, not 'other'Úotherzfound value 99)r   r   éc   zfound value -1)r   r   r
   ©r0   ÚraisesÚ
ValueErrorr   r   ©r(   r)   r*   r*   r+   Útest_triangulation_init7   s.   ÿþüþýÿ"ÿr?   c               	   C   sØ   g d¢} g d¢}g d¢g d¢g}t  | ||¡}t|jg d¢g d¢gƒ | ddg¡ t|jddgƒ | d ¡ |jd u s>J ‚d	}g d
¢dgdgddfD ]}tjt|d | |¡ W d   ƒ n1 sdw   Y  qKd S )Nr	   r   r   )r   r   r   )r
   r
   r   )r
   r
   r   FTz3mask array must have same length as triangles array)FTFr7   )	r   r   r   Ú	neighborsÚset_maskr   r0   r<   r=   )r(   r)   r   ÚtriangÚmsgr   r*   r*   r+   Útest_triangulation_set_maskK   s    
ÿ€ÿrD   c            	      C   sL  d} d}t  t  dd| ¡t  dd|¡¡\}}| ¡ }| ¡ }| | }d| d  |d  }d|  | d|   d|  d }t ||¡}t|j|ƒ t|j|ƒ t	|j
ƒ|ksWJ ‚t  |j
¡dksaJ ‚t  |j
¡|d ksmJ ‚t	|jƒ|ksvJ ‚t  |j¡dks€J ‚t  |j¡|d ksŒJ ‚|j}d |_t|j|ƒ tt  |j
¡t  |¡ƒ d S )	Né   é   ç        ç      ð?r   r   r   r   )ÚnpÚmeshgridÚlinspaceÚravelr   r   r   r(   r)   Úlenr   ÚminÚmaxÚedgesr@   Ú
_neighborsr   ÚuniqueÚarange)	ÚnxÚnyr(   r)   ÚnpointsÚ
ntrianglesÚnedgesrB   r@   r*   r*   r+   Útest_delaunayb   s*   $ rY   c                  C   sx   d} d}d}t j d¡ t j | ¡}t j | ¡}|| ||< || ||< t ||¡}tt  |j¡t  t  	| ¡|¡ƒ d S )Né
   é   r   é   )
rI   ÚrandomÚseedr   r   r   rR   r   ÚdeleterS   )rV   Ú	duplicateÚduplicate_ofr(   r)   rB   r*   r*   r+   Útest_delaunay_duplicate_pointsŒ   s   ÿrb   c                  C   sz   t  ddd¡} t  ddd¡}t t¡ t | |¡ W d   ƒ n1 s$w   Y  t  | d¡} t  |d¡}t | |¡ d S )NrG   ç      $@é   ç       @g       @)rI   rK   r0   r<   ÚRuntimeErrorr   r   Úappendr>   r*   r*   r+   Útest_delaunay_points_in_line    s   ÿrh   zx, yr   rE   r   é   )r   r   r   )rE   ri   rE   ©r   r   r   )rE   ri   ri   )r   r   r   r   r   r   )rE   rE   rE   ri   rE   ri   c                 C   s<   t  t¡ t | |¡ W d   ƒ d S 1 sw   Y  d S ©Nr;   r>   r*   r*   r+   Ú!test_delaunay_insufficient_points®   s   "ÿrl   c               
      sä   t  ddgddgddgddgddgd	d
gddgg¡} t  ddgddgddgddgddgddgddgg¡}dd„ ‰ ‡ fdd„}t | d d …df | d d …df ¡}|D ]}|||ƒdks]J ‚qRt | dd …df | dd …df ¡}d S )Ng¨LXèz¶ë?g     à¿gCM‹«?è?g~9B.ÜÈä?g     à¿gè/7ÑRá?gÞÇÒ9ûé?g     Ú¿gH¾ÇÜC„æ?g     Ú¿g³´¼tã?g     Ú¿gÂõ(\â?gq=
×£pÝ¿gÍÌÌÌÌÌä?gáz®GáÚ¿çffffffæ?g¸…ëQ¸Þ¿g)\Âõ(Ü¿ç      è?çš™™™™™é?c                 S   s   t  | |f¡j}t|ƒ |¡S rk   )rI   ÚvstackÚTr   Úcontains_point)ÚxtriÚytriÚxyÚ
tri_pointsr*   r*   r+   Útri_contains_pointÕ   s   z0test_delaunay_robust.<locals>.tri_contains_pointc                    s   t ‡‡ ‡fdd„ˆ jD ƒƒS )Nc                 3   s(    | ]}ˆ ˆj | ˆj| ˆƒV  qd S rk   r>   )Ú.0Útri)rw   rB   ru   r*   r+   Ú	<genexpr>Ý   s   €  ÿzCtest_delaunay_robust.<locals>.tris_contain_point.<locals>.<genexpr>)Úsumr   ©rB   ru   ©rw   r|   r+   Útris_contain_pointÜ   s   ÿz0test_delaunay_robust.<locals>.tris_contain_pointr   r   )rI   ÚarrayÚasarrayr   r   )rv   Útest_pointsr~   rB   Ú
test_pointr*   r}   r+   Útest_delaunay_robust¾   s0   ùù$(rƒ   ztripcolor1.pngc                  C   sø   t  g d¢¡} t  g d¢¡}t  g d¢g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g d¢g
¡}t | ||¡}| d|  }| |j jdd}||j jdd}d| | }t d¡ tj||dd t 	d¡ t d¡ tj||dd t 	d¡ d S )N)
r   ç      à?r   r   r„   r   r   r„   r   rn   )
r   r   r   r„   r„   r„   r   r   r   rn   ©r   r   r   )r   rF   r   ©r   r   rF   )r   rE   rF   )r   rF   ri   )rF   r[   ri   )rF   rE   é	   )r[   rF   r‡   )é   r[   r‡   )rE   rˆ   r‡   r„   r   ©Úaxiséy   Úk)Ú
edgecolorszpoint colorséz   )Ú
facecolorsr   r   )
rI   r€   r   r   r   ÚmeanÚpltÚsubplotÚ	tripcolorÚtitle)r(   r)   r   rB   ÚCpointsÚxmidÚymidÚCfacesr*   r*   r+   Útest_tripcolorë   s&   ü


r™   c                  C   s6  g d¢} g d¢}t  ¡ \}}tjtdd | | |¡ W d   ƒ n1 s&w   Y  tjtdd | | |g d¢¡ W d   ƒ n1 sFw   Y  tjtdd |j| |g d¢d	 W d   ƒ n1 sgw   Y  tjtd
d |j| |ddgdd W d   ƒ n1 s‰w   Y  tjtd
d |j| |ddgdd W d   ƒ n1 s«w   Y  tjtdd |j| |g d¢d W d   ƒ n1 sÌw   Y  tjtdd | | |ddgd¡ W d   ƒ n1 síw   Y  | | |g d¢¡ |j| |g d¢dd | | |ddg¡ |j| |ddgd	 d S )Nr	   r   z!tripcolor\(\) missing 1 required r7   z!The length of c must match either©r   r   r   z,length of facecolors must match .* triangles)r   r   r   rF   ©r   z-'gouraud' .* at the points.* not at the facesr   r   Úgouraud)r   Úshading)r   z+positional.*'c'.*keyword-only.*'facecolors')ÚCzUnexpected positional parameterÚunused_positional)r‘   Úsubplotsr0   r<   Ú	TypeErrorr“   r=   )r(   r)   ÚfigÚaxr*   r*   r+   Útest_tripcolor_color  sH   ÿÿÿþÿþÿþÿþÿr¤   c                  C   sp   t j d¡ t j d¡t j d¡t j d¡} }}t ¡  ¡ }d}|j| |||dj}|j	|j
f|ks6J ‚d S )Ni!N,rZ   )ç      Ð?rn   )Úclim)rI   r]   r^   Úrandr‘   ÚfigureÚadd_subplotr“   ÚnormÚvminÚvmax)r   r   Úcr£   r¦   rª   r*   r*   r+   Útest_tripcolor_clim%  s   (r®   c                  C   sª   g d¢} g d¢}ddg}t  ¡ \}}tjtdd |j| |||d W d   ƒ n1 s-w   Y  tjtdd |j| |d|d W d   ƒ d S 1 sNw   Y  d S )	Nr	   r   çš™™™™™Ù?r„   z"Positional parameter c .*no effectr7   r›   zinterpreted as c)r‘   r    r0   ÚwarnsÚUserWarningr“   )r(   r)   r­   r¢   r£   r*   r*   r+   Útest_tripcolor_warnings/  s   ÿ"ÿr²   c                  C   sh   t jg d¢g d¢gt jd} t  g d¢¡}|  ¡ }t |d d …df |d d …df | ¡j t|| ƒ d S )N©r   r   r   )r   r   r   ©Údtype))r   r   )r   gš™™™™™ñ?)r   r   )r   r   r   r   )rI   r   Úint32Úcopyr   r   rP   r   )r   ÚpointsÚold_trianglesr*   r*   r+   Útest_no_modify;  s
   (rº   c            
      C   s  t  t  d¡t  d¡¡\} }|  ¡ } | ¡ }g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g}t  t|ƒ¡}d|dd…< t | |||¡}| ¡ }g d¢}g d¢}t  ||¡\}}| ¡ }| ¡ }|||ƒ}t	|g d¢ƒ ||d |d ƒ}t	|g d¢ƒ g d¢}g d¢}|||ƒ}t	|g d¢ƒ ddg}ddg}|||ƒ}t	|d d!gƒ d}	g d"¢} d#d d d d |	dg}g d$¢g d%¢g d&¢g d¢g d'¢g d(¢g d)¢g d*¢g}t | ||¡}| ¡ }g d+¢}d,d-g}t  ||¡\}}|||ƒ}t	|g d.¢g d/¢gƒ d}	d#|	 d d d d dg} g d0¢}g d1¢g d2¢g d3¢g d4¢g d5¢g d6¢g d7¢g d*¢g}t | ||¡}| ¡ }d,d-g}g d+¢}t  ||¡\}}|||ƒ}t	|d#d#gd d8gd d8gd d9gdd9gdd:gd#d#ggƒ g d;¢} g d<¢}g d1¢g d=¢g}t | ||¡}| ¡ }g d>¢}g d?¢}|||ƒ}t	|g d@¢ƒ | 
dd g¡ || ¡ ksºJ ‚|||ƒ}t	|g dA¢ƒ d S )BNrF   ©r   r   rF   ©r   rE   rF   ©r   r   rE   ©r   ri   rE   ©r   r   ri   ©r   r[   ri   ©rF   rE   rˆ   ©rE   r‡   rˆ   ©rE   ri   r‡   ©ri   rZ   r‡   ©ri   r[   rZ   ©r[   rd   rZ   ©rˆ   r‡   é   ©r‡   é   rÈ   ©r‡   rZ   rÊ   ©rZ   é   rÊ   ©rZ   rd   rÍ   ©rd   é   rÍ   r   rˆ   rZ   )r¥   ç      ô?ç      @ç      
@)r   r   rF   r
   ri   r
   rZ   r
   rÈ   rÍ   é   r
   r
   r
   r
   r
   r„   )r
   r
   r
   r
   r
   r   r   rE   r
   r[   r
   rd   r
   rÊ   rÐ   é   )r„   ç      ø?ç      @r„   rÖ   r×   rÖ   rÖ   rG   rH   re   ç      @)rG   rG   rG   rØ   rØ   rØ   rH   re   rÖ   rÖ   rÖ   rÖ   )r   r   rF   rÊ   rÐ   rÕ   r   rÍ   ri   r[   rZ   rd   rG   rØ   r   rÕ   ©rÖ   r   r   r   r   rÖ   rÖ   r
   r4   ©r   r   r   ©r   rF   r   ©r   r   rE   ©r   rF   rE   ©r   rE   ri   ©rF   ri   rE   )çš™™™™™¹¿r¯   çÍÌÌÌÌÌì?gffffffö?gffffffþ?g333333@g333333@rà   çš™™™™™¹?)r
   r   r   r   r   r   r
   )r
   ri   ri   ri   r[   r[   r
   )rÖ   rÖ   r   r   r   r   rÖ   r   )r   r   rE   rš   )r   r   rF   )r   rF   rE   )r   ri   r   )r   ri   rF   rE   ri   r[   ©r   r   r   r   ©r   r   r   r   ©r   r   r   )gš™™™™™É¿çš™™™™™É?ro   g333333ó?)r„   r„   r„   r„   )r
   r   r   r
   )r
   r
   r   r
   )rI   rJ   rS   rL   ÚzerosrM   r   r   Úget_trifinderr   rA   )
r(   r)   r   r   rB   Ú	trifinderÚxsÚysÚtrisÚdeltar*   r*   r+   Útest_trifinderE  s   ý


	ÿ

ÿ
ÿ
(ÿ

rî   c                     s–  t  t  d¡t  d¡¡\} }|  ¡ } | ¡ }d|  d|  }g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g}t  t|ƒ¡}d|dd…< t | |||¡}t ||¡}t 	||¡}tj	||dd}t  
ddd¡}	g d¢}
t  |	|
¡\}	}
|||fD ]}||	|
ƒ}t|d|	 d|
  ƒ q—g d¢}	|	}
t  |	|
¡\}	}
|||fD ]}||	|
ƒ}t|jd gd gd ƒ q½t  
dd!d¡}	g d"¢}
t  |	|
¡\}	}
|||fD ])}||	|
ƒ}t |d|	 d|
  ¡ |	dk|	d#k |
dk |
d#k }t|j|ƒ qéd$\‰ ‰‰‡ ‡‡fd%d&„}‡ ‡‡fd'd(„}t  g d)¢¡} t  g d*¢¡}t  g d+¢g d,¢g d-¢g d.¢g d/¢g d0¢g d1¢g d2¢g¡}t | ||¡}|| |ƒ}|| |ƒ}t  
d3d4d5¡}	t  
d3d4d5¡}
t  |	|
¡\}	}
tj	||d6|d7}||	|
ƒ}t|||	|
ƒƒ | | |¡\}}|| |ƒ\}}t||ƒ t||ƒ d8}t  t  
d3d4|d ¡t  
d3d4|d ¡¡\} }|  ¡ } | ¡ }|| |ƒ}tj| |t|d ƒd9}t  t  
d:d;d5¡t  
d:d;d5¡¡\}	}
|	 ¡ }	|
 ¡ }
t ||¡}t 	||¡}tj	||dd}||	|
ƒ}t  ||	|
ƒ| ¡}||fD ]-}t  ||	|
ƒ| ¡}t  |¡dt  |¡ ks6J ‚t  ||¡d<t  ||¡ ksGJ ‚qd S )=NrF   ç®Gáz®ó?ç)\Âõ(@r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÉ   rË   rÌ   rÎ   rÏ   r   rˆ   rZ   Úgeom©Úkindr¥   ç      @ri   )r¥   rn   rÒ   rô   )g      Ð¿rÑ   ç      ü?rÓ   Trõ   )r¥   rn   rÑ   rõ   r   )rï   g)\Âõ(Àç333333ã?c                    s,   ˆ | d d  ˆ|d d   ˆ|  |  S )Nr„   r   r*   r>   ©r   r   r­   r*   r+   ÚquadÛ  s   ,ztest_triinterp.<locals>.quadc                    s0   dˆ  | d  ˆ|  dˆ |d  ˆ|   fS )Nr   r„   r*   r>   r÷   r*   r+   Úgradient_quadÞ  s   0z%test_triinterp.<locals>.gradient_quad)ræ   ç&jjÙZÕ?çœÄ °rhå?rG   rH   rH   rG   )ç333333Ó?çHPüs×é?çX9´Èv¾Û?rG   rG   rH   rH   r   ©r   r   rF   ©rF   r   r   ©rF   r   rE   ©r   rE   r   ©ri   rE   r   ©ri   r   r   ©ri   r   r   rG   rH   rE   Úuser©ró   Údzrd   r   râ   rá   éd   )rI   rJ   rS   rL   rç   rM   r   r   ÚLinearTriInterpolatorÚCubicTriInterpolatorrK   r   r   r   Úmatestr   ÚgradientÚmeshgrid_trianglesÚabsrO   Údot)r(   r)   Úzr   r   rB   Úlinear_interpÚcubic_min_EÚ
cubic_geomrê   rë   ÚinterpÚzsrø   rù   r  Ú
cubic_userÚ	interp_zsÚinterp_dzsdxÚinterp_dzsdyÚdzsdxÚdzsdyÚnÚdiff_linÚ
diff_cubicr*   r÷   r+   Útest_triinterp¬  sš   ý


 
ÿ




,
$

ÿýr   c                  C   sº  ddd„} d\}}d\}}d\}}t  |||ddddg¡}t  |||ddddg¡}t  g d¢g d	¢g d
¢g d¢g d¢g d¢g d¢g d¢g¡}	t |||	¡}
tdƒD ]}t jdt jd}t jdt jd}t jdt jd}t jddgt jd}|d }d|||d f< |dkr‹d||< n|dkr–d||d < n
|dkr d||d < tj|
|d||fd}| |||f|d d …df ƒ | |||f|d d …df ƒ | |||f|d d …df ƒ | ||| d || d fƒ | ||| d || d fƒ | ||| d || d fƒ | ||| | d || | d fƒ | |d| | | d d| | | d fƒ | ||d|  | d |d|  | d fƒ | ||| d|  d || d|  d fƒ qQd S )Nc              	   S   s  d}d}d}|\}}||t  t  ddt j |¡¡  }||t  t  ddt j |¡¡  }	| |g|gƒd }
|  |g|g¡\}}|dur\t|
|d ƒ t|d |d ƒ t|d |d ƒ | ||	ƒ|
 }|  ||	¡\}}|| }|| }t||| ƒ t||| ƒ t||| ƒ dS )	aJ  
        Checks the continuity of interpolator (and its derivatives) near
        location loc. Can check the value at loc itself if *values* is
        provided.

        *interpolator* TriInterpolator
        *loc* location to test (x0, y0)
        *values* (optional) array [z0, dzx0, dzy0] to check the value at *loc*
        é   ç»½×Ùß|Û=g      Y@rG   r   r   Nr   )rI   ÚcosrK   ÚpiÚsinr  r   r   )ÚinterpolatorÚlocÚvaluesÚn_starÚepsilonrŒ   Úloc_xÚloc_yÚstar_xÚstar_yr  ÚdzxÚdzyÚdiff_zÚtab_dzxÚtab_dzyÚdiff_dzxÚdiff_dzyr*   r*   r+   Úcheck_continuity  s&   
""z;test_triinterpcubic_C1_continuity.<locals>.check_continuity)ræ   rü   )rú   rý   )rû   rþ   rG   rH   r   rÿ   r   r  r  r  r  r  r‡   r[   r´   r   r   r   r   r  r  r„   rØ   ç      @g      @rk   )rI   r   r   r   Úrangerç   Úfloat64r  )r6  r£   ÚayÚbxÚbyÚcxÚcyr(   r)   r   rB   Úidofr  r/  r0  r(  Úcaser  r*   r*   r+   Ú!test_triinterpcubic_C1_continuity  sJ   
ÿ

ÿ&..0ärA  c                  C   sb  dd„ } d\}}t jj| ||ƒŽ }| ¡  | ¡ }t|| ƒD ]*}tj|| tjd}d||< t jj	||t || ¡dd\}}t
t ||¡|ƒ qd\}	}
| ||ƒ\}}}}|d	||	k  d	||
k  }|d	||	k  d	||
k  }t ||	|	d	 |
|
d	 gg¡}t ||	d	 |	|
d	 |
gg¡}t |g d
¢g¡}t j ||||| d || d f¡}| ¡  | ¡ }t|| d ƒD ].}tj|| d tjd}d||< t jj	||t || d ¡dd\}}t
t ||¡|ƒ q½tjdtjd}tjg d¢tjd}tjg d¢tjd}d}t j ||||¡}| ¡  | ¡ }t
|tjg d¢g d¢g d¢gtjdƒ d S )Nc                 S   s  ||  }t  t j|t jdt j|d t jdt jd|t jdt j||  t jdt j| |t jdg¡}t  t j|t jdt jd|t jdt j|d t jdt j| |t jdt j||  t jdg¡}t  dt j|t jd t j|d t jd t j|d t jd t j||  t jd t j||  t jd g¡}d||d| d … |d d|…< d|d| d d| d … |d d|…< |||| | | | ffS )zè
        Return the sparse, (n*m, n*m) matrix in coo format resulting from the
        discretisation of the 2-dimensional Poisson equation according to a
        finite difference numerical scheme on a uniform (n, m) grid.
        r´   r   rF   rG   r   Nr   )rI   ÚconcatenaterS   r¶   Úonesr9  )r  ÚmÚlÚrowsÚcolsÚvalsr*   r*   r+   Úpoisson_sparse_matrixe  s&   ""ý""ý((ý"*z<test_triinterpcubic_cg_solver.<locals>.poisson_sparse_matrix)rÈ   rF   r´   rH   r"  )ÚAr   Úx0Útol)rÈ   é1   r   )rH   rH   rH   rH   r   rÕ   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   )rH   re   rG   )re   rH   ç      @)rG   rN  rH   )r   Ú_triinterpolateÚ_Sparse_Matrix_cooÚcompress_cscÚto_denser8  rI   rç   r9  Ú_cgr   r  rB  rC  r   r¶   )rI  r  rD  ÚmatÚ	mat_denseÚitestr   r(   Ú_Úi_zeroÚj_zerorH  rF  rG  Údimr*   r*   r+   Útest_triinterpcubic_cg_solvera  s^   
ÿÿ
ÿ
ÿ
ÿÿÿr[  c                  C   sn  d\} }t  | d|  ddg¡}t  || ddg¡}t jdt jd}g d¢g d¢g}t  dd	g¡}t  dd	t j d
¡D ]z}t  |¡| t  |¡|  }t  |¡ | t  |¡|  }	t 	||	|¡}
tj
|
|dd}tj |¡}| ¡ }t  |d¡d |dd d …f< tdƒD ]}t  |d¡d	|d d …|f   ||d d d …f< q„tt jt  |¡ddt jddgt jdƒ q:d S )N)rG   gË¡E¶óýú?r„   rG   rH   rF   r´   r   rå   r   rÍ   rñ   rò   r   r   r   r‰   )rI   r   rç   r9  rK   r$  r#  r%  r   r   r  rO  Ú_DOF_estimator_geomÚcompute_geom_weightsr{   r8  r   rN   r  )r£   r:  r(   r)   r  r   Úsum_wÚthetaÚx_rotÚy_rotrB   r  Údof_estimatorÚweightsÚitrir*   r*   r+   Ú test_triinterpcubic_geom_weights¯  s(   2ÿõre  c               
   C   sh  d} t  g d¢¡}t  ddddd| dg¡}ddgddgddgddgddgddgg}|D ]}|d | |d |  }|d  | |d |  }||}}d| d	|  }	g d
¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g}
t |||
¡}t  t  |j¡t  |j¡d¡}t  t  |j¡t  |j¡d¡}t  	||¡\}}| 
¡ }| 
¡ }| ¡ ||ƒdk}t jjd| d	|  |d}t ||	¡}t ||	¡}tj||	dd}|||fD ]}|||ƒ}t||ƒ qÓd}|j|df }|j|df }t  |j| |j| d¡}t  |j| |j| d¡}d| d	|  }|||fD ]}|j|||t jdt jd d\}t||ƒ qq+d S )NrG   rÙ   r
   r   r   r   éþÿÿÿrï   rð   r4   rÚ   rÛ   r½   rÜ   rÝ   rÞ   rß   é   r   rñ   rò   rF   rZ   r´   )Ú	tri_index)rI   r   r   r   rK   rN   r(   rO   r)   rJ   rL   rè   Úmar
  r  r   r   Ú_interpolate_multikeysrC  r¶   )rí   rK  Úy0ÚtransformationsÚtransformationr`  ra  r(   r)   r  r   rB   rê   rë   Úmask_outÚ	zs_targetr  r  r  r  r  rd  Úpt1Úpt2r*   r*   r+   Útest_triinterp_colinearÉ  sN   (

ÿ
ÿýàrr  c                  C   sÔ  d} d}d}dd„ }t  |d|¡}t jd|  dt j |  | d	d
}t j|dt jf |dd}|d d …dd d…f  t j|  7  < |t  |¡  ¡ }|t  |¡  ¡ }t 	||¡}|||ƒ}	t  ddd¡}
t  ddd¡}t  
|
|¡\}
}|
 ¡ }
| ¡ }i }tdƒD ]‰}dt j |  | }t  |¡| t  |¡|  }t  |¡ | t  |¡|  }t  |¡|
 t  |¡|  }t  |¡ |
 t  |¡|  }t 	|||j¡}t ||	¡}t ||	¡}tj||	dd}|||dœ}dD ]}|| }|dkrü||
|ƒ||< qê|||ƒ}t ||| ¡ qêqd}dD ]X}|dkr#|| }|}||
 }|}n|}|| }|
}|| }t 	|||j¡}t ||	¡}t ||	¡}tj||	dd}|||dœ}dD ]}|| ||ƒ}t ||| ¡ qSqd S )Nrg  rZ   ç333333Ã?c                 S   óä   t  d|  d| ¡}t  d|  d| ¡}t  |  d | d ¡}t  |  d | d ¡}dt  |d d ¡d  d t  d| ¡ t  |d d ¡d d t  d| ¡  d	| d |d     }t  |¡| t  |¡t  |¡  S ©
Nr„   ræ   r   rZ   r   g      >@ç      @g      &@rm   ©rI   ÚhypotÚarctan2Úexpr#  rO   rN   ©r(   r)   Úr1Útheta1Úr2Útheta2r  r*   r*   r+   r    ó   *&ÿþ"z)test_triinterp_transformations.<locals>.zçffffffî?r   r   F©Úendpoint.r   r‰   ç      ð¿rH   r\   rñ   rò   )ÚlinÚmin_Erñ   g¬Z¤$.Ar>   r(   )rI   rK   r$  ÚrepeatÚnewaxisr#  Úflattenr%  r   r   rJ   rL   r8  r   r
  r  r  r   )Ún_anglesÚn_radiiÚ
min_radiusr  ÚradiiÚanglesrK  rk  Útriang0Úz0Úxs0Úys0Ú	interp_z0Úi_angler_  r(   r)   rê   rë   rB   r  r  r  Ú
dic_interpÚ
interp_keyr  ÚinterpzÚscale_factorÚscaled_axisr*   r*   r+   Útest_triinterp_transformations  s†   
ÿ$
þ
ÿú	
þþìrš  ztri_smooth_contouring.pngTg;ßO—n²?)Úremove_textrL  c                  C   s<  d} d}d}dd„ }t  |d|¡}t jd|  dt j |  | d	d
}t j|dt jf |dd}|d d …dd d…f  t j|  7  < |t  |¡  ¡ }|t  |¡  ¡ }t 	||¡}|||ƒ}	| 
t  ||j jdd||j jdd¡|k ¡ t |¡}
|
j|	dd\}}t  ddd¡}tj|ddd tj|||dd d S )Nrg  rZ   rs  c                 S   rt  ru  rw  r{  r*   r*   r+   r  k  r€  z%test_tri_smooth_contouring.<locals>.zr  r   r   Fr‚  .r   r‰   rF   ©ÚsubdivrG   rH   gš™™™™™™?r„   z0.5)ÚlwÚcolorÚblack)ÚlevelsÚcolors)rI   rK   r$  r‡  rˆ  r#  r‰  r%  r   r   rA   rx  r   r   ÚUniformTriRefinerÚrefine_fieldrS   r‘   ÚtriplotÚ
tricontour)rŠ  r‹  rŒ  r  r  rŽ  rK  rk  r  r  ÚrefinerÚtri_refiÚz_test_refir¡  r*   r*   r+   Útest_tri_smooth_contouringd  s0   ÿ$
ÿþ
rª  ztri_smooth_gradient.pnggZd;ßO·?c                  C   s²  dd„ } d}d}d}t  |d|¡}t jddt j |d	d
}t j|dt jf |dd}|d d …dd d…f  t j| 7  < |t  |¡  ¡ }|t  |¡  ¡ }| ||ƒ}t 	||¡}	|	 
t  ||	j jdd||	j jdd¡|k ¡ t |	¡}
|
j|dd\}}t |	| ¡}| |	j|	j¡\}}t  ||¡}t ¡  t ¡  d¡ tj|	dd t  ddd¡}tjd }tj||||g d¢d tj|	j|	j|| || dddddddd d S ) Nc                 S   sL   | d |d  }t  || ¡}t  |¡| }t  |¡| t  |¡t  |¡  S )zAn electric dipole potential V.r   )rI   ry  r#  rO   rN   )r(   r)   Úr_sqr_  r  r*   r*   r+   Údipole_potential  s   "z2test_tri_smooth_gradient.<locals>.dipole_potentialé   rZ   ræ   r  r   r   Fr‚  .r   r‰   r   rœ  Úequalz0.8)rŸ  rG   rH   g{®Gáz„?Úhot)re   rH   rH   rH   )r¡  ÚcmapÚ
linewidthsru   rc   Úbluegyé&1¬|?rØ   r7  )ÚunitsÚscaleÚzorderrŸ  ÚwidthÚ	headwidthÚ
headlength)rI   rK   r$  r‡  rˆ  r#  r‰  r%  r   r   rA   rx  r   r   r£  r¤  r  r  r(   r)   r‘   r¨   ÚgcaÚ
set_aspectr¥  rS   ÚmplÚ	colormapsr¦  Úquiver)r¬  rŠ  r‹  rŒ  r  rŽ  r(   r)   ÚVrB   r§  r¨  r©  ÚtciÚExÚEyÚE_normr¡  r°  r*   r*   r+   Útest_tri_smooth_gradient‹  sD   $
ÿþ

ÿ
þrÃ  c               
   C   s  t  g d¢¡} t  dddt  d¡ ddg¡}t jg d¢g d¢g d	¢gt jd
}t jg d¢td
}tj| |||d}t |¡}t|j	ddgƒ t|j
ddt j dddt  d¡  t jg|¡ƒ t  g d¢¡} t  g d¢¡}t jg d¢gt jd
}t | ||¡}t |¡}t| 
¡ t  dg¡ƒ d}dd„ }t  dd|d ¡} t  || dƒ|| dƒ¡\} }|  ¡ } | ¡ }tj| |t|d ƒd}t |¡}| d¡}t jdtd
}	g d¢}
d|	|
< t||	ƒ t jdtd
}d|d< | |¡ | d¡}g d¢}d|	|< t||	ƒ d S )N©rG   rH   r„   rG   re   rG   r„   rØ   r„  rH   r   r…   r†   r´   ©FFTr   r   gVÍž^&á?F)Úrescalere   )rG   rH   re   )rH   r7  rv  r‡   c                 S   s   t  | ¡| t  | ¡ S rk   )rI   r  Úsign)r(   r   r*   r*   r+   ÚpowerÜ  s   ztest_tritools.<locals>.powerr¥   r   ræ   é¢   )r   r   r   r   rÍ   rÐ   rÔ   rÕ   é   é   é"   é#   é~   é   éŽ   é   é   é‘   é’   é“   éž   éŸ   é    é¡   TéP   )é,   é-   é>   é?   éN   éO   rÚ  éQ   éR   éS   éb   r:   ét   éu   )rI   r   Úsqrtr¶   Úboolr   r   ÚTriAnalyzerr   Úscale_factorsÚcircle_ratiosri  Úmasked_arrayÚnanrK   rJ   rL   r  Úget_flat_tri_maskrç   r   rA   )r(   r)   r   r   rB   Úanalyserr  rÈ  Ú	mask_flatÚ
verif_maskÚcorners_indexÚcenter_indexr*   r*   r+   Útest_tritoolsÀ  sJ   "

"þ





rô  c                  C   sh  d} d}t  dd| d ¡}t  ||¡\}}| ¡ }| ¡ }t jd| d  td}d|| d d …< tj||t| d ƒ|d}t 	|¡}|j
|d	}|j}|j}	| |d  }
t  dd|
d ¡}t  ||¡\}}| ¡ }| ¡ }t  t  |d
|  d¡t  |d
|	  d¡¡}t|dƒ |j}t j|j|j ddd }t j|j|j ddd }| ¡ }|||ƒ}|j| }t||ƒ t  g d¢¡}t  g d¢¡}t ||g d¢g d¢g¡t ||g d¢g d¢g¡g}t  |d |d ¡}g }tdƒD ]8}t 	|| ¡}|j|dd	\}}t  |j|j|f¡d }|t  |d d …df |d d …df f¡ }||g7 }qðt|d |d ƒ d S )Nr   r   r„  rH   r   r´   Tr   rœ  r×   rˆ   r‰   rØ   ©rG   rH   rG   rH   ©rG   rG   rH   rH   r…   r³   ©r   r   r   rü   r¯   r   )rI   rK   rJ   rL   rç   rè  r   r   r  r£  Úrefine_triangulationr(   r)   ÚisinÚaroundr   r   r{   r   rè   r€   rx  r8  r¤  ÚdstackÚlexsortr   )r  r  r(   r)   r   rB   r§  Úrefi_triangÚx_refiÚy_refiÚn_refiÚx_verifÚy_verifÚind1dÚ	refi_maskÚrefi_tri_barycenter_xÚrefi_tri_barycenter_yÚ
tri_finderÚrefi_tri_indicesÚrefi_tri_maskr  Úxyz_dataÚiÚrefined_triangÚ	refined_zÚxyzr*   r*   r+   Útest_trirefineø  sn   ÿ
ÿ
ÿÿÿÿÿ

ÿ*r  r&  ÚlinearÚcubic)Úidsc                 C   sx   t jd d…d d…f \}}t  | ¡ d¡}t  | ¡ d¡}t  |¡}t ||¡}t |¡}| ||ƒ}|j||dd d S )Nr   )Útriinterpolatorr  )	rI   Úmgridr‡  r‰  Ú
zeros_liker   r   r£  r¤  )r&  r(   r)   r  ry   r§  r  r*   r*   r+   Útest_trirefine_masked0  s   


r  c                 C   s   g }t | d ƒD ]7}t | d ƒD ].}|||   }|d ||   }||d |   }|d |d |   }||||g|||gg7 }qqtj|tjdS )zU
    Return (2*(N-1)**2, 3) array of triangles to mesh (N, N)-point np.meshgrid.
    r   r´   )r8  rI   r   r¶   )r  ry   r  Újr   r   r­   Údr*   r*   r+   r  B  s   ûr  c                  C   sL   t  ¡  ¡ } tjg d¢g d¢g d¢g d¢gd}|  |d¡d us$J dƒ‚d S )Nrõ  rö  r…   r³   r   zb-z(triplot should return the artist it adds)r‘   r¨   r©   r   r   r¥  )r£   rB   r*   r*   r+   Útest_triplot_returnQ  s   þÿr  c            
      C   s¸   t  g d¢g d¢g¡} t  | ¡rJ ‚t j| ddd}t  |¡s!J ‚t  g d¢¡}t  g d¢¡}t ||| ¡}t |||¡}t |¡}t |¡}|jdd	}|jdd	}	t|j|	jƒ d S )
Nr÷  )r   r   r   TÚF)r·   Úorder)gö(\ÂõØ?gáz®Gáâ?g…ëQ¸…Û?g{®GázÔ?)g…ëQ¸þ@@gáz®GA@g¸…ëQA@g×£p=
A@r   rœ  )	rI   r   Ú	isfortranr   r   r£  rø  r   r   )
Ú
triangles1Ú
triangles2r(   r)   Útriang1Útriang2Úrefiner1Úrefiner2Úfine_triang1Úfine_triang2r*   r*   r+   Ú,test_trirefiner_fortran_contiguous_triangles[  s   

r%  c            
      C   sÂ   t  ddd¡} tt jt  | | ¡ƒ\}}||d k|dk @ |dk@ }|| || }}t  d¡}|t  |¡ |t  |¡  }|t  |¡ |t  |¡  }t 	||¡}|j
}d |_|j
}	t||	ƒ d S )Nrf  r   r	  r   g333333ÿ¿g333333ó¿é   )rI   rK   ÚmaprL   rJ   Úradiansr#  r%  r   r   r@   rQ   r   )
Úxir(   r)   Úwr_  Úx1Úy1rB   Úqhull_neighborsÚown_neighborsr*   r*   r+   Útest_qhull_triangle_orientationr  s   
r/  c                  C   sˆ   t  g d¢¡} t  dddt  d¡ ddg¡}t jg d¢g d¢g d	¢gt jd
}t jg d¢td
}tj| |||d}t |¡}| ¡  d S )NrÄ  rG   r„   rØ   r„  rH   r   r…   r†   r´   rÅ  r   )	rI   r   rç  r¶   rè  r   r   ré  Ú_get_compressed_triangulation)r(   r)   r   r   rB   rï  r*   r*   r+   Ú#test_trianalyzer_mismatched_indices‰  s   "
r1  c                  C   sd   g d¢} g d¢}g d¢}t  ¡  t t¡ t  | ||ddg¡ W d   ƒ d S 1 s+w   Y  d S )N)rG   rH   rH   )rG   rG   rH   )ræ   r¯   rö   rH   rG   )r‘   r¨   r0   r<   r=   Útricontourf)r(   r)   r  r*   r*   r+   Ú"test_tricontourf_decreasing_levels–  s   "ÿr3  Úreturnc            	      C   s„  ddl m}  tjtdd tj ¡  W d   ƒ n1 sw   Y  tjtdd tj t 	g ¡t 	dg¡t 	g g¡dddd¡ W d   ƒ n1 sKw   Y  tj	g d	¢tj
d
}tj	g d¢tj
d
}tjtdd tj ||t 	ddgg¡dddd¡ W d   ƒ n1 sˆw   Y  tj	g d¢gtjd
}tjtdd tj |||t 	ddg¡ddd¡ W d   ƒ n1 s»w   Y  tjtdd tj |||dt 	dgg¡dd¡ W d   ƒ n1 sãw   Y  tjtdd tj |||ddt 	dgg¡d¡ W d   ƒ n	1 sw   Y  tj |||dddd¡}tjtdd | g ¡ W d   ƒ n	1 s5w   Y  ddgd fD ] }tjtdd | |¡ W d   ƒ n	1 sZw   Y  q@| t 	dg¡¡ t| ¡ t d¡ƒ | d¡ t| ¡ ddgddgddggƒ tjtdd tj ¡  W d   ƒ n	1 s¡w   Y  tjtdd tj |t 	dg¡¡ W d   ƒ n	1 sÄw   Y  t 	g d¢¡}tj ||¡}tjtdd | dd¡ W d   ƒ n	1 sðw   Y  tjtdd tj ¡  W d   ƒ n	1 sw   Y  tj |¡}tjtdd | t 	dg¡t 	ddg¡¡ W d   ƒ d S 1 s;w   Y  d S )Nr   )Ú_triz1__init__\(\): incompatible constructor arguments.r7   z,x and y must be 1D arrays of the same lengthr   r*   F)r   r   r   r´   r5   z.triangles must be a 2D array of shape \(\?,3\)r   zCmask must be a 1D array with the same length as the triangles arrayz,edges must be a 2D array with shape \(\?,2\)zGneighbors must be a 2D array with the same shape as the triangles arrayr
   zMz must be a 1D array with the same length as the triangulation x and y arraysT)r   r   r   z?z must be a 1D array with the same length as the x and y arraysz(filled contour levels must be increasingz*x and y must be array-like with same shape)Ú
matplotlibr5  r0   r<   r¡   r»  r   r=   rI   r   r9  Úint_Úcalculate_plane_coefficientsrA   r   Ú	get_edgesÚemptyÚTriContourGeneratorÚcreate_filled_contourÚTrapezoidMapTriFinderÚ	find_many)	r5  r(   r)   rì   rB   r   r  Útcgré   r*   r*   r+   Útest_internal_cpp_api   s´   þýÿ(ÿþþ&ýþ$üÿ$þþ$üþüþü€
 þýþýÿþþýÿ $þr@  c                  C   s\   t  g d¢¡} t  g d¢¡}d}t | |¡}t | | || ¡}t|jƒt|jƒks,J ‚d S )N)r   r   r   r   r„   )r   r   r   r   r„   g    _ B)rI   r€   r   r   rM   r   )r(   r)   ÚoffsetrB   Útriang_offsetr*   r*   r+   Útest_qhull_large_offsetû  s   rC  c                  C   sF  g d¢} g d¢}t  | |¡}t ¡  tjtdd t |dddtj	g¡ W d   ƒ n1 s/w   Y  tjtdd t |dddtj	 g¡ W d   ƒ n1 sRw   Y  tjtdd t |dddtj
g¡ W d   ƒ n1 stw   Y  tjtdd t |tjjg d	¢g d
¢d¡ W d   ƒ d S 1 sœw   Y  d S )Nrã   rä   zCz array must not contain non-finite values within the triangulationr7   r   r   r   z9z must not contain masked points within the triangulation)r   r   r   r   )r   r   r   r   r   )r   r   r‘   r¨   r0   r<   r=   r2  rI   Úinfrí  ri  r   )r(   r)   rB   r*   r*   r+   Útest_tricontour_non_finite_z  s    þþþ""þrE  c                  C   sp   g d¢} g d¢}g d¢}t  ¡ \}}| | ||¡}| | ||¡}|j|jks(J ‚| ||¡}|j|jks6J ‚d S )N)rG   r„   rH   )rG   rH   rG   )rH   re   rØ   )r‘   r    r2  r¦  Ú_contour_generator)r(   r)   r  r¢   r£   Útcs1Útcs2Útcs3r*   r*   r+   Útest_tricontourset_reuse  s   rJ  c                 C   sJ   g d¢}g d¢}g d¢g}|   ¡ j|||dd |  ¡ j|||dd d S )Nr4   r5   r   z--)Úls)Ú	linestyle)r    r¥  )Úfig_testÚfig_refr(   r)   Údatar*   r*   r+   Útest_triplot_with_ls,  s
   
rP  c            	      C   sz   g d¢} g d¢}g d¢g}t  ¡ \}}|j| ||dd\}}| ¡ \}}|dgks+J ‚t|ƒdks3J ‚|d |u s;J ‚d S )Nr4   r5   r   Úlabel)rQ  r   r   )r‘   r    r¥  Úget_legend_handles_labelsrM   )	r(   r)   rO  r¢   r£   ÚlinesÚmarkersÚhandlesÚlabelsr*   r*   r+   Útest_triplot_label5  s   
rW  c                  C   s4  g d¢} g d¢}t  | |¡}t ¡ \}}|j|g d¢dgd}| ¡ }t|ƒdks+J ‚ddgddgddgg}t|d j|ƒ t	|d j
g d	¢ƒ t|d jd
d|gƒ |j|g d¢dgd}| ¡ }t|ƒdkskJ ‚ddgddgddgddgddgg}t|d j|ƒ t	|d j
g d¢ƒ t|d  ¡ |gƒ d S )N©r   rF   rF   r   r   ©r   r   rF   rF   r   ©r   r   r   r   r   r„   ©r¡  r   r   r   rj   F)Úclosed_only©r   r   r   r   r   r   ©r   r   r   r   rà  )r   r   r‘   r    r¦  Ú	get_pathsrM   r   Úverticesr   ÚcodesÚto_polygons©r(   r)   rB   rW  r£   ÚcsÚpathsÚexpected_verticesr*   r*   r+   Útest_tricontour_pathA  s(   ÿ"rg  c                  C   sð  g d¢} g d¢}t  | |¡}t ¡ \}}|j|g d¢ddgd}| ¡ }t|ƒdks,J ‚ddgddgddgddgddgg}t|d	 j|ƒ t	|d	 j
g d
¢ƒ t|d	  ¡ |gƒ |j|g d¢ddgd}| ¡ }t|ƒdksqJ ‚dd	gddgd	dgd	d	gdd	gg}t|d	 j|ƒ t	|d	 j
g d
¢ƒ t|d	  ¡ |gƒ |j|g d¢ddgd}| ¡ }t|ƒdks¶J ‚d	d	gdd	gddgd	dgd	d	gddgddgddgddgddgg
}t|d	 j|ƒ t	|d	 j
g d¢ƒ t|d	  ¡ t |dg¡ƒ d S )NrX  rY  r]  r„   rÖ   r[  r   r   r   r^  rZ  r   g      à¿rF   )
r   r   r   r   rà  r   r   r   r   rà  rE   )r   r   r‘   r    r2  r_  rM   r   r`  r   ra  rb  rI   Úsplitrc  r*   r*   r+   Útest_tricontourf_path[  s6   ""ÿ ri  )r4  N)DÚnumpyrI   Únumpy.testingr   r   r   Únumpy.ma.testutilsri  Ú	testutilsr  r0   r6  r»  Úmatplotlib.pyplotÚpyplotr‘   Úmatplotlib.triry   r   Úmatplotlib.pathr   Úmatplotlib.testing.decoratorsr   r   r   r6   r?   rD   rY   rb   rh   r1   r2   rl   rƒ   r™   r¤   r®   r²   rº   rî   r   rA  r[  re  rr  rš  rª  rÃ  rô  r  r
  r  r  r  r  r%  r/  r1  r3  r@  rC  rE  rJ  rP  rW  rg  ri  r*   r*   r*   r+   Ú<module>   s†    *
÷
-


g_VN>]
&
488ÿý



[
