§
    £”j7  ã                   óÞ  — d Z ddlmZ ddlmZmZ ddlmZmZ ddl	Z	ddl
mZ  e	j        d¦  «        Zd	Zd
ZdZ e	j        dez   dz   e	j        ¦  «        ZdZ e	j        d                     ee¦  «        e	j        ¦  «        Zd„ Zd„ Zd„ Zdg ee¦  «        z   Z ed¬¦  «        d„ ¦   «         Zd„  eed¦  «        D ¦   «         ZdZ ed¬¦  «        d„ ¦   «         Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%dS )zT
Collection of utilities used within the package and also available for client code
é    )Ú	lru_cache)ÚchainÚproduct)Úascii_uppercaseÚdigitsNé   )ÚCellCoordinatesExceptionz^[$]?([A-Za-z]{1,3})[$]?(\d+)$z[A-Z]{1,3}:[A-Z]{1,3}:z\d+:\d+:zq
[$]?(?P<min_col>[A-Za-z]{1,3})?
[$]?(?P<min_row>\d+)?
(:[$]?(?P<max_col>[A-Za-z]{1,3})?
[$]?(?P<max_row>\d+)?)?
ú^ú$z7
(('(?P<quoted>([^']|'')*)')|(?P<notquoted>[^'^ ^!]*))!z{0}(?P<cells>{1})(?=,?)c                 óÌ   — t          | t          ¦  «        rt          | ¦  «        } t          |t          ¦  «        rt          |¦  «        }d„ t          | |dz   ¦  «        D ¦   «         S )z¤
    Given the start and end columns, return all the columns in the series.

    The start and end columns can be either column letters or 1-based
    indexes.
    c                 ó,   — g | ]}t          |¦  «        ‘ŒS © ©Úget_column_letter)Ú.0Úxs     úb/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/openpyxl/utils/cell.pyú
<listcomp>z'get_column_interval.<locals>.<listcomp>)   s!   € Ð@Ð@Ð@ QÕ˜aÑ Ô Ð@Ð@Ð@ó    r   )Ú
isinstanceÚstrÚcolumn_index_from_stringÚrange)ÚstartÚends     r   Úget_column_intervalr      sd   € õ �%�ÑÔð 0Ý(¨Ñ/Ô/ˆÝ�#•sÑÔð ,Ý& sÑ+Ô+ˆØ@Ð@­%°°s¸Q±wÑ*?Ô*?Ð@Ñ@Ô@Ð@r   c                 óæ   — t                                | ¦  «        }|sd| › d�}t          |¦  «        ‚|                     ¦   «         \  }}t	          |¦  «        }|sd| › d�}t          |¦  «        ‚||fS )z;Convert a coordinate string like 'B12' to a tuple ('B', 12)zInvalid cell coordinates (ú)zThere is no row 0 ()ÚCOORD_REÚmatchr	   ÚgroupsÚint)Úcoord_stringr    ÚmsgÚcolumnÚrows        r   Úcoordinate_from_stringr'   ,   s…   € å�NŠN˜<Ñ(Ô(€EØð ,Ø:¨<Ð:Ð:Ð:ˆÝ& sÑ+Ô+Ð+Ø—,’,‘.”.�K€FˆCÝ
ˆc‰(Œ(€CØð ,Ø3 LÐ3Ð3Ð3ˆÝ& sÑ+Ô+Ð+Ø�3ˆ;Ðr   c                 ó  — t                                | ¦  «        }|st          | › d�¦  «        ‚|                     d¦  «        }|                     ¦   «         D ]\  }}|rd|› �||<   Œ|d         s|d         rd}nd} |j        di |¤ŽS )	zDConvert a coordinate to an absolute coordinate string (B12 -> $B$12)z  is not a valid coordinate rangeÚ r   Úmax_colÚmax_rowz%{min_col}{min_row}:{max_col}{max_row}z{min_col}{min_row}r   )ÚABSOLUTE_REr    Ú
ValueErrorÚ	groupdictÚitemsÚformat)r#   ÚmÚdÚkÚvÚfmts         r   Úabsolute_coordinater6   :   s®   € å×Ò˜,Ñ'Ô'€AØð LÝ˜LÐJÐJÐJÑKÔKÐKà	�Š�B‰Œ€AØ—’‘	”	ð ð ‰ˆˆ1Øð 	Ø�q�7�7ˆAˆa‰Døàˆ„|ð #�q˜”|ð #Ø5ˆˆà"ˆØˆ3Œ:ˆ?ˆ?˜ˆ?ˆ?Ðr   r)   )Úmaxsizec                 ób  — d| cxk    rdk    s$n t          d                     | ¦  «        ¦  «        ‚g }| dk     rt          |          S | rSt          | d¦  «        \  } }|                     dt          |         ¦  «         |s| dz  } |                     dd¦  «         | °Sd                     |¦  «        S )aÎ  
    Convert decimal column position to its ASCII (base 26) form.

    Because column indices are 1-based, strides are actually pow(26, n) + 26
    Hence, a correction is applied between pow(26, n) and pow(26, 2) + 26 to
    prevent and additional column letter being prepended

    "A" == 1 == pow(26, 0)
    "Z" == 26 == pow(26, 0) + 26 // decimal equivalent 10
    "AA" == 27 == pow(26, 1) + 1
    "ZZ" == 702 == pow(26, 2) + 26 // decimal equivalent 100
    r   ifG  zInvalid column index {0}é   r   ÚZr)   )r-   r0   Ú__decimal_to_alphaÚdivmodÚinsertÚjoin)Úcol_idxÚresultÚ	remainders      r   r   r   N   sÐ   € ð �Ð Ð Ò Ð ˜5Ò Ð Ð Ð ÝÐ3×:Ò:¸7ÑCÔCÑDÔDÐDà€Fà�‚|€|Ý! 'Ô*Ð*à
