o
    Zh0h                    @   sd  d Z ddl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 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! d	Z"e# Z$e# Z%i Z&G d
d deZ'		d~ddZ(dddZ)e( ee dd Z*e(de(de(de(de(de(ddde(de!dd Z+e( e!dd  Z,e( e d!d" Z-e( e d#d$ Z.e(d%e!d&d% Z/e(d'dd(ee!d)d* Z0e(d+dd(e!d,d- Z1e( d.d/ Z2e( ed0d1 Z3e( ed2d3 Z4e( ed4d5 Z5e( ed6d7 Z6e(d8e(d9ee d:d; Z7e( d<d= Z8e(d>e(d?e(d@e(dAdBdC Z9e(dDe(dEe(dFe(dGe(dHdde dIdJ Z:e(dKe(dLe dMdN Z;e( e dOdP Z<e( e dQdR Z=e( e!dSdT Z>e(dUdde dVdW Z?e(dde!dXdY Z@e(dde dZd[ ZAe(dde!d\d] ZBe(d^dde(d_dde(d`dde(dadde!dbdc ZCe(ddddde ZDe(dfe dgdh ZEe(die(dje(dke(dle(dmdde(dne!dodp ZFe(dqdd(e(drdd(e!dsdt ZGe(due(dvdwdx ZHe(dye(dzd{d| ZIe(d}e(d~dd ZJe(de(ddd ZKe( e dd ZLe(dde!dd ZMe(dde dd ZNe( e dd ZOe( e dd ZPe( e dd ZQe( e!dd ZRe(dd(dd ZSe( dd ZTe( dd ZUe( dd ZVdd ZWe(de(de(de(de(de(de(de(de(de!dd ZXe(de(de!dd ZYe(ddde(ddde!dd ZZe(dde dd Z[e( e dd Z\e( dd Z]e(de dd Z^e( edd Z_e( e dd Z`e( e!dd Zae( dd Zbe( e dd Zce( e ddĄ Zde( ddƄ Zee( ddȄ Zfe( e ddʄ Zge( dd̄ Zhe( dd΄ Zie( e!ddЄ Zje( e dd҄ Zke( e ddԄ Zle( e!ddք Zme( e dd؄ Zne(dde!ddڄ Zoe(dۃe(d܃e!ddބ Zpe( e!dd Zqe( e!dd Zre( e dd Zse( e!dd Zte(de(de!dd Zue(de(de(de(de!dd Zve(de(de!dd Zwe( e!dd Zxe( e!dd Zye(de(de!dd Zze(dde!dd Z{e( e dd  Z|e( e dd Z}e( e!dd Z~e( dd Ze( e dd Ze( e d	d
 Ze( e dd Ze( dd Ze( e dd Ze( e!dd Ze( e!dd Ze( e dd Ze( e!dd Ze( e dd Ze( e dd Ze( e dd Ze( e dd  Ze( e!d!d" Ze( e d#d$ Ze(d%e(d&e!d'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Ze(d3e(d4d5d6 Ze( d7d8 Ze(d9e(d:d;d< Ze( d=d> Ze(d?e(d@e(dAe(dBdCdD Ze( e dEdF Ze( dGdH Ze( dIdJ Ze( dKdL Ze( dMdN Ze( dOdP Ze( dQdR Ze( e!dSdT Ze(dde dUdV Ze(dddWdX Ze(dddYdZ Ze(dd[e!d\d] Ze(ddd^e!d_d` Ze( e!dadb Ze(dde!dcdd Ze(dde!dedf Ze(dde!dgdh Ze(dddidj Ze(dd[e!dkdl Ze(dddmdndo Ze(dde!dpdq Ze(dde drds Ze(dde dtdu Ze(dde dvdw Ze(dddmedxdy Ze( dzd{ Ze( e!d|d} ZdS (  z^Validate properties.

See https://www.w3.org/TR/CSS21/propidx.html and various CSS3 modules.

    )inf)parse_component_value_listparse_color   )computed_values)KNOWN_PROPERTIESZERO_PIXELS	Dimension)InvalidValuesPendingcheck_var_functioncomma_separated_list	get_angleget_content_listget_content_list_tokenget_custom_ident	get_imageget_keyword
get_lengthget_resolutionget_single_keywordget_urlparse_2d_positionparse_functionparse_positionremove_whitespacesingle_keywordsingle_tokenz-weasy-c                   @   s   e Zd ZdZdd ZdS )PendingPropertyz>Property with validation done when defining calculated values.c                 C   s   t || jd d S )Nr      )validate_non_shorthandname)selftokens
wanted_key r&   Z/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/css/validation/properties.pyvalidate$   s   zPendingProperty.validateN)__name__
__module____qualname____doc__r(   r&   r&   r&   r'   r   "   s    r   NFc                    s    fdd}|S )u@  Decorator adding a function to the ``PROPERTIES``.

    The name of the property covered by the decorated function is set to
    ``property_name`` if given, or is inferred from the function name
    (replacing underscores by hyphens).

    :param proprietary:
        Proprietary (vendor-specific, non-standard) are prefixed: anchors can
        for example be set using ``-weasy-anchor: attr(id)``.
        See https://www.w3.org/TR/CSS/#proprietary
    :param unstable:
        Mark properties that are defined in specifications that didn't reach
        the Candidate Recommandation stage. They can be used both
        vendor-prefixed or unprefixed.
        See https://www.w3.org/TR/CSS/#unstable-syntax
    :param wants_base_url:
        The function takes the stylesheet’s base URL as an additional
        parameter.

    c                    sj    du r| j dd}n }|tv sJ ||tvsJ || _| t|< r,t| r3t| | S )z'Add ``function`` to the ``PROPERTIES``.N_-)r)   replacer   
PROPERTIESwants_base_urlPROPRIETARYaddUNSTABLE)functionr"   property_nameproprietaryunstabler1   r&   r'   	decorator@   s   

zproperty.<locals>.decoratorr&   )r7   r8   r9   r1   r:   r&   r6   r'   property*   s   r;   c                 C   s   | dr
|| ffS |s|tvrtd|s|tvrtdt| }| D ]}t|r4|t| |ff  S q$t| }|dv r@|}n|jrI|| |}n|| }|du rSt||ffS )z'Validator for non-shorthand properties.z--zunknown propertyzproperty not supported yet)initialinheritN)
startswithr   r   r0   r   r   r   r1   )r$   r"   base_urlrequiredr5   tokenkeywordvaluer&   r&   r'   r!   S   s(   


r!   c                 C      | dv S )z.``background-attachment`` property validation.)scrollfixedlocalr&   rB   r&   r&   r'   background_attachmentr      rI   zbackground-colorzborder-top-colorzborder-right-colorzborder-bottom-colorzborder-left-colorzcolumn-rule-colorT)r9   ztext-decoration-colorc                 C      t | S Nr   rA   r&   r&   r'   other_colorsz   s   	rN   c                 C   s   t | dkrdS t| S )Ninvertcurrentcolor)r   r   rM   r&   r&   r'   outline_color   s   rQ   c                 C   rD   )N)separatecollapser&   rH   r&   r&   r'   border_collapse      rT   c                 C   rD   )z$``empty-cells`` property validation.)showhider&   rH   r&   r&   r'   empty_cells      rX   colorc                 C   s   t | }|dkr
dS |S )z0``*-color`` and ``color`` properties validation.rP   r=   r   )rA   resultr&   r&   r'   rZ      s   zbackground-image)r1   c                 C      t | dkrdS t| |S Nnoner^   Nr   r   rA   r?   r&   r&   r'   background_image      
rb   zlist-style-imagec                 C   sV   t | dkrdS t| |}|r%|d dkr'|d d dkr)d|d d fS dS dS dS )z)``list-style-image`` property validation.r^   r_   r   urlr    externalN)r   r   )rA   r?   
parsed_urlr&   r&   r'   list_style_image   s   
rg   c                 C   s    t | dkr| dd } t| S )z)``transform-origin`` property validation.   Nr   )lenr   r$   r&   r&   r'   transform_origin   s   rk   c                 C   rK   )z,``background-position`` property validation.r   rj   r&   r&   r'   background_position   rY   rm   c                 C   rK   )z(``object-position`` property validation.rl   rj   r&   r&   r'   object_position   rY   rn   c                 C   s`   t tt| }|dkrdS |dkrdS |dv r|d S t|dkr,tdd |D r.|S d	S d	S )
z*``background-repeat`` property validation.)zrepeat-x)repeat	no-repeat)zrepeat-y)rp   ro   ))rp   )ro   )space)roundr   c                 s   s    | ]}|d v V  qdS ))rp   ro   rq   rr   Nr&   ).0kr&   r&   r'   	<genexpr>   s
    
z$background_repeat.<locals>.<genexpr>N)tuplemapr   ri   allr$   keywordsr&   r&   r'   background_repeat   s   r{   c                 C   s   t | dkr)| d }t|}|dv r|S |dkrdS t|ddd}|r'|dfS d
S t | d	krZg }| D ]}t|ddd}|rD|| q3t|dkrO|d q3t |d	kr\t|S d
S d
S )z#Validation for ``background-size``.r    r   )containcoverauto)r~   r~   FTnegative
percentager   N)ri   r   r   appendrv   )r$   rA   rB   lengthvaluesr&   r&   r'   background_size   s0   
r   zbackground-clipzbackground-originc                 C   rD   )z\Validation for the ``<box>`` type used in ``background-clip``
    and ``background-origin``.)
border-boxpadding-boxcontent-boxr&   rH   r&   r&   r'   box   s   r   c                 C   N   dd | D }t |r#t|dkr|d |d fS t|dkr%t|S dS dS )z,Validator for the `border-spacing` property.c                 S      g | ]}t |d dqS Fr   r   rs   rA   r&   r&   r'   
<listcomp>      z"border_spacing.<locals>.<listcomp>r    r   r   Nrx   ri   rv   r$   lengthsr&   r&   r'   border_spacing  s   r   zborder-top-right-radiuszborder-bottom-right-radiuszborder-bottom-left-radiuszborder-top-left-radiusc                 C   r   )z/Validator for the `border-*-radius` properties.c                 S   s   g | ]	}t |d ddqS )FTr   r   r   r&   r&   r'   r     s    z(border_corner_radius.<locals>.<listcomp>r    r   r   Nr   r   r&   r&   r'   border_corner_radius  s   r   zborder-top-stylezborder-right-stylezborder-left-stylezborder-bottom-stylezcolumn-rule-stylec                 C   rD   )z)``border-*-style`` properties validation.)
r^   hiddendotteddasheddoubleinsetoutsetgrooveridgesolidr&   rH   r&   r&   r'   border_style"  s   r   zbreak-beforezbreak-afterc                 C   rD   )z;``break-before`` and ``break-after`` properties validation.)r~   avoid
avoid-pagepageleftrightrectoversoavoid-columncolumnalwaysr&   rH   r&   r&   r'   break_before_after.  rJ   r   c                 C   rD   )z%``break-inside`` property validation.)r~   r   r   r   r&   rH   r&   r&   r'   break_inside7  rY   r   c                 C   rD   )z-``box-decoration-break`` property validation.)slicecloner&   rH   r&   r&   r'   box_decoration_break>  rY   r   c                 C   s,   | j dkr
d| jfS t| }|dv r|S dS )z%``box-ellipsis`` property validation.stringr^   r~   N)typerC   r   rA   rB   r&   r&   r'   block_ellipsisE  s   

r   continuec                 C   rD   )z!``continue`` property validation.)r~   discardr&   rH   r&   r&   r'   	continue_Q  rY   r   c                 C   s<   | j dkr| jd ur| jdkr| jS t| }|dkr|S d S )Nnumberr    r^   r   	int_valuer   r   r&   r&   r'   	max_linesX  s   
r   c                 C   rD   )z%``margin-break`` property validation.)r~   keepr   r&   rH   r&   r&   r'   margin_breakc  rY   r   c                 C   s"   | j dkr| jdkrdS | jS dS )z``page`` property validation.identr~   N)r   lower_valuerC   rM   r&   r&   r'   r   j  s   
r   z
bleed-leftzbleed-rightz	bleed-topzbleed-bottomc                 C   s   t | }|dkr
dS t| S )z``bleed`` property validation.r~   r   r   r   r&   r&   r'   bleedr  s   r   c                 C   st   t | dkrtdd | D }d|v rd|v r|S dS dS t | dkr6t| d }|dv r0|fS |d	kr8d
S dS dS )z``marks`` property validation.r   c                 s       | ]}t |V  qd S rL   r   r   r&   r&   r'   ru         zmarks.<locals>.<genexpr>cropcrossr    r   )r   r   r^   r&   N)ri   rv   r   )r$   rz   rB   r&   r&   r'   marks  s   r   zoutline-stylec                 C   rD   )z(``outline-style`` properties validation.)	r^   r   r   r   r   r   r   r   r   r&   rH   r&   r&   r'   outline_style  rY   r   zborder-top-widthzborder-right-widthzborder-left-widthzborder-bottom-widthzcolumn-rule-widthzoutline-widthc                 C   ,   t | dd}|r
|S t| }|dv r|S dS )z=Border, column rule and outline widths properties validation.Fr   )thinmediumthickNr   r   rA   r   rB   r&   r&   r'   border_width  s   	r   zborder-image-sourcezmask-border-sourcec                 C   r\   r]   r`   ra   r&   r&   r'   border_image_source  rc   r   zborder-image-slicezmask-border-slicec                 C   s   g }d}t | D ]H\}}|jdkr |jdkr |t|jd q|jdkr4|jdkr4|t|jd  qt|dkrN|sN|dt| d fv rNd}|d q d S dt|t|   krdd	krgt|S  d S d S )
NFr   r   %r   fillr    T   )		enumerater   rC   r   r
   r   ri   intrv   )r$   r   r   irA   r&   r&   r'   border_image_slice  s   $
