o
    e                     @   s  d Z ddlmZ ddlZddl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 ddlT dZe	eeeeeeee
eiZdZedd	 Zd
ZeeeeeeeedZg dZdd Z dddZ!G dd de"Z#G dd dee#Z$dd Z%dd Z&G dd dee#Z'i dddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d	d9i d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^Z(ddefdd3e	fd5dDefd_d`efdFdTe	fdVdZefdadae	fdbdbe
fdcddefdedfe	fdgdhe	fdidjefgZ)i Z*e)D ]\Z+Z,Z-e.e+e,d D ]Z/e-e*e/< q?q3[+[,[-[/e0dkZ1i Z2e1e13  D ]Z4d#e2e4< qY[4[1i Z5e0dlD ]Z4de5e4< qie0dd#e0dmd#e0dnd#iZ6e0d0de0d\de0dde0dode0dpde0d]diZ7e8dqj9Z:drds Z;efdtduZ<dvdw Z=dxdy Z>dzd{ Z?d|d} Z@d~d ZAdd ZBdd ZCdd ZDG dd dee#ZEG dd dee#ZFG dd dee#ZGG dd dee#ZHG dd deZIdS )z$
Module for formatting information.
    )print_functionN)unpack   )FDTFGEFNUFTXFUNXL_CELL_DATEXL_CELL_NUMBERXL_CELL_TEXT	XL_FORMAT
XL_FORMAT2
BaseObject	XLRDErrorfprintfunpack_stringunpack_unicodeupkbitsupkbitsL)*)8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+   3   f   r   r      r0   r   r   r.   r   r.   r   r!   r!   r   r.   r0   r0   r0   r   r#   r   r   r   r%   r    r&   r   r   r0   r   r1   r0   r   r0   r   r   r+   r+   r0   r   r   r+   r0   r0   r+   r   )   r<   r<   r-   r.   r   r-   r0   r0   r+   r0   r   r   r0   r   r   r+   r   r   r.   r   r.   r.   r+      rE   rE   r   r-   r.   r-   r+   r.   r   r-   r   r-   r-   r   r+   r-   r   r,   r-   r-   r+   r-   r-   r-      )8r   r   r   r   r   r   r   r   r    r"   r#   r$   r%   r&   r'   r)   r*   r,   r/   r1   r2   r3   r4   r5   r#   r   r   r   r%   r    r&   r   r6   r1   r7   r8   r9   r:   r;   )r   r0   r+   r=   r>   r?   r@   rA   rB   rC   rD   rF   rG   rH   rI   rJ   r,   rK   rL   )P   F   2   -   (            )
Normal	RowLevel_	ColLevel_CommaCurrencyPercentz	Comma [0]zCurrency [0]	HyperlinkzFollowed Hyperlinkc                 C   s   i | _ i | _| jsd S tdD ]	}t| | j |< qt| j }t|}t|D ]}|| | j |d < q&d | j |d < d | j |d d < d | j d< d | j d< d S )N   r   Q     )
colour_mapcolour_indexes_usedformatting_infoxrangeexcel_default_palette_b8default_palettebiff_versionlen)bookidpalndpal rl   B/var/www/html/venv/lib/python3.10/site-packages/xlrd/formatting.pyinitialise_colour_mapi   s   

rn   c           
      C   sr   d}d}|   D ]-\}}|du rqd}t||D ]\}}	|||	 ||	  7 }q||k r5|}|}|dkr5 nq	 |S )z
    General purpose function. Uses Euclidean distance.
    So far used only for pre-BIFF8 ``WINDOW2`` record.
    Doesn't have to be fast.
    Doesn't have to be fancy.
    i   r   N)itemszipprint)