ð "Ý# G¨RÑ0Ô0Ñˆ�Ø�Š�aÕ+¨IÔ6Ñ7Ô7Ð7Øð 	"Ø�q‰LˆGØ�MŠM˜!˜SÑ!Ô!Ð!ð ð "ð �7Š7�6‰?Œ?Ðr   c                 ó   — i | ]\  }}||“Œ	S r   r   )r   ÚposÚletters      r   ú
<dictcomp>rE   o   s   € ÐRÐRÐR¡[ S¨&�f˜SÐRÐRÐRr   )r   r9   i¤  c                 óv  — d| › d�}t          | ¦  «        dk    rt          |¦  «        ‚d}t          |                      ¦   «         ¦  «        } t	          | t
          ¦  «        D ]9\  }}	 t          |         }n# t          $ r t          |¦  «        ‚w xY w|||z  z  }Œ:d|cxk     rdk     sn t          |¦  «        ‚|S )zÊ
    Convert ASCII column name (base 26) to decimal with 1-based index

    Characters represent descending multiples of powers of 26

    "AFZ" == 26 * pow(26, 0) + 6 * pow(26, 1) + 1 * pow(26, 2)
    ú'z<' is not a valid column name. Column names are from A to ZZZé   r   igG  )Úlenr-   ÚreversedÚupperÚzipÚ__powersÚ__alpha_to_decimalÚKeyError)ÚcolÚ	error_msgÚidxrD   ÚpowerrC   s         r   r   r   r   sÝ   € ð V�CÐUÐUÐU€IÝ