r   zborder-image-widthzmask-border-widthc                 C   s   g }| D ]3}t |dkr|d q|jdkr&|jdkr&|t|jd  qt|ddd }r5|| q d S dt|  krGdkrJt|S  d S d S )	Nr~   r   r   FTr   r    r   )r   r   r   rC   r
   r   ri   rv   r$   r   rA   r   r&   r&   r'   border_image_width  s   
r   zborder-image-outsetzmask-border-outsetc                 C   s~   g }| D ]&}|j dkr|jdkr|t|jd  qt|dd }r(|| q d S dt|  kr:dkr=t|S  d S d S )Nr   r   Fr   r    r   )r   rC   r   r
   r   ri   rv   r   r&   r&   r'   border_image_outset  s   
r   zborder-image-repeatzmask-border-repeatc                 C   sL   dt |   krdkr"n d S tdd | D }t|h dkr$|S d S d S )Nr    r   c                 s   r   rL   r   r   r&   r&   r'   ru     r   z&border_image_repeat.<locals>.<genexpr>>   rr   rq   ro   stretch)ri   rv   setry   r&   r&   r'   border_image_repeat  s   r   c                 C   rD   )N)	luminancealphar&   rH   r&   r&   r'   mask_border_mode  rU   r   c                 C   s,   t | dd}|r
|S t| }|dkr|S dS )z%``column-width`` property validation.Fr   r~   Nr   r   r&   r&   r'   column_width  s   r   c                 C   rD   )z$``column-span`` property validation.)rx   r^   r&   rH   r&   r&   r'   column_span  rY   r   c                 C   rD   )z7Validation for the ``box-sizing`` property from css3-ui)r   r   r   r&   rH   r&   r&   r'   
box_sizing  rY   r   c                 C   rD   )z'``caption-side`` properties validation.)topbottomr&   rH   r&   r&   r'   caption_side  rY   r   c                 C   rD   )z``clear`` property validation.)r   r   bothr^   r&   rH   r&   r&   r'   clear  rY   r   c                 C   s   t | }|r<|\}}|dkr<t|dkr<g }|D ]}t|dkr&|d qt|}|r1|| qt|dkr<t|S t| dkrDdS dS )z%Validation for the ``clip`` property.rectr   r~   r&   N)r   ri   r   r   r   rv   )rA   r5   r"   argsr   argr   r&   r&   r'   clip!  s"   
r   c                 C   s   t | } g }| r>t| dkr;| d jdkr;| d jdkr;| d | dd }} t||p0t||}|r9|| ndS n| st| dkrFdS t| dkrg| d jd	krg| d
 jdkrg| d
 jdkrg| dd
 } t| }|dv rr|fS t| |S )z ``content`` property validation.r   r    literal,r   Nrh   r   /normalr^   )	listri   r   rC   r   r   r   r   r   )r$   r?   parsed_tokensrA   parsed_tokenrB   r&   r&   r'   content7  s,   