r`   rgbdebugbest_metricbest_colourxcolourxcand_rgbmetricv1v2rl   rl   rm   nearest_colour_index   s    r{   c                   @   s    e Zd ZdZdd Zdd ZdS )	EqNeAttrsz
    This mixin class exists solely so that :class:`Format`, :class:`Font`, and
    :class:`XF` objects can be compared by value of their attributes.
    c                 C   s   | j |j kS N__dict__selfotherrl   rl   rm   __eq__      zEqNeAttrs.__eq__c                 C   s   | j |j kS r}   r~   r   rl   rl   rm   __ne__   r   zEqNeAttrs.__ne__N)__name__
__module____qualname____doc__r   r   rl   rl   rl   rm   r|      s    r|   c                   @   sP   e Zd ZdZdZdZdZdZdZdZ	dZ
dZedZdZdZdZdZdZdZdS )Fontz
    An Excel "font" contains the details of not only what is normally
    considered a font, but also several other display attributes.
    Items correspond to those in the Excel UI's Format -> Cells -> Font tab.

    .. versionadded:: 0.6.1
    r      N)r   r   r   r   boldcharacter_setcolour_index
escapementfamily
font_indexheightitalicUNICODE_LITERALname
struck_outunderline_type
underlinedweightoutlineshadowrl   rl   rl   rm   r      s"    	r   c                 C   s$   | j sd S td|d | jd _d S )N<Hr   )rb   r   	font_listr   )rh   datarl   rl   rm   handle_efont  s   r   c              	   C   s  | j sd S | js|   tp| jdk}| j}t| j}|dkr4t }t	d|_
||_| j| |d7 }t }||_| j| |dkrtd|dd \|_}|_|_|_|_|_|_|d@ |_|d@ d? |_|d@ d? |_|d	@ d
? |_|d@ d? |_|d@ d? |_|dkrt|ddd|_
nt|d| jdd|_
n|dkrtd|dd \|_}|_|d@ |_|d@ d? |_|d@ d? |_|d	@ d
? |_|d@ d? |_|d@ d? |_t|d| jdd|_
ddg|j |_d|_|j|_d|_d|_nNtd|dd \|_}d|_|d@ |_|d@ d? |_|d@ d? |_|d	@ d
? |_d|_d|_t|d| jdd|_
ddg|j |_d|_|j|_d|_d|_|rU|j| jd|j dd d S d S )N      z
Dummy Fontr   rP   z	<HHHHHBBBr      r]      rM          rN      lenlenrS   z<HHH   r   i  z<HHr_   z--- handle_font: font[%d] ---z-------------------headerfooter)rb   encodingderive_encodingDEBUG	verbosityrf   rg   r   r   r   r   r   appendr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   dumplogfile)rh   r   blahbvkfoption_flagsrl   rl   rm   handle_font  s   





r   c                   @   s(   e Zd ZdZdZeZedZdd Z	dS )Formatz\
    "Number format" information from a ``FORMAT`` record.

    .. versionadded:: 0.6.1
    r   r   c                 C   s   || _ || _|| _d S r}   )
format_keytype
format_str)r   r   tyr   rl   rl   rm   __init__g  s   
zFormat.__init__N)
r   r   r   r   r   r	   r   r   r   r   rl   rl   rl   rm   r   O  s    r   General0r   z0.00r   z#,##0r   z#,##0.00r   z$#,##0_);($#,##0)r   z$#,##0_);[Red]($#,##0)   z$#,##0.00_);($#,##0.00)r]   z$#,##0.00_);[Red]($#,##0.00)	   z0%
   z0.00%   z0.00E+00   z# ?/?r   z# ??/??r   zm/d/yy   zd-mmm-yyzd-mmm   zmmm-yy   z
h:mm AM/PM   zh:mm:ss AM/PMrU   zh:mmrT   zh:mm:ss   zm/d/yy h:mm%   z#,##0_);(#,##0)&   z#,##0_);[Red](#,##0)'   z#,##0.00_);(#,##0.00)rR   z#,##0.00_);[Red](#,##0.00))   z'_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)*   z*_($* #,##0_);_($* (#,##0);_($* "-"_);_(@_)+   z/_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_),   z2_($* #,##0.00_);_($* (#,##0.00);_($* "-"??_);_(@_)rQ   zmm:ss.   z	[h]:mm:ss/   zmm:ss.0z##0.0E+0@)0   1      $   r   r   rP   :   ;   >   C   rO   G   r^   ymdhsz$-+/(): #?GENERALgeneralz	\[[^]]*\]c           	      C   s|  d}d}|D ]C}|dkr(|t dkrd}n&|t dv rd}n|tv r#n||7 }n|dkr5|t dkr4d}n|dkr;d}d|  krFdksIJ  J q| jdkrZtdt| | jd	 td|}|tv red
S d}d}d}d }}|D ]}|tv r~|t| 7 }qq|t	v r|t	| 7 }qq||krd}qq|r|sdS |r|sd
S |r| jrt
| jd||| ||kS |s| jrt
| jd| ||kS )Nr   r   "r   z\_*r   r   z+is_date_format_string: reduced format is %sfileF;Tz7WARNING *** is_date_format: ambiguous d=%d n=%d fmt=%r
z/WARNING *** format %r produces constant result
)r   skip_char_dictr   rq   REPRr   fmt_bracketed_subnon_date_formatsdate_char_dictnum_char_dictr   )	rh   fmtstatesc	separatorgot_sep
date_count	num_countrl   rl   rm   is_date_format_string  sj   



r   c                 C   s  d}| j }|tkrt|d}| js|   d}|dkr'td|dd d }n	| j}|dkr0d}|  jd7  _|dkrAt|d}n	t||| jdd}|pP| j	d	k}|r^t
| jd
| j||| | |}	ttg|	 }
|dks|dk st|t}|tk}| j	rd|  k rdk rn n||	A rd}t
| jd|| |dkrt
| jd|
||	| t||
|}|r|j| jd| jd f d || j|< | j| d S )Nr   rS   r   rP   r   r   rN   r   r   z)FORMAT: count=%d fmtkey=0x%04x (%d) s=%r
   zHWARNING *** Conflict between std format key %d and its format string %r
z2ty: %d; is_date_c: %r; is_date_s: %r; fmt_strg: %rz--- handle_format [%d] ---)r   )rf   r   minr   r   r   actualfmtcountr   r   r   r   r   r   r   r   std_format_code_typesgetr	   r   r   
format_mapformat_listr   )r   r   rectyper   r   strposfmtkeyunistrgr   	is_date_sr   std_ty	is_date_cfmtobjrl   rl   rm   handle_format  sZ   


&
r  c                 C   sn  | j sd S tp| jdk}td|d d \}d| jdk }ts$| jdkr1||kr1t| jd|| n	|r:t| jd| d| }d	| d }t|}d	}||  krV|| ks_n td
||f t||d | }	| j	g ksoJ t
|D ]A}
|	|
 }|d@ }|d? d@ }|d? d@ }| jd|
  }|||f}| j	| || jd|
 < |r||krtd|
||f | jd qsd S )Nr   r   )rM   8   rP   r   z9NOTE *** Expected %d colours in PALETTE record, found %d
zPALETTE record with %d colours
z<xx%dir   z0PALETTE record: expected size %d, actual size %dr   r]   rM   z%2d: %r -> %rr   )rb   r   r   r   rf   r   r   rg   r   palette_recordrc   r`   r   rq   )rh   r   r   	n_coloursexpected_n_coloursr   expected_sizeactual_size	tolerancecoloursri   r   redgreenblueold_rgbnew_rgbrl   rl   rm   handle_paletteA  sH   
r  c                 C   s   | j D ]4}|jdkrq|j}|dkrq|| jv rd| j|< q| jr7tdt| j| jd t	| jd|j|j
| q| jdkrOt| j }td| | jd d S d S )Nr   r_   r   zSize of colour table:r   z2*** Font #%d (%r): colour index 0x%04x is unknown
z
Colour indexes used:
%r
)r   r   r   r`   ra   r   rq   rg   r   r   r   sortedkeys)rh   fontcxusedrl   rl   rm   palette_epiloguee  s$   




r  c           
   	   C   sj  | j sd S tp| jdk}| j}td|d d \}}}|d@ }|dkr3d| jvr3d}d}d}d}	d	}nj|d
@ rRd}t| }	d|  krGdkrQn nT|	t|d 7 }	nKd}d}d}|dkrz	t|ddd}	W n, t	y   t
d||||f | jd t
dt|dd  | jd  w t|d| jdd}	|r|	st
d| jd ||f| j|	< |rt| jd|||||	 d S d S )Nr   z<HBBr     s       rV   r   r   r   i   rN   r   z6STYLE: built_in=%d xf_index=%d built_in_id=%d level=%dr   z
raw bytes:z7WARNING *** A user-defined style has a zero-length namez?STYLE: built_in=%d xf_index=%d built_in_id=%d level=%d name=%r
)rb   r   r   rf   r   style_name_mapbuilt_in_style_namesstrr   UnicodeDecodeErrorrq   r   reprr   r   r   )
rh   r   r   r   flag_and_xfxbuilt_in_idlevelxf_indexbuilt_inr   rl   rl   rm   handle_styley  sT   

r(  c                 C   s~   t |j }|D ]3\}}t|drt| || q	|ddkr<|| jv r+d| j|< q	|jj	}t
d||||f | jd q	d S )Nr   r   r   r   z&*** xf #%d : %s.%s =  0x%04x (unknown)r   )r  r   ro   hasattrcheck_colour_indexes_in_objfindr`   ra   	__class__r   rq   r   )rh   obj
orig_indexalistattrnobjonamerl   rl   rm   r*    s    