ˆ3�x„x�!‚|€|Ý˜Ñ#Ô#Ð#Ø
€CÝ
�3—9’9‘;”;Ñ
Ô
€CÝ˜S¥(Ñ+Ô+ð ð ‰ˆ�ð	(Ý$ VÔ,ˆCˆCøÝð 	(ð 	(ð 	(Ý˜YÑ'Ô'Ð'ð	(øøøàˆs�U‰{ÑˆˆØˆsˆ?ˆ?Š?ˆ?�UŠ?ˆ?ˆ?ˆ?Ý˜Ñ#Ô#Ð#Ø€Js   Á'A5Á5Bc                 ó$  — d                      | ¦  «        }t                               | ¦  «        }|st          |¦  «        ‚|                     ¦   «         \  }}}}}|re||f}||f}	t          ||	z   ¦  «        sKt          |¦  «        rt          |	¦  «        r-t          |	¦  «        rt          |¦  «        rt          |¦  «        ‚|�t          |¦  «        }|�t          |¦  «        }|�t          |¦  «        }n|}|�t          |¦  «        }n|}||||fS )z³
    Convert a range string into a tuple of boundaries:
    (min_col, min_row, max_col, max_row)
    Cell coordinates will be converted into a range with the cell at both end
    z&{0} is not a valid coordinate or range)	r0   r,   r    r-   r!   ÚallÚanyr   r"   )
Úrange_stringr$   r1   Úmin_colÚmin_rowÚsepr*   r+   ÚcolsÚrowss
             r   Úrange_boundariesr]   ‹   s7  € ð 3×
9Ò
9¸,Ñ
GÔ
G€CÝ×Ò˜,Ñ'Ô'€AØð Ý˜‰oŒoÐà./¯hªh©j¬jÑ+€GˆW�c˜7 Gà
ð 	"Ø˜ÐˆØ˜Ðˆõ ��t‘ÑÔð	"å�‰IŒIð	"å! $™iœið	"õ �‰IŒIð	"õ " $™iœið	"õ
 ˜S‘/”/Ð!àÐÝ*¨7Ñ3Ô3ˆàÐÝ�g‘,”,ˆàÐÝ*¨7Ñ3Ô3ˆˆàˆàÐÝ�g‘,”,ˆˆàˆà�G˜W gÐ-Ð-r   c              #   óØ   ‡K  — t          | ¦  «        \  }}}}t          ||dz   ¦  «        }d„ t          ||dz   ¦  «        D ¦   «         }|D ]Št          ˆfd„|D ¦   «         ¦  «        V — Œ dS )ú[
    Get individual addresses for every cell in a range.
    Yields one row at a time.
    r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r   r   ©r   rP   s     r   r   z#rows_from_range.<locals>.<listcomp>½   s!   € ÐJÐJÐJ sÕ˜cÑ"Ô"ÐJÐJÐJr   c              3   óD   •K  — | ]}d                       |‰¦  «        V — ŒdS ©z{0}{1}N©r0   )r   rP   r&   s     €r   ú	<genexpr>z"rows_from_range.<locals>.<genexpr>¿   ó1   øè è € Ð>Ð>°#�H—O’O C¨Ñ-Ô-Ð>Ð>Ð>Ð>Ð>Ð>r   N©r]   r   Útuple)rW   rX   rY   r*   r+   r\   r[   r&   s          @r   Úrows_from_rangeri   ¶   s˜   øè è € õ
 *:¸,Ñ)GÔ)GÑ&€GˆW�g˜wÝ�˜' A™+Ñ&Ô&€DØJÐJ­e°G¸WÀq¹[Ñ.IÔ.IÐJÑJÔJ€DØð ?ð ?ˆÝÐ>Ð>Ð>Ð>¸Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>ð?ð ?r   c              #   óØ   ‡K  — t          | ¦  «        \  }}}}t          ||dz   ¦  «        }d„ t          ||dz   ¦  «        D ¦   «         }|D ]Št          ˆfd„|D ¦   «         ¦  «        V — Œ dS )r_   r   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S )Nr   ra   s     r   re   z"cols_from_range.<locals>.<genexpr>É   s+   è è € ÐHÐH sÕ˜cÑ"Ô"ÐHÐHÐHÐHÐHÐHr   c              3   óD   •K  — | ]}d                       ‰|¦  «        V — ŒdS rc   rd   )r   r&   rP   s     €r   re   z"cols_from_range.<locals>.<genexpr>Ë   rf   r   Nrg   )rW   rX   rY   r*   r+   r\   r[   rP   s          @r   Úcols_from_rangerm   Â   s˜   øè è € õ
 *:¸,Ñ)GÔ)GÑ&€GˆW�g˜wÝ�˜' !™)Ñ$Ô$€DØHÐH­e°G¸WÀQ¹YÑ.GÔ.GÐHÑHÔH€DØð ?ð ?ˆÝÐ>Ð>Ð>Ð>¸Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>ð?ð ?r   c                 ó¦   — t          | ¦  «        D ]\  }}|t          v r nŒ| d|…         }| |d…         }t          |¦  «        t          |¦  «        fS )zB
    Convert an Excel style coordinate to (row, column) tuple
    N)Ú	enumerater   r"   r   )Ú
