o
    Zh0h_                  
   @   s  d Z ddlZddlmZmZmZ ddlmZ ddl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mZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 i Z9G dd deZ:dd Z;dd Z<dd Z=e<de<de<de<de<de<ddd Z>e<de=ddddd d!d"d# Z?e<d$e=d%d&d'd d!d(d) Z@e<d*d+d, ZAe<d-e<d.e<d/e<d0e<d1e<d2e=d3d4d5d6d7 ZBe<d8e=d9d:d;d<d3d d!d=d> ZCe<d?e=d9d:d;d<d3d@d d!dAdB ZDe<dCdDdE ZEe<dFe=dGd4d5dHdIdJ ZFdKdL ZGe<dMe=dNdOdP ZHe<dQe=dRdSdT ZIe<dUe=dVdWdX ZJe<dYe=dZd[d\d] ZKe<d^e=d_d`dadbdcd&ddde ZLe<dfe=d5dgdhdidjdkdldmdn ZMe<doe=dpdqdr ZNe<dse=dtdudvdwdx ZOe<dye=dzd{d|d} ZPd~d ZQe<de=ddddd ZRe<de=dddddddd ZSdd ZTe<de<de=dddd ZUe<de=dddddd ZVe<de<de=dddd ZWe<de=ddd ZXe<de=ddd ZYe<de=dddd ZZe<de=dddd Z[e<de=dddd Z\e<de=ddddd Z]e<de=ddddÄ Z^dS )zValidate properties expanders.    N)DimensionToken
IdentTokenNumberToken)parse_color   )INITIAL_VALUES   expand_font_variant)InvalidValuesPendingcheck_var_functionget_keywordget_single_keywordsplit_on_comma)&background_attachmentbackground_imagebackground_positionbackground_repeatbackground_sizeblock_ellipsisborder_image_sourceborder_image_sliceborder_image_widthborder_image_outsetborder_image_repeatborder_styleborder_widthboxcolumn_countcolumn_width
flex_basisflex_directionflex_grow_shrink	flex_wrapfont_family	font_sizefont_stretch
font_stylefont_variant_capsfont_weightgap	grid_linegrid_templateline_heightlist_style_imagelist_style_positionlist_style_typemask_border_modeother_colorsoverflow_wraptext_decoration_thicknessvalidate_non_shorthandc                       s(   e Zd ZdZ fddZdd Z  ZS )PendingExpanderz>Expander with validation done when defining calculated values.c                    s   t  ||jd  || _d S )Nname)super__init__keywords	validator)selftokensr<   	__class__ Y/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/css/validation/expanders.pyr:      s   
zPendingExpander.__init__c                 C   sF   |  |D ]\}}|dr| j jd  | }||kr |  S qt)N-r8   )r<   
startswithr;   KeyError)r=   r>   
wanted_keykeyvaluerA   rA   rB   validate!   s   
zPendingExpander.validate)__name__
__module____qualname____doc__r:   rI   __classcell__rA   rA   r?   rB   r7      s    r7   c                    s6   | D ]}t |rt| |  fdd|D   S qdS )z5Return pending expanders when var is found in tokens.c                       i | ]}| qS rA   rA   .0r8   pendingrA   rB   
<dictcomp>0       z_find_var.<locals>.<dictcomp>N)r   r7   )r>   expanderexpanded_namestokenrA   rR   rB   	_find_var*   s   
rY   c                    s    fdd}|S )z1Decorator adding a function to the ``EXPANDERS``.c                    s    t vsJ  | t  < | S )z&Add ``function`` to the ``EXPANDERS``.)	EXPANDERS)functionproperty_namerA   rB   expander_decorator5   s   z$expander.<locals>.expander_decoratorrA   )r]   r^   rA   r\   rB   rV   3   s   rV   c                     s&   | dd|r
J  fdd}|S )zDecorator helping expanders to handle ``inherit`` and ``initial``.

    Wrap an expander so that it does not have to handle the 'inherit' and
    'initial' cases, and can just yield name suffixes. Missing suffixes
    get the initial value.

    wants_base_urlFc                    s    t  fdd  S )z"Decorate the ``wrapped`` expander.c                 3   s$   t j||d}d}t|   dv r fddD }d}n