r   c                 C      t | ddS )z*``counter-increment`` property validation.r    default_integercounterrj   r&   r&   r'   counter_incrementU     r   c                 C   r   )z&``counter-reset`` property validation.r   r   r   rj   r&   r&   r'   counter_reset[  r   r   c                 C   r   )z$``counter-set`` property validation.r   r   r   rj   r&   r&   r'   counter_seta  r   r   c                 C   s   t | dkrdS t| } t| d}|sJ dg }|dur[|jdkr$dS |j}|dv r2td| t| d}|durN|jdkrN|jdurN|j}t| d}n|}|||f |dust|S )	zB``counter-increment`` and ``counter-reset`` properties validation.r^   r&   Nzgot an empty token listr   )r^   r<   r=   zInvalid counter name: r   )	r   iternextr   rC   r   r   r   rv   )r$   r   rA   resultscounter_nameintegerr&   r&   r'   r   g  s*   


r   r   r   r   r   z
margin-topzmargin-rightzmargin-bottomzmargin-leftztext-underline-offsetc                 C   s(   t | dd}|r
|S t| dkrdS dS )z5``margin-*`` and various other properties validation.Tr   r~   Nr   rA   r   r&   r&   r'   lenght_precentage_or_auto  s   r  heightwidthc                 C   s*   t | ddd}|r|S t| dkrdS dS )z7Validation for the ``width`` and ``height`` properties.FTr   r~   Nr   r  r&   r&   r'   width_height  s   r  z
column-gapzrow-gapc                 C   s.   t | ddd}|r|S t| }|dkr|S dS )z=Validation for the ``column-gap`` and ``row-gap`` properties.TF)r   r   r   Nr   r   r&   r&   r'   gap  s   r  c                 C   rD   )z$``column-fill`` property validation.)r~   balancer&   rH   r&   r&   r'   column_fill  rY   r  c                 C   rD   )z"``direction`` property validation.)ltrrtlr&   rH   r&   r&   r'   	direction  rY   r  c                 C   s   | D ]
}|j dkr dS qt| dkr0| d j}|dv r|fS |dv r*t|dS |dkr0d	S d } }}| D ]+}|j}|d
v rI|rF dS |}q8|dv rU|rR dS |}q8|dkra|r^ dS |}q8 dS |pgd}|pkd}|ry|dv rw|||fS dS ||fS )z ``display`` property validation.r   Nr    r   )	r^   ztable-captionztable-row-groupz
table-cellztable-header-groupztable-footer-groupz	table-rowztable-column-groupztable-column)zinline-tablezinline-flexzinline-gridr.   zinline-block)inline	flow-root)blockr  )flowr  tableflexgridz	list-itemr  r  )r  r  )r   ri   rC   rv   split)r$   rA   rC   outsideinside	list_itemr&   r&   r'   display  sF   