r*  c                 C   sD   t  D ]}|| jvrt | }t|}t|||}|| j|< qd S r}   )r   r  r   std_format_stringsr   r   )rh   xr   fmt_strr  rl   rl   rm   fill_in_standard_formats  s   


r6  c           "      C   s  t p| jdk}| j}t }t |_d|j_d|j_d|j_t	 |_
d|j
_d|j
_d|j
_d|j
_t |_t |_|dkrD| jsDt|  |dkrd}t||dd \
|_|_}}|j_}}	}
}}t|j|d t||d t|j|d	 t|j|d
 |	d? }g d}|D ]}d| d }t|||d@  |dL }qt|j
|
d t|j
|d t|j|d t|j|d n|dkr(d}t||dd \|_|_}}}}
}t|j|d t||d t|j|d	 |d@ }g d| |j_|d? }g d}|D ]}d| d }t|||d@  |dL }qt|j|
d t|j
|
d t|j
|d nZ|dkrd}t||dd \|_|_}}}	}}t|j|d t||d t|j|d |d@ d? }g d| |j_|	d? }g d}|D ]}d| d }t|||d@  |dL }qmt|j|d  t|j
|d! n|d"krd#}t||dd \|_|_}}	}}}t|j|d t||d$ t|j|d% t||d& |	d? }g d}|D ]}d| d }t|||d@  |dL }qt|j|d  t|j
|d! d|j_d|j_n|d'kr|td(|\|_}}|d)@ |_t|j|d* t|j|d+ d,D ]%\}}||@ r-d-\}}nd.\}}t|j
|d/ | t|j
|d0 | q|j}|d1@ rQd2|_nd|_d3|_d4|_d|_ d|j_d|j_g d}|D ]}d| d }t||d qknt!d5| t"| j#|_$| j#%| |  jd7  _|r|j&| j'd6|j$ d7d8 z| j(|j }t)|j* } W n t+y   t,} Y nw | | j-|j$< | j.r| jr|j/r|j d9krd:}!t0| j'|!|j$|j  t1| ||j$ |j| j(vrd;}!| jrt0| j'|!|j$|j|j d|_d S d S )<Nr   r   rP   rN   z<HHHBBBBIiHrU   ))r   r   cell_locked)r   r   formula_hidden)r   r   is_styler   r]   lotus_123_prefixr   i  parent_style_index)r   r   	hor_alignr   r]   text_wrapped)r   p   
vert_align))r   r   indent_level)r   rM   shrink_to_fit)r   r(   text_directionr   )formatr  	alignmentborder
background
protection__flagr   ))r   r   left_line_style)r      right_line_style)r]   i   top_line_style)r   i   bottom_line_stylerM   i   left_colour_index   i  ?right_colour_index)rS   i   @	diag_down)   l        diag_up))r      top_colour_index)r   ?  bottom_colour_index)r   i  diag_colour_index)rT   i  diag_line_style))   l      x fill_pattern)r   r\  pattern_colour_indexr   r^  background_colour_indexz<HHHBBIirM   )r   r   Z      )rd  rf  )rM   i  ? rc  ))r   i  rS  )   l      | r_  )r   r   rR  )r   r	  rO  )r   i  rQ  )r   i   r]  rT  rV  rR   z<BBHBBHIr   )r?  rA  )r   r   rD  r(   r   ))r   ?   rc  )r   i  re  )r      rg  )rk  )r      r]  )r]   i   rO  )r   rm  rU  )rM   i   rS  )r   i   r_  )   i   rQ  )r   l      p rX  rS   z<BBBBHHI)r9  r;  )r?  rA  )r=  rT   z<BxBBrl  ))r   @   r7  )r   r!   r8  )r?  ))r]   left)rM   right)r   top)rp  bottom)r]   r   )r   r   _colour_index_line_styler!   r   r   r]   zprogrammer stuff-up: bv=%dz--- handle_xf: xf[%d] --- r   r  zNWARNING *** XF[%d] is a style XF but parent_style_index is 0x%04x, not 0x0fff
z9WARNING *** XF[%d] unknown (raw) format key (%d, 0x%04x)
)2r   r   rf   XFXFAlignmentrI  rE  rF  rG  XFBorderrJ  r[  rY  r`  ra  XFBackgroundrK  XFProtectionrL  xfcountr6  r   r   r   rotationr   setattrr   rD  rc  rg  re  r>  r   rg   xf_listr&  r   r   r   r   _cellty_from_fmttyr   KeyErrorr   _xf_index_to_xl_type_maprb   r:  r   r*  )"r   r   r   r   xf
unpack_fmtpkd_type_par
pkd_align1
pkd_align2pkd_usedpkd_brdbkg1pkd_brdbkg2pkd_brdbkg3reg
attr_stems	attr_stemr0  pkd_orient_usedorientationpkd_align_orient
pkd_bkg_34
pkd_brd_34pkd_type_protpkd_align_par
format_etc
halign_etcmasksider   
line_stylebgr   celltymsgrl   rl   rm   	handle_xf  s4  



















r  c           
      C   s~  d| _ t| j}tp| jdk}tp| jdk}|rt| jd dd }t|D ]}| j| }z| j|j	 }t
|j }W n tyF   t}Y nw || j|j< | jsQq&|jrUq&d|j  kr`|k srn |rot| jd|j|j|j d|_| jdkr<|r|j|jkrt| jd	|j|j n| j|j jst| jd
|j|j |r|j|jkrt| jd|j|j | j|j }	|js|	js|r|| ||	d |js|	js|r|| ||	d |js|	js|r|| ||	d |js|	js|r|| ||	d |js|	js|r|j	|	j	krt| jd|j|j	|	j|	j	| j|j	 j| j|	j	 j |js<|	js<|r<|j|	jkr<t| jd|j|j|	j|	j q&d S )Nr   r   zxf_epilogue called ...
c                 S   s2   t ||t ||krt| jd|j|j| d S d S )Nz(NOTE !!! XF[%d] parent[%d] %s different
)getattrr   r   r&  )book_argxf_arg
parent_argr0  rl   rl   rm   
check_same  s   
zxf_epilogue.<locals>.check_samer   z:WARNING *** XF[%d]: is_style=%d but parent_style_index=%d
rS   z/NOTE !!! XF[%d]: parent_style_index is also %d
z>NOTE !!! XF[%d]: parent_style_index is %d; style flag not set
z9NOTE !!! XF[%d]: parent_style_index is %d; out of order?
rI  rK  rJ  rL  z4NOTE !!! XF[%d] fmtk=%d, parent[%d] fmtk=%r
%r / %r
z.NOTE !!! XF[%d] fontx=%d, parent[%d] fontx=%r
)_xf_epilogue_donerg   r  r   r   r   r   rc   r   r   r  r   r  r   r  r&  rb   r:  r>  rf   _alignment_flag_background_flag_border_flag_protection_flag_format_flagr   
_font_flagr   )
r   num_xfsr   blah1r  xfxr  r   r  parentrl   rl   rm   xf_epilogue  s   