t| |}|r)d}|s`i }r6| ||}n| |}|D ]"\}}|v sIJ |||v r[td|d d	| d
|||< q=D ]-}|drp| | }	n|}	||v r|| }
|st|
|	|dd\\}	}
nd}
|	|
fV  qbdS )zWrap the expander.r8   base_urlF)inheritinitialc                    rO   rA   rA   rP   keywordrA   rB   rT   S   rU   zjgeneric_expander.<locals>.generic_expander_decorator.<locals>.generic_expander_wrapper.<locals>.<dictcomp>Tzgot multiple rC   z values in a z
 shorthandrequiredrc   N)	functoolspartialr   rY   r   striprD   r6   )r>   r8   ra   rV   skip_validationresultsresultnew_name	new_tokenactual_new_namerH   )rW   generic_expander_wrapperr_   wrappedrd   rB   rq   J   sP   


zVgeneric_expander.<locals>.generic_expander_decorator.<locals>.generic_expander_wrapper)rh   wraps)rr   rW   r_   )rq   rr   rB   generic_expander_decoratorH   s   .z4generic_expander.<locals>.generic_expander_decorator)pop)rW   kwargsru   rA   rt   rB   generic_expander=   s   2rx   zborder-colorzborder-stylezborder-widthmarginpaddingbleedc           
      c   s&   g }dD ](}| d }dkr|| |  q||d|  | ||d   qtjt||d}t| || }rG| E dH  dS t| dkrR| d9 } n(t| dkr]| d9 } nt| d	krk| | d f7 } nt| dkrztd
t|  t	|| D ]\}}	t
|	g||dd\}|V  qdS )z>Expand properties setting a token for the four sides of a box.z-topz-rightz-bottomz-leftrC   Nr`   r      r      %Expected 1 to 4 token components got Trf   )rfindappendrh   ri   expand_four_sidesrY   itemslenr   zipr6   )
r>   r8   ra   rW   suffixirV   rm   expanded_namerX   rA   rA   rB   r   }   s8   	(


r   zborder-radiuszborder-top-left-radiuszborder-top-right-radiuszborder-bottom-right-radiuszborder-bottom-left-radiusT)r_   c           
      c   s,   g  }}g }| D ]&}|j dkr*|jdkr*||u r&|| d kr#td|}q	td|| q	|s8|dd }||fD ]5}t|dkrI|d9 }q<t|d	krT|d	9 }q<t|d
krb||d  q<t|dkrqtdt| q<d}t|t||D ]\}	} d|	 d}t| ||dd || fV  q|dS )z-Validator for the ``border-radius`` property.literal/r}   z"Expected value after "/" separatorzExpected only one "/" separatorNr   r~   r   r   r   )ztop-leftz	top-rightzbottom-rightzbottom-leftzborder-z-radiusTrf   )typerH   r   r   r   r   r6   )
r>   r8   ra   current
horizontalverticalrX   valuescornerscornerrA   rA   rB   border_radius   s>   

r   z
list-style-type	-position-imagec           	      c   s    d }}d}| D ]:}t |dkr|d7 }|}q	t|g|dur%d}d}nt|gdur/d}nt|gdur;d	}d}nt||gfV  q	|sR|rRd	|gfV  |d8 }|s`|r`d|gfV  |d8 }|rdtdS )
zyExpand the ``list-style`` shorthand property.

    See https://www.w3.org/TR/CSS21/generate.html#propdef-list-style

    Fr   noner   Nr   Tr   r   )r   r/   r0   r1   r   )	r>   r8   ra   type_specifiedimage_specified
none_countrX   
none_tokenr   rA   rA   rB   expand_list_style   s6   r   borderc                 c   s,    dD ]}t | || |D ]}|V  qqdS )zlExpand the ``border`` shorthand property.

    See https://www.w3.org/TR/CSS21/box.html#propdef-border

    r|   N)expand_border_side)r>   r8   ra   r   new_proprA   rA   rB   expand_border   s   r   z