r  floatc                 C   rD   )z``float`` property validation.)r   r   footnoter^   r&   rH   r&   r&   r'   float_  rY   r   c                 C   sV   t | dkr| d jdkr| d jS | r'tdd | D r)ddd | D S dS dS )	z$``font-family`` property validation.r    r   r   c                 s       | ]}|j d kV  qdS )r   Nr   r   r&   r&   r'   ru         zfont_family.<locals>.<genexpr> c                 s       | ]}|j V  qd S rL   rC   r   r&   r&   r'   ru         N)ri   r   rC   rx   joinrj   r&   r&   r'   font_family  s
   
r)  c                 C   rD   )N)r~   r   r^   r&   rH   r&   r&   r'   font_kerning  rU   r*  c                 C   s(   t | }|dkr
|S | jdkr| jS d S )Nr   r   r   r   rC   r   r&   r&   r'   font_language_override  s   
r,  c                    s   t | dkrt| d }|dv r|S g d}g }|D ]}|| q| D ]1  jdkr. d S  j|v rSt fdd|D }tfdd|D rL d S  j q$ d S r\tS d S )	Nr    r   r   ))zcommon-ligatureszno-common-ligatures)zhistorical-ligatureszno-historical-ligatures)zdiscretionary-ligatureszno-discretionary-ligatures)
contextualzno-contextualr   c                 3       | ]
} j |v r|V  qd S rL   r&  rs   couplerM   r&   r'   ru         z)font_variant_ligatures.<locals>.<genexpr>c                 3       | ]}| v V  qd S rL   r&   rs   rC   r   r&   r'   ru   !  r   	ri   r   extendr   rC   r  anyr   rv   r$   rB   couples
all_valuesr0  concurrent_valuesr&   rA   r   r'   font_variant_ligatures  .   

r=  c                 C   rD   )N)r   subsuperr&   rH   r&   r&   r'   font_variant_position+  rU   rA  c                 C   rD   )N)r   z
small-capszall-small-capszpetite-capszall-petite-capsunicaseztitling-capsr&   rH   r&   r&   r'   font_variant_caps1  rU   rC  c                       t | dkrt| d }|dkr|S g d}g }|D ]}|| q| D ]1  jdkr. d S  j|v rSt fdd|D }tfdd|D rL d S  j q$ d S r\tS d S )	Nr    r   r   ))zlining-numszoldstyle-nums)zproportional-numsztabular-nums)zdiagonal-fractionszstacked-fractions)ordinal)zslashed-zeror   c                 3   r.  rL   r&  r/  rM   r&   r'   ru   L  r1  z'font_variant_numeric.<locals>.<genexpr>c                 3   r2  rL   r&   r3  r4  r&   r'   ru   N  r   r5  r8  r&   r<  r'   font_variant_numeric9  r>  rF  c                 C   4   t | dkrt| d dkrdS tdd }|| S )z.``font-feature-settings`` property validation.r    r   r   c                 S   s   d\}}t | dkr7| d d | d } }|jdkr$ddd|j}n|jdkr6|jd ur6|jdkr6|j}nt | dkr?d}t | dkra| \}|jd	krat |jd
kratdd |jD ra|j}|d urm|d uro||fS d S d S )NNNr   r   r   r    r   )onoffr   r   r   c                 s   s,    | ]}d t |  kodkn  V  qdS )       N)ord)rs   letterr&   r&   r'   ru   o  s   * zLfont_feature_settings.<locals>.font_feature_settings_list.<locals>.<genexpr>)ri   r   getrC   r   rx   )r$   featurerC   rA   r&   r&   r'   font_feature_settings_list^  s&   

z9font_feature_settings.<locals>.font_feature_settings_listri   r   r   )r$   rQ  r&   r&   r'   font_feature_settingsX  s
   
rS  c                 C   rD   )N)r   zhistorical-formsr&   rH   r&   r&   r'   font_variant_alternatesx  rJ   rT  c                    rD  )	Nr    r   r   ))jis78jis83jis90jis04
simplifiedtraditional)
full-widthzproportional-width)rubyr   c                 3   r.  rL   r&  r/  rM   r&   r'   ru     r1  z*font_variant_east_asian.<locals>.<genexpr>c                 3   r2  rL   r&   r3  r4  r&   r'   ru     r   r5  r8  r&   r<  r'   font_variant_east_asian  s.   

r]  c                 C   rG  )z0``font-variation-settings`` property validation.r    r   r   c                 S   s@   t | dkr| \}}|jdkr|jdkr|j|jfS d S d S d S )Nr   r   r   )ri   r   rC   )r$   keyrC   r&   r&   r'   font_variation_settings_list  s   z=font_variation_settings.<locals>.font_variation_settings_listrR  )r$   r_  r&   r&   r'   font_variation_settings  s
   