r  c              	   C   sB   t |  d| _tttttttt	t
f	}|D ]
}t| j|j| qd S )Nr   )rn   r  r   r   r  r   r  r  r(  r  r  r  r,  r   )rh   methodsmethodrl   rl   rm   initialise_bookA  s   r  c                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdS )rz  ao  
    A collection of the border-related attributes of an ``XF`` record.
    Items correspond to those in the Excel UI's Format -> Cells -> Border tab.

    An explanations of "colour index" is given in :ref:`palette`.

    There are five line style attributes; possible values and the
    associated meanings are::

      0 = No line,
      1 = Thin,
      2 = Medium,
      3 = Dashed,
      4 = Dotted,
      5 = Thick,
      6 = Double,
      7 = Hair,
      8 = Medium dashed,
      9 = Thin dash-dotted,
      10 = Medium dash-dotted,
      11 = Thin dash-dot-dotted,
      12 = Medium dash-dot-dotted,
      13 = Slanted medium dash-dotted.

    The line styles 8 to 13 appear in BIFF8 files (Excel 97 and later) only.
    For pictures of the line styles, refer to OOo docs s3.10 (p22)
    "Line Styles for Cell Borders (BIFF3-BIFF8)".</p>

    .. versionadded:: 0.6.1
    r   N)r   r   r   r   r]  r_  rU  rX  r`  rR  rS  rO  rQ  ra  rY  r[  rl   rl   rl   rm   rz  R  s     rz  c                   @   s   e Zd ZdZdZdZdZdS )r{  a  
    A collection of the background-related attributes of an ``XF`` record.
    Items correspond to those in the Excel UI's Format -> Cells -> Patterns tab.

    An explanations of "colour index" is given in :ref:`palette`.

    .. versionadded:: 0.6.1
    r   N)r   r   r   r   rc  rg  re  rl   rl   rl   rm   r{    s
    
r{  c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
dS )ry  z
    A collection of the alignment and similar attributes of an ``XF`` record.
    Items correspond to those in the Excel UI's Format -> Cells -> Alignment tab.

    .. versionadded:: 0.6.1
    r   N)r   r   r   r   r@  rD  r~  rB  rE  rF  rG  rl   rl   rl   rm   ry    s    ry  c                   @   s   e Zd ZdZdZdZdS )r|  ad  
    A collection of the protection-related attributes of an ``XF`` record.
    Items correspond to those in the Excel UI's Format -> Cells -> Protection tab.
    Note the OOo docs include the "cell or style" bit in this bundle of
    attributes. This is incorrect; the bit is used in determining which bundles
    to use.

    .. versionadded:: 0.6.1
    r   N)r   r   r   r   r7  r8  rl   rl   rl   rm   r|    s    r|  c                   @   sL   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdS )rx  a  
    eXtended Formatting information for cells, rows, columns and styles.

    Each of the 6 flags below describes the validity of
    a specific group of attributes.

    In cell XFs:

    - ``flag==0`` means the attributes of the parent style ``XF`` are
      used, (but only if the attributes are valid there);

    - ``flag==1`` means the attributes of this ``XF`` are used.

    In style XFs:

    - ``flag==0`` means the attribute setting is valid;
    - ``flag==1`` means the attribute should be ignored.

    .. note::
      the API provides both "raw" XFs and "computed" XFs. In the latter case,
      cell XFs have had the above inheritance mechanism applied.

    .. versionadded:: 0.6.1
    r   N)r   r   r   r   r:  r>  r  r  r  r  r  r  r&  r   r   rL  rK  rI  rJ  rl   rl   rl   rm   rx    s"    rx  )r   )Jr   
__future__r   restructr   biffhr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   timemachiner   r  excel_default_palette_b5excel_default_palette_b2rd   re   r  rn   r{   objectr|   r   r   r   r   r3  fmt_code_rangesr   lohir   rc   r4  r   
date_charsr   upper_cr   r   r   compilesubr   r   r  r  r  r(  r*  r6  r  r  r  rz  r{  ry  r|  rx  rl   rl   rl   rm   <module>   sB  L
[I	
 !"#$%&-	?4$+  >IC"