border-topzborder-rightzborder-bottomzborder-leftzcolumn-ruleoutline-width-color-stylec                 c   sZ    | D ]'}t |durd}nt|gdurd}nt|gdur"d}nt||gfV  qdS )ztExpand the ``border-*`` shorthand properties.

    See https://www.w3.org/TR/CSS21/box.html#propdef-border-top

    Nr   r   r   )r   r   r   r   )r>   r8   rX   r   rA   rA   rB   r     s   r   zborder-image-outset-repeat-slice-sourcec                 c   s   t | } | rNt| dd |rd| dgfV  n.t| dd rL| dg}| rFt| dd rF|| d | rFt| dd s4d|fV  nt| dd s]t| d dkrH| dg}| rt|| dd  r|| d | rt|| dd  sod|fV  | r| d jdkr| d jd	kr| d nq| st	t
| dd r| dg}| rt
|| dd  r|| d | rt
|| dd  sd
|fV  | r| d jdkr| d jd	kr| d nq| r| d jdkr| d jd	kr| d nt	| st	t| dd rF| dg}| r@t|| dd  r@|| d | r@t|| dd  s*d|fV  nt	t	| sdS dS )z}Expand the ``border-image-*`` shorthand properties.

    See https://drafts.csswg.org/css-backgrounds/#the-border-image

    Nr   r   r   r   fillr   r   r   r   r   )listr   rv   r   r   r   r   r   rH   r   r   r   r>   r8   ra   repeatssliceswidthsoutsetsrA   rA   rB   expand_border_image!  sZ   	"
 
 &r   zmask-border-modec                 c   s   t | } | rft| dd |rd| dgfV  nFt| dd r/d| dgfV  n3t| dd r`| dg}| rYt| dd rY|| d | rYt| dd sGd|fV  nt| dd sqt| d dkr`| dg}| rt|| dd  r|| d | rt|| dd  sd|fV  | r| d jd	kr| d j	d
kr| d nq| st
t| dd r| dg}| rt|| dd  r|| d | rt|| dd  sd|fV  | r| d jd	kr| d j	d
kr| d nq| r| d jd	kr| d j	d
kr| d nt
| s%t
t| dd r^| dg}| rXt|| dd  rX|| d | rXt|| dd  sBd|fV  nt
t
| sdS dS )zvExpand the ``mask-border-*`` shorthand properties.

    See https://drafts.fxtf.org/css-masking/#the-mask-border

    Nr   r   r   r   r   r   r   r   r   r   r   )r   r   rv   r2   r   r   r   r   r   rH   r   r   r   r   rA   rA   rB   expand_mask_bordera  s^   	"
 