r`  c                 C   s<   t | ddd}|r|S t| }|dv r|S |tjv r|S dS )z"``font-size`` property validation.FTr   )smallerlargerN)r   r   r   FONT_SIZE_KEYWORDS)rA   r   font_size_keywordr&   r&   r'   	font_size  s   
re  c                 C   rD   )z#``font-style`` property validation.)r   italicobliquer&   rH   r&   r&   r'   
font_style  rY   rh  c                 C   rD   )z-Validation for the ``font-stretch`` property.)	zultra-condensedzextra-condensed	condensedzsemi-condensedr   zsemi-expandedexpandedzextra-expandedzultra-expandedr&   rH   r&   r&   r'   font_stretch  rY   rk  c                 C   sD   t | }|dv r
|S | jdkr| jdur| jdv r | jS dS dS dS )z$``font-weight`` property validation.)r   boldbolderlighterr   N)	d      i,  i  i  iX  i  i   i  r   r   r   r   r&   r&   r'   font_weight  s   
rr  c                 C   rD   )N)r   r|   r}   r^   z
scale-downr&   rH   r&   r&   r'   
object_fit  s   rs  c                 C   rK   rL   )r   rM   r&   r&   r'   image_resolution  rY   rt  zletter-spacingzword-spacingc                 C   s$   t | dkrdS t| }|r|S dS )z7Validation for ``letter-spacing`` and ``word-spacing``.r   Nr   r  r&   r&   r'   spacing  s   ru  c                 C   s   t | }|r|S dS )z"Validation for ``outline-offset``.Nr   r  r&   r&   r'   outline_offset  s   rv  c                 C   st   t | dkrdS | jdkr| jdkrt| jdS | jdkr(| jdkr(t| jdS | jdkr6| jdkr8t| S dS dS )z$``line-height`` property validation.r   r   r   Nr   r   	dimension)r   r   rC   r
   r   rM   r&   r&   r'   line_height  s   rx  c                 C   rD   )z,``list-style-position`` property validation.)r  r  r&   rH   r&   r&   r'   list_style_position  rY   ry  c                 C   s  | j dkr| jS | j dkrd| jfS | j dkr| jdkrd}t| j}t|dkrg }|d j dkrF|d j|v rDd}||d j n	dS |d	 d}t||d k rWdS t|t|D ]}|| j dkrj dS ||| j q^|d d
v rt|dk rdS dt|fS dS dS dS )z(``list-style-type`` property validation.r   r   r5   symbols)cyclicnumeric
alphabeticsymbolicrF   r    r   Nr~  )r}  r|  rh   z	symbols())	r   rC   r"   r   	argumentsri   r   rangerv   )rA   allowed_typesfunction_argumentsr  indexr   r&   r&   r'   list_style_type  s8   




r  z	min-widthz
min-heightc                 C   s   t | }|dkr
|S t| gS )z7``min-width`` and ``min-height`` properties validation.r~   )r   length_or_precentager   r&   r&   r'   min_width_height6  s   
r  zpadding-topzpadding-rightzpadding-bottomzpadding-leftc                 C   s   t | ddd}|r|S dS )z$``padding-*`` properties validation.FTr   Nr   r  r&   r&   r'   r  C  s   r  z	max-widthz
max-heightc                 C   s0   t | ddd}|r|S t| dkrttdS dS )z'Validation for max-width and max-heightFTr   r^   pxN)r   r   r
   r   r  r&   r&   r'   max_width_heightO  s   
r  c                 C   s@   | j dkrtdtd| jS | j dkrtdtd| jd S dS )z(Validation for the ``opacity`` property.r   r    r   r   ro  N)r   minmaxrC   rM   r&   r&   r'   opacity[  s
   

r  c                 C   s2   t | dkrdS | jdkr| jdur| jS dS dS )z(Validation for the ``z-index`` property.r~   r   Nrq  rM   r&   r&   r'   z_indexe  s
   r  orphanswidowsc                 C   s2   | j dkr| jdur| j}|dkr|S dS dS dS )z9Validation for the ``orphans`` and ``widows`` properties.r   Nr    r   r   rA   rC   r&   r&   r'   orphans_widowso  s   r  c                 C   s:   | j dkr| jdur| j}|dkr|S t| dkrdS dS )z-Validation for the ``column-count`` property.r   Nr    r~   r   r  r&   r&   r'   column_countz  s   r  c                 C   rD   )z)Validation for the ``overflow`` property.)r~   visibler   rE   r&   rH   r&   r&   r'   overflow  rY   r  c                 C   rD   )z.Validation for the ``text-overflow`` property.)r   ellipsisr&   rH   r&   r&   r'   text_overflow  rY   r  c                 C   s\   | j dkr!| jdkr!t| jdkr!| jd j dkr!d| jd jfS t| g}|dv r,|S dS )	z!``position`` property validation.r5   runningr    r   r   z	running())staticrelativeabsoluterF   N)r   r"   ri   r  rC   r   r   r&   r&   r'   position  s   
r  c                 C   s   t | dkrt| d  }dv r|S | r<t | d dkr>tdd | D r@tdd | D }|ddd |ddd fS dS dS dS )	z``quotes`` property validation.r    r   )r~   r^   r   c                 s   r!  )r   Nr"  r   r&   r&   r'   ru     r#  zquotes.<locals>.<genexpr>c                 s   r%  rL   r&  r   r&   r&   r'   ru     r'  N)ri   r   rx   rv   )r$   rB   stringsr&   r&   r'   quotes  s   r  c                 C      | dv r| S dS )z,Validation for the ``table-layout`` property)rF   r~   Nr&   rH   r&   r&   r'   table_layout     r  c                 C   rD   )z'``text-align-all`` property validation.)r   r   centerjustifystartendr&   rH   r&   r&   r'   text_align_all  rY   r  c                 C   rD   )z(``text-align-last`` property validation.)r~   r   r   r  r  r  r  r&   rH   r&   r&   r'   text_align_last  rY   r  c                 C   sJ   dd | D }|dhkrdS h d}t | t |kr!||r#|S dS dS )z-``text-decoration-line`` property validation.c                 S   s   h | ]}t |qS r&   r   r   r&   r&   r'   	<setcomp>      z'text_decoration_line.<locals>.<setcomp>r^   >   line-throughblinkoverline	underlineN)ri   issubset)r$   rz   allowed_valuesr&   r&   r'   text_decoration_line  s   
r  c                 C   r  )z.``text-decoration-style`` property validation.)r   r   r   r   wavyNr&   rH   r&   r&   r'   text_decoration_style  r  r  c                 C   s,   t | dd}|r
|S t| dv  }r|S dS )z2``text-decoration-thickness`` property validation.Tr  )r~   z	from-fontNr   r   r&   r&   r'   text_decoration_thickness  s   r  c                 C   s   t | dd}|r
|S dS )z$``text-indent`` property validation.Tr  Nr   r  r&   r&   r'   text_indent  s   r  c                 C   rD   )z#``text-align`` property validation.)r^   	uppercase	lowercase
capitalizer[  r&   rH   r&   r&   r'   text_transform  rY   r  c                 C   r   )z.Validation for the ``vertical-align`` propertyTr  )baselinemiddler?  r@  ztext-topztext-bottomr   r   Nr   r   r&   r&   r'   vertical_align  s   r  c                 C   rD   )$``white-space`` property validation.)r  r   rS   r&   rH   r&   r&   r'   
visibility  rY   r  c                 C   rD   )r  )r   prenowrapzpre-wrapzpre-liner&   rH   r&   r&   r'   white_space  rY   r  c                 C   rD   )z&``overflow-wrap`` property validation.)anywherer   z
break-wordr&   rH   r&   r&   r'   overflow_wrap  rY   r  c                 C   rD   )z#``word-break`` property validation.)r   z	break-allr&   rH   r&   r&   r'   
word_break  rY   r  c                 C   s*   t | g}|dur|S t| dkrdS dS )z#``flex-basis`` property validation.Nr   )r  r   )rA   basisr&   r&   r'   
flex_basis  s   
r  c                 C   rD   )z'``flex-direction`` property validation.)rowzrow-reverser   zcolumn-reverser&   rH   r&   r&   r'   flex_direction(  rY   r  z	flex-growzflex-shrinkc                 C   s   | j dkr| jS d S Nr   )r   rC   rM   r&   r&   r'   flex_grow_shrink/  s   
r  c                 C   s6   t | }|dv r
|S |rdS t| ddd}|r|S dS )zParse ``inflexible-breadth``.)r~   min-contentmax-contentNFTr   r   )rA   rB   r   r&   r&   r'   _inflexible_breadth7  s   r  c                 C   s4   | j dkr| jdkr| jdkrt| j| jS t| S )zParse ``track-breadth``.rw  r   fr)r   rC   unitr
   r  rM   r&   r&   r'   _track_breadthC  s   r  c                 C   s   t | }|r|S t| }|rP|\}}|dkr7t|dkr1t|d }t |d }|r3|r5d||fS dS dS dS |dkrRt|dkrTt|d ddd	}|rVd
|fS dS dS dS dS )zParse ``track-size``.minmaxr   r   r    minmax()zfit-contentFTr   zfit-content()N)r  r   ri   r  r   )rA   track_breadthr5   r"   r   inflexible_breadthr   r&   r&   r'   _track_sizeJ  s.   
r  c                 C   s   t | ddd}|r|S t| }|rU|\}}|dkrWt|dkrYt |d ddd}|r7t|d }|r7d||fS t|d }|d	v sC|r]t |d ddd}|r[d|pR||fS d
S d
S d
S d
S d
S )zParse ``fixed-size``.FTr   r  r   r   r    r  )r  r  r~   N)r   r   ri   r  r   )rA   r   r5   r"   r   r  rB   fixed_breadthr&   r&   r'   _fixed_size_  s.   


r  c                 C   sN   g }| j dkr%| jD ]}|j dkr||j q
|j dkr  dS q
t|S dS )zParse ``line-names``.z[] blockr   
whitespaceN)r   r   r   rC   rv   )r   return_line_namesrA   r&   r&   r'   _line_namesu  s   



r  zgrid-auto-columnszgrid-auto-rowsc                 C   s2   g }| D ]}t |}|r|| q dS t|S )zC``grid-auto-columns`` and ``grid-auto-rows`` properties validation.N)r  r   rv   )r$   return_tokensrA   
track_sizer&   r&   r'   	grid_auto  s   
r  c                 C   s   t | dkrt| d }|dv r|fS |dkr|dfS d
S t | dkr:dd | D }d|v r<d|v s6d	|v r>t|S d
S d
S d
S )z'``grid-auto-flow`` property validation.r    r   )r  r   denser  r   c                 S      g | ]}t |qS r&   r   r   r&   r&   r'   r     r  z"grid_auto_flow.<locals>.<listcomp>r   Nri   r   rv   r$   rB   rz   r&   r&   r'   grid_auto_flow  s   r  zgrid-template-columnszgrid-template-rowsc                 C   s  g }t | dkrt| d dkrdS t| d dkr|d g }| dd D ]p}t|}|dur7|| q't|}|r|\}}|dkrt |dkr|d jdkrd|d jrd|d jdkrd|d j}nt|d d	krod	}n dS g }	|dd D ]}
t|
}|dur|	| qz|d
|t	|	f q' dS |t	| t	|S d}d}d}| D ]
}t|}|dur|r dS d}|| qt
|}|r|s|d d}|| qt|}|r|s|d d}|| d}qt|}|r|\}}|dkrt |dkr|d jdkr"|d jr"|d jdkr"|d j}nt|d dv r9|r1 dS |d j}d}n dS g }d}|dd D ]P}
t|
}|dura|rX  dS || d}qFt
|
}|ry|sp|d d}|| qFt|
}|rd}|s|d d}|| qF  dS |s|d d}|s|d |d
|t	|f q dS |r|rdS |s|d t	|S )z@``grid-template-columns`` and ``grid-template-rows`` validation.r    r   r^   subgridNro   r   r   	auto-fillzrepeat()FTr&   )r  zauto-fit)ri   r   r   r  r   r   
is_integerrC   r   rv   r  r  )r$   r  subgrid_tokensrA   
line_namesr5   r"   r   r   line_names_listr   includes_auto_repeatincludes_tracklast_is_line_name
fixed_sizer  names_and_sizesrepeat_last_is_line_namer&   r&   r'   grid_template  s   


T















r  c                 C   s  t | dkrt| d dkrdS g }| D ]R}|jdkr dS t|j}g }d}|D ]0}|jdkr9||j d}q)|jdkrN|jd	krN|rFq)|d d
}q)|jdkrVd}q)  dS |s_ dS |t| qt tdd |D dkrt }t }t|D ]\}	}t|D ]w\}
}|
|	f|v s|du rq||v r  dS |	| |	|
|	f |
}t||
d d |
d dD ]\}}||kr n|	||	f q|d7 }t||	d d |	d dD ]\}}t||
| |hkrt
|
|D ]	}|	||f qq qqt|S dS )z,``grid-template-areas`` property validation.r    r   r^   r   NFr   r   .Tr  c                 s   r   rL   )ri   )rs   r  r&   r&   r'   ru   5  r   z&grid_template_areas.<locals>.<genexpr>)r  )ri   r   r   r   rC   r   rv   r   r   r3   r  )r$   
grid_areasrA   component_valuesr  last_is_dotrC   coordinatesareasyxareanxnareanynrownnxr&   r&   r'   grid_template_areas  sf   





$$r  zgrid-row-startzgrid-row-endzgrid-column-startzgrid-column-endc                 C   s6  t | dkr5| d }t| }r"|dkr|S |dkr dd|jfS dS |jdkr3|jr3|jr3d|jdfS dS d } }}| D ]?}t| }rg|dkrL dS |dkrZ|du rWd}q= dS |rd|du rd|j}q= dS |jdkrz|jrz|jrz|du rz|j}q= dS |r|r|dk rdS |s|r|||fS dS |r|||fS dS )u:   ``grid-[row|column]-[start—end]`` properties validation.r    r   r~   spanNr   )ri   r   rC   r   r  r   )r$   rA   rB   r   r   r  r&   r&   r'   	grid_lineQ  sN   

r  c                 C   rD   )z"``flex-wrap`` property validation.)r  wrapzwrap-reverser&   rH   r&   r&   r'   	flex_wrap{  rY   r   c                 C   sp   t | dkrt| d }|dv r|fS d	S t | dkr2tdd | D }|d dv r4|d dv r6|S d	S d	S d	S )
z(``justify-content`` property validation.r    r   )r  space-betweenspace-aroundspace-evenlyr   r   
flex-startflex-endr  r  r   r   r   c                 s   r   rL   r   r   r&   r&   r'   ru     r   z"justify_content.<locals>.<genexpr>safeunsafe)r  r  r  r  r  r   r   Nr  r  r&   r&   r'   justify_content  s   r	  c                 C   s   t | dkrt| d }|dv r|fS |dkrd|fS dS t | dkrZtdd | D }|d d	v r<|d d
v r:|S dS d|v rLd|v sHd|v rJ|S dS d|v r\t|h d@ r^|S dS dS dS )z&``justify-items`` property validation.r    r   )r   r   r  r  r  
self-startself-endr  r  r   r   legacyr  firstr   c                 s   r   rL   r   r   r&   r&   r'   ru     r   z justify_items.<locals>.<genexpr>r  	r  r  r  r
  r  r  r  r   r   lastr  >   r   r   r  N)ri   r   rv   r   r  r&   r&   r'   justify_items  s.   
r  c                 C      t | dkrt| d }|dv r|fS |dkrd|fS dS t | dkrJtdd | D }|d d	v r<|d d
v r:|S dS d|v rLd|v sHd|v rN|S dS dS dS )z%``justify-self`` property validation.r    r   )r~   r   r   r  r  r  r
  r  r  r  r   r   r  r  r   c                 s   r   rL   r   r   r&   r&   r'   ru     r   zjustify_self.<locals>.<genexpr>r  r  r  Nr  r  r&   r&   r'   justify_self  s&   r  c                 C   r  )z$``align-items`` property validation.r    r   )	r   r   r  r  r  r
  r  r  r  r  r  r   c                 s   r   rL   r   r   r&   r&   r'   ru     r   zalign_items.<locals>.<genexpr>r  r  r  r  r
  r  r  r  r  Nr  r  r&   r&   r'   align_items  &   r  c                 C   r  )z#``align-self`` property validation.r    r   )
r~   r   r   r  r  r  r
  r  r  r  r  r  r   c                 s   r   rL   r   r   r&   r&   r'   ru     r   zalign_self.<locals>.<genexpr>r  r  r  Nr  r  r&   r&   r'   
align_self  r  r  c                 C   r  )z&``align-content`` property validation.r    r   )
r  r  r  r  r   r   r  r  r  r  r  r  r   c                 s   r   rL   r   r   r&   r&   r'   ru     r   z align_content.<locals>.<genexpr>r  )r  r  r  r  r  r  Nr  r  r&   r&   r'   align_content  s&   r  c                 C   s"   | j dkr| jd ur| jS d S d S r  r  rM   r&   r&   r'   order  s   r  c                 C   rD   )z#Validation for ``image-rendering``.)r~   zcrisp-edges	pixelatedr&   rH   r&   r&   r'   image_rendering  rY   r  c                 C   s   t | }|dv r
|S d\}}| D ]#}t|}|dkr$|dur! dS d}q|du r1t|}|dur1q dS |du r:dn|}|du rBdn|}||fS )z%Validation for ``image-orientation``.)r^   z
from-imagerH  flipNTr   F)r   r   r   )r$   rB   angler  rA   r&   r&   r'   image_orientation  s&   r  c           	      C   s  dd | D }t |r#t|dkr|d |d fS t|dkr#t|S dd | D }t|dkrQ|d }|tjv r>tj| S |dv rEtjS |dkrQtjd	d	d
 S t|dkr|d dv rb|\}}n|d dv rm|\}}nd	}|tjv rtj| }|dkr|S |\}}||fS d	S d	S )z]``size`` property validation.

    See https://www.w3.org/TR/css-page-3/#page-size-prop

    c                 S   r   r   r   r   r&   r&   r'   r   :  r   zsize.<locals>.<listcomp>r    r   r   c                 S   r  r&   r   r   r&   r&   r'   r   A  r  )r~   portrait	landscapeNr   )r  r  r  )rx   ri   rv   r   
PAGE_SIZESINITIAL_PAGE_SIZE)	r$   r   rz   rB   orientation	page_sizer  r	  r
  r&   r&   r'   size3  s:   





r$  )r8   c                 C   sZ   t | dkrdS t| }|r)|\}}|dd |D f}|ddgfkr+d|d jfS dS dS )	zValidation for ``anchor``.r^   c                 S      g | ]}|j qS r&   r"  rs   r   r&   r&   r'   r   d      zanchor.<locals>.<listcomp>attrr   attr()r   N)r   r   rC   rA   r5   r"   r   	prototyper&   r&   r'   anchor[  s   r,  )r8   r1   c                 C   sl   t | dkrdS t| |}|r|S t| }|r2|\}}|dd |D f}|ddgfkr4d|d jfS dS dS )	zValidation for ``link``.r^   c                 S   r%  r&   r"  r&  r&   r&   r'   r   u  r'  zlink.<locals>.<listcomp>r(  r   r)  r   N)r   r   r   rC   )rA   r?   rf   r5   r"   r   r+  r&   r&   r'   linki  s   
r-  c                 C   s2   | j dkr| jdur| j}|dkr|S t| ddS )zVValidation for ``tab-size``.

    See https://www.w3.org/TR/css-text-3/#tab-size

    r   Nr   Fr   )r   r   r   r  r&   r&   r'   tab_sizez  s
   r.  c                 C      t | }|dv r
|S dS )zValidation for ``hyphens``.)r^   manualr~   Nr   r   r&   r&   r'   hyphens     r1  c                 C   s(   t | }|dkr
dS | jdkr| jS dS )z'Validation for ``hyphenate-character``.r~   u   ‐r   Nr+  r   r&   r&   r'   hyphenate_character  s   
r3  c                 C   s   t | dddS )z(Validation for ``hyphenate-limit-zone``.FTr   r   rM   r&   r&   r'   hyphenate_limit_zone  s   r4  c                 C   s  t | dkr'| \}t|}|dkrdS |jdkr#|jdur%|jddfS dS dS t | dkr| \}}t|}t|}|jdkra|jdura|jdkrU|jdurU|j|j|jfS |dkr_|jddfS dS |dkr||jdkrv|jdurvd|j|jfS |dkr~dS dS dS t | dkr| \}}}t|dks|jdkr|jdurt|dks|jdkr|jdurt|dks|jdkr|jdur|jdkr|jnd}|jdkr|jnd}|jdkr|jnd}|||fS dS dS dS dS dS dS dS )	z)Validation for ``hyphenate-limit-chars``.r    r~   )   r   r   r   Nr   r5  rh   )ri   r   r   r   rC   )r$   rA   rB   totalr   total_keywordleft_keywordr   r&   r&   r'   hyphenate_limit_chars  sR   

r9  c                 C   sn   t | dkrdS t| }|r+|\}}|dd |D f}|ddgfkr)d|d jfS d	S | jdkr5d| jfS d	S )
zValidation for ``lang``.r^   c                 S   r%  r&   r"  r&  r&   r&   r'   r     r'  zlang.<locals>.<listcomp>r(  r   r)  r   r   N)r   r   rC   r   r*  r&   r&   r'   lang  s   

r:  )r9   r1   c                    s&   t  fdd| D }d|vr|S dS )z"Validation for ``bookmark-label``.c                 3       | ]}t | V  qd S rL   r   r   r?   r&   r'   ru         

z!bookmark_label.<locals>.<genexpr>N)rv   )r$   r?   r   r&   r=  r'   bookmark_label  s   r?  c                 C   s>   | j dkr| jdur| j}|dkr|S dS t| dkrdS dS )z"Validation for ``bookmark-level``.r   Nr    r^   r   r  r&   r&   r'   bookmark_level  s   r@  c                 C   rD   )z"Validation for ``bookmark-state``.)openclosedr&   rH   r&   r&   r'   bookmark_state  rY   rC  c                 C   rD   )z$Validation for ``footnote-display``.)r  r  compactr&   rH   r&   r&   r'   footnote_display  rY   rE  c                 C   rD   )z#Validation for ``footnote-policy``.)r~   liner  r&   rH   r&   r&   r'   footnote_policy  rY   rG  c                    sv   t | dkr+t| d }|du rdS t fdd| dd D }d|vr)||fS dS | r7t| d dkr9dS dS dS )	zValidation for ``string-set``.r   r   Nc                 3   r;  rL   r<  r   r=  r&   r'   ru     r>  zstring_set.<locals>.<genexpr>r    r^   )r^   r&   )ri   r   rv   r   )r$   r?   var_namer   r&   r=  r'   
string_set  s   
rI  c           
      C   s  t | dkrdS g }| D ]Q}t|}|s dS |\}}t|dkrt|d }t|d dd}|dkr@|dur@|||f q|d	v rR|durR|d
|dff q|dkrd|durd|d
d|ff q|dv rt|rt|d|tff q|dkr|r|dt|ff q|dkr|d jdkr|d|d jdff q|dkr|d jdkr|dd|d jff q|dkr|d jdkr|d|d jfd f q dS t|dkr7|dkrt	dd |D r||t
dd |D f q|dkrt
dd |D }t	|r|||f q dS |d
kr4t
dd |D }	t	dd |	D r1|||	f q dS  dS t|dkr\|dkr\t	dd |D r\||t
dd |D f q dS t
|S )zValidation for ``transform``.r^   r&   Nr    r   Tr  rotate)skewxskewrL  skewy)
translatex	translaterO  
translateyscalexr   scalescaleyr   c                 s   r!  r   Nr"  rs   ar&   r&   r'   ru   :  r#  ztransform.<locals>.<genexpr>c                 s   r%  rL   r&  r&  r&   r&   r'   ru   ;  r'  c                 s   s    | ]	}t |d dV  qdS )Tr  Nr   r   r&   r&   r'   ru   =  s    
c                 s   r   rL   )r   r   r&   r&   r'   ru   D  r   c                 s   s    | ]}|d uV  qd S rL   r&   )rs   r  r&   r&   r'   ru   E  r      matrixc                 s   r!  rT  r"  rU  r&   r&   r'   ru   K  r>  c                 s   r%  rL   r&  r&  r&   r&   r'   ru   M  r'  )r   r   ri   r   r   r   r	   r   rC   rx   rv   )
r$   
transformsrA   r5   r"   r   r  r   r   anglesr&   r&   r'   	transform  sd   



 
r[  c                 C   r/  )z#``appearance`` property validation.r   Nr   r   r&   r&   r'   
appearanceS  r2  r\  )NFFF)NF)r,   mathr   tinycss2r   tinycss2.color4r    r   
propertiesr   r	   r
   utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   PREFIXr   r2   r4   r0   r   r;   r!   rI   rN   rQ   rT   rX   rZ   rb   rg   rk   rm   rn   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  r  r  r  r   r)  r*  r,  r=  rA  rC  rF  rS  rT  r]  r`  re  rh  rk  rr  rs  rt  ru  rv  rx  ry  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  r   r	  r  r  r  r  r  r  r  r  r$  r,  r-  r.  r1  r3  r4  r9  r:  r?  r@  rC  rE  rG  rI  r[  r\  r&   r&   r&   r'   <module>   sn   X)

	







	



	









	
	


-





	!
	


		x8&
'	
'
;