coordinaterR   ÚcrP   r&   s        r   Úcoordinate_to_tuplerr   Î   sh   € õ ˜JÑ'Ô'ð ð ‰ˆˆQØ•ˆ;ˆ;ØˆEð à
�T�c�TÔ
€CØ
�S�T�TÔ
€CÝˆs‰8Œ8Õ-¨cÑ2Ô2Ð2Ð2r   c                 óü   — t                                | ¦  «        }|€t          d¦  «        ‚|                     d¦  «        p|                     d¦  «        }|                     d¦  «        }t	          |¦  «        }||fS )zc
    Convert a worksheet range to the sheetname and maximum and minimum
    coordinate indices
    Nz)Value must be of the form sheetname!A1:E4ÚquotedÚ	notquotedÚcells)ÚSHEETRANGE_REr    r-   Úgroupr]   )rW   r1   Ú	sheetnamerv   Ú
boundariess        r   Úrange_to_tupler{   Ú   sv   € õ
 	×Ò˜LÑ)Ô)€AØ€yÝÐDÑEÔEÐEØ—’˜Ñ!Ô!Ð9 Q§W¢W¨[Ñ%9Ô%9€IØ�GŠG�GÑÔ€EÝ! %Ñ(Ô(€JØ�jÐ Ð r   c                 ód   — d| v r|                       dd¦  «        } d                     | ¦  «        } | S )z>
    Add quotes around sheetnames if they contain spaces.
    rG   z''z'{0}')Úreplacer0   )ry   s    r   Úquote_sheetnamer~   è   s;   € ð ˆiÐÐØ×%Ò% c¨4Ñ0Ô0ˆ	à—’ 	Ñ*Ô*€IØÐr   )&Ú__doc__Ú	functoolsr   Ú	itertoolsr   r   Ústringr   r   ÚreÚ
exceptionsr	   Úcompiler   Ú	COL_RANGEÚ	ROW_RANGEÚ
RANGE_EXPRÚVERBOSEr,   ÚSHEET_TITLEr0   rw   r   r'   r6   Úlistr;   r   ro   rN   rM   r   r]   ri   rm   rr   r{   r~   r   r   r   ú<module>rŒ      s  ððð ð  Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø 	€	€	€	à 0Ð 0Ð 0Ð 0Ð 0Ð 0ð ˆ2Œ:Ð7Ñ8Ô8€Ø(€	Ø€	ð€
ð ˆbŒj˜˜zÑ)¨3Ñ.°´
Ñ;Ô;€ð:€à�”
Ð8×?Ò?Ø�ñô Ø œjñ*ô *€ðAð Að Aðð ð ðð ð ð$ �T˜D˜D Ñ1Ô1Ñ1Ð à
€�4ÐÑÔðð ñ Ôðð@ SÐR°I°I¸oÈqÑ4QÔ4QÐRÑRÔRÐ Ø€à
€�4ÐÑÔðð ñ Ôðð0(.ð (.ð (.ðV	?ð 	?ð 	?ð	?ð 	?ð 	?ð	3ð 	3ð 	3ð!ð !ð !ðð ð ð ð r   