&&r   
backgroundc                 #   s   dt | }|dv rD ]}||fV  qdS tjt| d}t| | }r0| E dH  dS d fdd	}tt| }|t|dd	\}}	d
d |	 D }
|D ]} || \}}| D ]\}}|
| 	| q_qS|
 D ]\}}||ddd fV  qpd|fV  dS )zwExpand the ``background`` shorthand property.

    See https://drafts.csswg.org/css-backgrounds-3/#the-background

    )background-colorzbackground-imagezbackground-repeatzbackground-attachmentzbackground-positionzbackground-sizezbackground-clipzbackground-origin)rc   rb   Nr`   Fc                    sV  i   fdd}| d d d } | r|dt | dd  d d d r)| dd = q| dd  }|r=|dt|r=|   q|dt|rK|   q|dt |rX|   q|dt|re|   qd	t|  d  D ]d}| | d  d d d }t|}|d ur|d
|sJ | | d = | r| d jdkr| d j	dkrdt|  d  D ]$}| | d d d d }t
|}|d ur|d|sJ | | d = q nqn|d urq|dt|r|   | dd  }|dt|r|   n|dt| qt dtd }	D ]}
|
 vr%|
dkr%t|
dd d  |
< q|	 fS )Nc                    s.   |d u rdS d|  } |  v rt | | < dS )NFzbackground-Tr   )r8   rH   rl   rA   rB   add  s   
z3expand_background.<locals>.parse_layer.<locals>.addr}   repeatcolorimage
attachment)r~   r   r   r   positionr   r   )r   r   sizeoriginclipr   background_colorrC   _r   )r   single_valuer3   rv   r   r   r   r   r   rH   r   r   r   r   replace)r>   final_layerr   rX   nn_tokensr   r   
next_tokenr   r8   ra   rW   r   rB   parse_layer  sr   




z&expand_background.<locals>.parse_layerT)r   c                 S   s   i | ]\}}||gqS rA   rA   )rQ   rG   rH   rA   rA   rB   rT      s    z%expand_background.<locals>.<dictcomp>r}   r   )F)
r   rh   ri   expand_backgroundrY   r   reversedr   nextr   )r>   r8   ra   re   rV   rm   r   layersr   
last_layerrl   r   layerrH   r   rA   r   rB   r     s2   Dr   ztext-decoration-line
-thicknessc           	      c   s    g }g }g }g }d}| D ]F}t |}|dv r'|| |r t|dkr&d}q|dv r5|r/t|| qt|rC|r=t|| qt|grR|rLt|| qt|r[d|fV  |rbd|fV  |rid|fV  |rrd	|fV  d
S d
S )z2Expand the ``text-decoration`` shorthand property.F)r   	underlineoverlinezline-throughblinkr   T)soliddoubledotteddashedwavyr   r   r   r   N)r   r   r   r   r5   )	r>   r8   liner   style	thicknessnone_in_linerX   re   rA   rA   rB   expand_text_decoration
  sJ   




r   c                 c   sd    t | }|ddd }|dv r|| fV  dS |dkr0t| d j| d jd}||gfV  dS t)zExpand legacy ``page-break-before`` and ``page-break-after`` properties.

    See https://www.w3.org/TR/css-break-3/#page-break-properties

    rC   r   )autoleftrightavoidalwaysr   pageN)r   splitr   source_linesource_columnr   )r>   r8   re   rn   rX   rA   rA   rB   expand_page_break_before_after5  s   r   zpage-break-afterzbreak-afterc                 C   
   t | |S )ztExpand legacy ``page-break-after`` property.

    See https://www.w3.org/TR/css-break-3/#page-break-properties

    r   r>   r8   rA   rA   rB   expand_page_break_afterG     
r   zpage-break-beforezbreak-beforec                 C   r   )zuExpand legacy ``page-break-before`` property.

    See https://www.w3.org/TR/css-break-3/#page-break-properties

    r   r   rA   rA   rB   expand_page_break_beforeR  r   r   zpage-break-insidebreak-insidec                 c   s$    t | }|dv rd| fV  dS t)zyExpand the legacy ``page-break-inside`` property.

    See https://www.w3.org/TR/css-break-3/#page-break-properties

    )r   r   r   N)r   r   r>   r8   re   rA   rA   rB   expand_page_break_inside]  s
   r   columnscolumn-widthcolumn-countc                 c   s    d}t | dkrt| d dkr| ddd } | D ]"}t|gdur*|dkr*d}nt|gdur4d}nt||gfV  qt | dkr_|dkrIdnd}t| d j| d jd}||gfV  dS dS )	z*Expand the ``columns`` shorthand property.Nr   r   r   r}   r   r   r   )r   r   r    r   r   r   r   r   )r>   r8   rX   rA   rA   rB   expand_columnsl  s$   r   zfont-variantz-alternatesz-capsz-east-asianz
-ligaturesz-numericc                 C   s   t | S )zoExpand the ``font-variant`` shorthand property.

    https://www.w3.org/TR/css-fonts-3/#font-variant-prop

    r	   r   rA   rA   rB   font_variant  s   	r   font-variant-caps-weight-stretch-sizeline-height-familyc                 c   s\   t | }|dv rtdtt| } tdD ]A}|  }t|dkr$qt|gdur.d}n t|gdur8d}nt	|gdurBd}nt
|gdurLd	}n n||gfV  | sXtq| s]t|  }t|gdu rjtd
|gfV  | stt|  }|jdkr|jdkr|  }t|gdu rtd|gfV  n| | |   t| du rtd| fV  dS )z_Expand the ``font`` shorthand property.

    https://www.w3.org/TR/css-fonts-3/#font-prop

    )captioniconmenuzmessage-boxzsmall-captionz
status-barzSystem fonts are not supportedr~   normalNr   r   r   r   r   r   r   r   r   )r   r   r   r   rangerv   r   r(   r)   r*   r'   r&   r   rH   r.   r   reverser%   )r>   r8   expand_font_keywordr   rX   r   rA   rA   rB   expand_font  sR   	
r  z	word-wrapoverflow-wrapc                 c   $    t | }|du rtd| fV  dS )zhExpand the ``word-wrap`` legacy property.

    See https://www.w3.org/TR/css-text-3/#overflow-wrap

    Nr  )r4   r   r   rA   rA   rB   expand_word_wrap  s
   r	  flex-grow-shrink-basisc                 c   s   t | }|dkr6| d j| d j}}t||ddd}t||d}d|gfV  d|gfV  d|gfV  dS d\}}}	d	\}
}}| D ]J}|jd
koT|jdkoTt|
|f }|sg|sgt|g}|durg|}	d}qB|
syt	|g}|du rtt
|}d}
qB|st	|g}|du rt
|}d}qBt
| d j| d j}}t| rt|nd}t| rt|nd}t||||t|}t||||t|}|st||dddd}	d|gfV  d|gfV  d|	gfV  dS )zExpand the ``flex`` property.r   r   0r   r  r  r  )r   r   N)FFFnumberNTpx)r   r   r   r   r   r   	int_valueallr!   r#   r   float
is_integerintstrr   )r>   r8   re   r   column
zero_token
auto_tokengrowshrinkbasis
grow_foundshrink_foundbasis_foundrX   forced_flex_factor	new_basisnew_grow
new_shrinkint_grow
int_shrink
grow_tokenshrink_tokenrA   rA   rB   expand_flex  s`   




r(  z	flex-flowflex-direction	flex-wrapc                 c   s    t | dkr:| | ddd fD ]'}t|d g}t|d g}|r7|r7d|d gfV  d|d gfV   dS qtt | dkrht| d g}|rSd| d gfV  dS t| d g}|rfd| d gfV  dS tt)z"Expand the ``flex-flow`` property.r   Nr}   r   r   r)  r*  )r   r"   r$   r   )r>   r8   sorted_tokens	directionwraprA   rA   rB   expand_flex_flow  s(   r.  c           	      c   s(   | d j | d j}}t||d}t| dkr4t| d dkr4d|gfV  d|gfV  d|gfV  d S g g}| D ]}|jdkrK|jdkrK|g  q9|d	 | q9t|d
krt|d }t|d }|r|rd|d fV  d|d fV  d|gfV  d S |d }t	t	t|dkr|g}t	t	)Nr   r   r   -columns-rows-areasr   r   r}   r   )
r   r   r   r   r   r   rH   r   r-   r   )	r>   r8   r   r  r   slash_separatedrX   rowsr   rA   rA   rB   _expand_grid_template;  s:   r4  grid-templater/  r0  r1  c                 c   s    t | |E dH  dS )z&Expand the ``grid-template`` property.N)r4  r   rA   rA   rB   expand_grid_template]  s   r6  gridz-template-columnsz-template-rows-template-areas-auto-columns
-auto-rows
-auto-flowc                 c   sf   | d j | d j}}t||d}t||d}t||d}t||d}z	tt| d}W n	 ty6   Y n)w |D ]\}}	d|dd	  |	fV  q9d
|gfV  d|gfV  d|gfV  dS g g}
| D ]}|jdkrv|jdkrv|
	g  qd|
d	 	| qdt
|
dkrtd}d}g g d}t|
| }|D ]D\} \}}d}| D ]9}t|dkr|s|r||krt|}|}qt|dkr|s|r||krtd}|}q|| d	 kr|	| qtq|st|dkrdnd}|dkr|n|}d|r||fn|ffV  d| dt|| fV  d| d|gfV  d| d|gfV  d| dt|| fV  d|gfV  dS )zExpand the ``grid`` property.r   r   r   rowr  r5  z
-template-rC   r}   r9  r:  r;  Nr   r   r   )r<  r  Fdensez	auto-flowTz-auto-sr8  )r   r   r   tupler4  r   r   r   rH   r   r   r   r   r   )r>   r8   r   r  r   r   r<  templaterG   rH   split_tokensrX   
auto_trackr=  	templatesiterabletracktrack_templatesauto_flow_tokennon_auto_trackauto_track_tokenrA   rA   rB   expand_gridd  st   

rJ  c           
      c   s   g g}| D ]}|j dkr|jdkr|g  q|d | qdt|  kr-|ks0t tg }|D ]} t|  }s>t|| t| V  q4t|j|j	d}t| }dkrt
|d d d d hk}|rnt|d n|f}	||  ||d  |	V  |d  kr|k rn nt
|d d d d hk}|rt|d n|fV  |d  kr|k rn d S t
|d d d d hk}|rt|d n|fV  d S d S )	Nr   r   r}   r   r   r   r   r   )r   rH   r   r   r   r,   r?  r   r   r   set)
r>   
max_number
grid_linesrX   validations
validationr   linescustom_identrH   rA   rA   rB   _expand_grid_column_row_area  s>   


rR  zgrid-columnzgrid-rowz-startz-endc                 c   s4    t | d}t|dD ]\} }d| | fV  qdS )z,Expand the ``grid-[column|row]`` properties.r   )startendrC   NrR  r   )r>   r8   tokens_listsiderA   rA   rB   expand_grid_column_row  s
   
rX  z	grid-areazgrid-row-startzgrid-row-endzgrid-column-startzgrid-column-endc                 c   s8    t | d}d}t||D ]\} }d| | fV  qdS )z"Expand the ``grid-area`` property.r~   )z	row-startzcolumn-startzrow-endz
column-endzgrid-NrU  )r>   r8   rV  sidesrW  rA   rA   rB   expand_grid_area  s   
rZ  zgrid-gapr+   
column-gaprow-gapc                 c   s    t | dkrt| du rtd| fV  d| fV  dS t | dkrNt| dd t| dd }}d||fv r:td| dd fV  d| dd fV  dS t)zExpand the ``gap`` property.r   Nr\  r[  r   r   )r   r+   r   )r>   r8   
column_gaprow_gaprA   rA   rB   
expand_gap  s   
"r_  zgrid-column-gapc                 c   r  )z+Expand legacy ``grid-column-gap`` property.Nr[  r+   r   r   rA   rA   rB   expand_legacy_column_gap  
   ra  zgrid-row-gapc                 c   r  )z(Expand legacy ``grid-row-gap`` property.Nr\  r`  r   rA   rA   rB   expand_legacy_row_gap  rb  rc  zplace-contentzalign-contentzjustify-contentc                 C      t )z&Expand the ``place-content`` property.r   r   rA   rA   rB   expand_place_content     re  zplace-itemszalign-itemszjustify-itemsc                 C   rd  )z$Expand the ``place-items`` property.r   r   rA   rA   rB   expand_place_items  rf  rg  z
place-selfz
align-selfzjustify-selfc                 C   rd  )z#Expand the ``place-self`` property.r   r   rA   rA   rB   expand_place_self  rf  rh  z
line-clamp	max-linescontinueblock-ellipsisc           
      c   s   t | dkrwt| }|dkr:| d j| d j}}t||d}t||d}d|gfV  d|gfV  d|gfV  d	S | d jdkru| d jd	uru| d j| d j}}t||d}t||d
}d| d gfV  d|gfV  d|gfV  d	S tt | dkr| d jdkr| d j}t| d g}	|r|	d	ur| d j| d j}}t||d
}d| d gfV  d|gfV  d| d gfV  d	S ttt)z#Expand the ``line-clamp`` property.r   r   r   r   ri  rj  rk  r  Ndiscardr   )	r   r   r   r   r   r   r  r   r   )
r>   r8   re   r   r  r   r  discard_token	max_linesellipsisrA   rA   rB   expand_line_clamp  s>   
rp  z
text-align-all-lastc                 c   s    t | dkrQt| }|du rt|dkr'| d j| d j}}t||d}n| d }d|gfV  |dkrG| d j| d j}}t||d}n|}d|gfV  dS t)	z#Expand the ``text-align`` property.r   Nzjustify-allr   justifyrq  rS  rr  )r   r   r   r   r   r   )r>   r8   re   r   r  	align_all
align_lastrA   rA   rB   expand_text_align>  s    rv  )_rM   rh   tinycss2.astr   r   r   tinycss2.color4r   
propertiesr   descriptorsr
   utilsr   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/   r0   r1   r2   r3   r4   r5   r6   rZ   r7   rY   rV   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r(  r.  r4  r6  rJ  rR  rX  rZ  r_  ra  rc  re  rg  rh  rp  rv  rA   rA   rA   rB   <module>   s    
	
@$%)

=?
f)		
	F
8"
<
&