Ë
    v»•j`  ã                   ó  — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 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 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$ erd
dl%m&Z& dZ' ejP                  d«      Z) ejP                  d«      Z* ejP                  d«      Z+ ejP                  d«      Z, ejP                  d«      Z- G d„ de.ej^                  «      Z0 G d„ de0«      Z1 G d„ de0«      Z2 G d„ de0«      Z3 G d„ de0«      Z4 G d„ de0«      Z5 G d„ d e0«      Z6 G d!„ d"e0«      Z7 G d#„ d$e0«      Z8 G d%„ d&e0«      Z9 G d'„ d(e0«      Z: G d)„ d*e0«      Z; G d+„ d,e0«      Z< G d-„ d.e0«      Z=d/ed0efd1„Z>d/ed0efd2„Z?d/ed0efd3„Z@ ed4«      ZAd5eeAgeBf   d6eeA   d0eAfd7„ZC	 	 	 d|d:ee   d;eBd<ed=eBd0eeeDeEef      f
d>„ZFd8d9d8g fd?ee   d;eBd<ed=eBd@eeD   d0eeeeDeEef         fdA„ZGdBeDdCeDd0e.fdD„ZHdEe.d0eeDeDf   fdF„ZIeeDeEf   ZJdEe.d0eeJeJf   fdG„ZKd}dHe.dIeeD   d0ee.eDf   fdJ„ZLdKe.d0eDfdL„ZMdMedNeAf   d0edNeAf   fdO„ZNdPe.d0e.fdQ„ZOdRe.d0e.fdS„ZPd~dBee   dTeDdUed0ee   fdV„ZQ	 	 	 ddWeee      dXeeD   dYeeD   dUed0eee      f
dZ„ZRd[ed\   d0eeee.         fd]„ZSd€d:e.d^e.d_e.d0e.fd`„Zd}dae.dbee.   d0e.fdc„ZTdded0eBfde„ZUdfee.ef   d?eee      dgeDdheDd0eee      f
di„ZVdje.d0ee.eEf   fdk„ZW	 d�dleEdmeEdneEd0e.fdo„ZXdbe.d0eBfdp„ZYdbe.d0e.fdq„ZZg g gfdree   d?eee      d0eee.ee.eDeEf   f      fds„Z[d?eee.      dteDdueDdBeDd0eDf
dv„Z\d?eee.      dteDdueDdCeDd0eDf
dw„Z]e=j¼                  fd?eee.      dxe.dye=d0eee.      fdz„Z_e`d{k(  rddlaZa eajÄ                  «        yy)‚zG
gspread.utils
~~~~~~~~~~~~~

This module contains utility functions.

é    N)Údefaultdict)ÚSequence)Úwraps)Úchain)ÚTYPE_CHECKINGÚAnyÚAnyStrÚCallableÚDictÚIterableÚListÚMappingÚOptionalÚTupleÚTypeVarÚUnion)Úquote)ÚCredentialsé   )ÚIncorrectCellLabelÚInvalidInputValueÚNoValidUrlKeyFound)ÚCellé@   z([A-Za-z]+)([1-9]\d*)z([A-Za-z]+)?([1-9]\d*)?$z[A-Za-z]+\d+:[A-Za-z]+\d+zkey=([^&#]+)z /spreadsheets/d/([a-zA-Z0-9-_]+)c                   ó*   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zˆ xZS )ÚStrEnumc                 ó    •— t        |t        t        j                  f«      st	        d|›dt        |«      › �«      ‚t        ‰| �  | |g|¢­i |¤ŽS )Nz$Values of StrEnums must be strings: z is a )Ú
isinstanceÚstrÚenumÚautoÚ	TypeErrorÚtypeÚsuperÚ__new__)ÚclsÚvalueÚargsÚkwargsÚ	__class__s       €ú@/var/www/html/venv/lib/python3.12/site-packages/gspread/utils.pyr%   zStrEnum.__new__3   sT   ø€ Ü˜%¤#¤t§y¡yÐ!1Ô2ÜØ6°u°i¸vÄdÈ5ÃkÀ]ÐSóð ô ‰w‰˜s EÐ;¨DÒ;°FÑ;Ð;ó    c                 ó,   — t        | j                  «      S ©N)r   r'   )Úselfs    r+   Ú__str__zStrEnum.__str__:   s   € Ü�4—:‘:‹Ðr,   c                 ó   — | S r.   © )ÚnameÚ_s     r+   Ú_generate_next_value_zStrEnum._generate_next_value_=   s   € Øˆr,   )Ú__name__Ú
__module__Ú__qualname__r%   r0   r5   Ú__classcell__)r*   s   @r+   r   r   2   s   ø„ ô<òör,   r   c                   ó   — e Zd ZdZdZy)Ú	DimensionÚROWSÚCOLUMNSN)r6   r7   r8   ÚrowsÚcolsr2   r,   r+   r;   r;   A   s   „ Ø€DØ�Dr,   r;   c                   ó   — e Zd ZdZdZdZy)Ú	MergeTypeÚ	MERGE_ALLÚMERGE_COLUMNSÚ
MERGE_ROWSN)r6   r7   r8   Ú	merge_allÚmerge_columnsÚ
merge_rowsr2   r,   r+   rA   rA   F   s   „ Ø€IØ#€MØ�Jr,   rA   c                   ó   — e Zd ZdZdZdZy)ÚValueRenderOptionÚFORMATTED_VALUEÚUNFORMATTED_VALUEÚFORMULAN)r6   r7   r8   Ú	formattedÚunformattedÚformular2   r,   r+   rI   rI   L   s   „ Ø!€IØ%€KØ�Gr,   rI   c                   ó   — e Zd ZdZdZy)ÚValueInputOptionÚRAWÚUSER_ENTEREDN)r6   r7   r8   ÚrawÚuser_enteredr2   r,   r+   rQ   rQ   R   s   „ Ø
€CØ!�Lr,   rQ   c                   ó   — e Zd ZdZdZy)ÚInsertDataOptionÚ	OVERWRITEÚINSERT_ROWSN)r6   r7   r8   Ú	overwriteÚinsert_rowsr2   r,   r+   rW   rW   W   s   „ Ø€IØ�Kr,   rW   c                   ó   — e Zd ZdZdZy)ÚDateTimeOptionÚSERIAL_NUMBERÚFORMATTED_STRINGN)r6   r7   r8   Úserial_numberÚformatted_stringr2   r,   r+   r]   r]   \   s   „ Ø#€MØ)Ñr,   r]   c                   ó(   — e Zd ZdZdZdZdZdZdZdZ	y)	ÚMimeTypez'application/vnd.google-apps.spreadsheetzapplication/pdfzAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetztext/csvz.application/vnd.oasis.opendocument.spreadsheetztext/tab-separated-valueszapplication/zipN)
r6   r7   r8   Úgoogle_sheetsÚpdfÚexcelÚcsvÚopen_office_sheetÚtsvÚzipr2   r,   r+   rc   rc   a   s&   „ Ø=€MØ
€CØO€EØ
€CØHÐØ
%€CØ
�Cr,   rc   c                   óœ   — e Zd Zej                  Zej                  Zej                  Z	ej                  Zej                  Zej                  Zy)ÚExportFormatN)r6   r7   r8   rc   re   ÚPDFrf   ÚEXCELrg   ÚCSVrh   ÚOPEN_OFFICE_SHEETri   ÚTSVrj   ÚZIPPED_HTMLr2   r,   r+   rl   rl   k   s;   „ Ø
�,‰,€CØ�N‰N€EØ
�,‰,€CØ ×2Ñ2ÐØ
�,‰,€CØ—,‘,�Kr,   rl   c                   ó(   — e Zd ZdZdZdZdZdZdZdZ	y)Ú	PasteTypeÚPASTE_NORMALÚPASTE_VALUESÚPASTE_FORMATÚPASTE_NO_BORDERSÚPASTE_DATA_VALIDATIONÚPASTE_CONDITIONAL_FORMATTINGN)
r6   r7   r8   ÚnormalÚvaluesÚformatÚ
no_bordersrO   Údata_validationÚconditional_formatingr2   r,   r+   rt   rt   t   s&   „ Ø€FØ€FØ€FØ#€JØ €GØ-€OØ:Ñr,   rt   c                   ó   — e Zd ZdZdZy)ÚPasteOrientationÚNORMALÚ	TRANSPOSEN)r6   r7   r8   r{   Ú	transposer2   r,   r+   r‚   r‚   ~   s   „ Ø€FØ�Ir,   r‚   c                   ó   — e Zd ZdZdZy)ÚGridRangeTypeÚ
ValueRangeÚListOfListsN)r6   r7   r8   rˆ   r‰   r2   r,   r+   r‡   r‡   ƒ   s   „ Ø€JØ�Kr,   r‡   c                   óŒ   — 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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"y!)"ÚValidationConditionTypeÚNUMBER_GREATERÚNUMBER_GREATER_THAN_EQÚNUMBER_LESSÚNUMBER_LESS_THAN_EQÚ	NUMBER_EQÚNUMBER_NOT_EQÚNUMBER_BETWEENÚNUMBER_NOT_BETWEENÚTEXT_CONTAINSÚTEXT_NOT_CONTAINSÚTEXT_STARTS_WITHÚTEXT_ENDS_WITHÚTEXT_EQÚTEXT_IS_EMAILÚTEXT_IS_URLÚDATE_EQÚDATE_BEFOREÚ
DATE_AFTERÚDATE_ON_OR_BEFOREÚDATE_ON_OR_AFTERÚDATE_BETWEENÚDATE_NOT_BETWEENÚDATE_IS_VALIDÚONE_OF_RANGEÚONE_OF_LISTÚBLANKÚ	NOT_BLANKÚCUSTOM_FORMULAÚBOOLEANÚTEXT_NOT_EQÚDATE_NOT_EQÚFILTER_EXPRESSIONN)#r6   r7   r8   Únumber_greaterÚnumber_greater_than_eqÚnumber_lessÚnumber_less_than_eqÚ	number_eqÚnumber_not_eqÚnumber_betweenÚnumber_not_betweenÚtext_containsÚtext_not_containsÚtext_starts_withÚtext_ends_withÚtext_eqÚtext_is_emailÚtext_is_urlÚdate_eqÚdate_beforeÚ
date_afterÚdate_on_or_beforeÚdate_on_or_afterÚdate_betweenÚdate_not_betweenÚdate_is_validÚone_of_rangeÚone_of_listÚblankÚ	not_blankÚcustom_formulaÚbooleanÚtext_not_eqÚdate_not_eqÚfilter_expressionr2   r,   r+   r‹   r‹   ˆ   s«   „ Ø%€NØ5ÐØ€KØ/ÐØ€IØ#€MØ%€NØ-ÐØ#€MØ+ÐØ)ÐØ%€NØ€GØ#€MØ€KØ€GØ€KØ€JØ+ÐØ)ÐØ!€LØ)ÐØ#€MØ!€LØ€KØ€EØ€IØ%€NØ€GØ€KØ€KØ+Ñr,   r‹   c                   ó   — e Zd ZdZdZdZy)ÚTableDirectionÚTABLEÚDOWNÚRIGHTN)r6   r7   r8   ÚtableÚdownÚrightr2   r,   r+   rÍ   rÍ   «   s   „ Ø€EØ€DØ�Er,   rÍ   ÚcredentialsÚreturnc                 óÎ   — | j                   }| j                  j                  }d|v r|dk(  rt        | «      S d|v r|dv rt	        | «      S t        | t        «      r| S t        d«      ‚)NÚoauth2clientÚServiceAccountCredentials)ÚOAuth2CredentialsÚAccessTokenCredentialsÚGoogleCredentialszDCredentials need to be from either oauth2client or from google-auth.)r7   r*   r6   Ú_convert_service_accountÚ_convert_oauthr   r   r"   )rÔ   Úmoduler&   s      r+   Úconvert_credentialsrß   ±   sz   € Ø×#Ñ#€FØ
×
Ñ
×
(Ñ
(€CØ˜Ñ CÐ+FÒ$FÜ'¨Ó4Ð4Ø	˜6Ñ	! cð .ñ 'ô
 ˜kÓ*Ð*Ü	�K¤Ô	-ØÐä
ØNóð r,   c           	      ó°   — t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  «      S r.   )ÚUserCredentialsÚaccess_tokenÚrefresh_tokenÚid_tokenÚ	token_uriÚ	client_idÚclient_secretÚscopes)rÔ   s    r+   rÝ   rÝ   Ä   sN   € ÜØ× Ñ Ø×!Ñ!Ø×ÑØ×ÑØ×ÑØ×!Ñ!Ø×Ñóð r,   c                 ó¦   — | j                   }| j                  |d<   | j                  j                  «       xs ddg}t	        j
                  ||¬«      S )Nrå   z%https://www.googleapis.com/auth/drivez%https://spreadsheets.google.com/feeds)rè   )Úserialization_datarå   Ú_scopesÚsplitrØ   Úfrom_service_account_info)rÔ   Údatarè   s      r+   rÜ   rÜ   Ð   sV   € Ø×)Ñ)€DØ#×-Ñ-€DˆÑØ× Ñ ×&Ñ&Ó(ò Ø/Ø/ð-€Fô
 %×>Ñ>¸tÈFÔSÐSr,   ÚTÚfuncÚseqc                 ó,   ‡ — t        ˆ fd„|D «       «      S )zFFinds and returns first item in iterable for which func(item) is True.c              3   ó4   •K  — | ]  } ‰|«      sŒ|–— Œ y ­wr.   r2   )Ú.0Úitemrð   s     €r+   ú	<genexpr>zfinditem.<locals>.<genexpr>à   s   øè ø€ Ò3˜©¨T­
”Ñ3ùs   ƒ‘)Únext)rð   rñ   s   ` r+   Úfinditemrø   Þ   s   ø€ äÓ3 Ô3Ó3Ð3r,   FÚ r'   Ú
empty2zeroÚdefault_blankÚ%allow_underscores_in_numeric_literalsc                 ó  — | }t        | t        «      r:d| v r|s| S | j                  dd«      } | j                  dd«      }	 t        |«      }|S |S # t        $ r- 	 t        |«      }Y |S # t        $ r | dk(  r|rd}n|}Y Y |S w xY ww xY w)a“  Returns a value that depends on the input:

        - Float if input is a string that can be converted to Float
        - Integer if input is a string that can be converted to integer
        - Zero if the input is a string that is empty and empty2zero flag is set
        - The unmodified input value, otherwise.

    Examples::

        >>> numericise("faa")
        'faa'

    >>> numericise("3")
    3

    >>> numericise("3_2", allow_underscores_in_numeric_literals=False)
    '3_2'

    >>> numericise("3_2", allow_underscores_in_numeric_literals=True)
    32

    >>> numericise("3.1")
    3.1

    >>> numericise("2,000.1")
    2000.1

    >>> numericise("", empty2zero=True)
    0

    >>> numericise("", empty2zero=False)
    ''

    >>> numericise("", default_blank=None)
    >>>

    >>> numericise("", default_blank="foo")
    'foo'

    >>> numericise("")
    ''

    >>> numericise(None)
    >>>
    r4   rù   ú,r   )r   r   ÚreplaceÚintÚ
ValueErrorÚfloat)r'   rú   rû   rü   ÚnumericisedÚcleaned_values         r+   Ú
numericiser  ã   sµ   € ðf 8=€KÜ�%œÔØ�%‰<Ù8Ø�Ø—M‘M # rÓ*ˆEð Ÿ™ c¨2Ó.ˆð
	4Ü˜mÓ,ˆKð Ðˆ;Ðøô ò 	4ð4Ü# MÓ2‘ð Ðøô ò 4Ø˜B’;Ù!Ø&'™à&3˜ùàÐð4úð	4ús*   Á A Á	BÁA'Á'BÁ<BÂ BÂBr|   Úignorec           	      ó–   — |xs g }t        t        | «      «      D �cg c]   }|dz   |v r| |   nt        | |   |||¬«      ‘Œ" }}|S c c}w )aK  Returns a list of numericised values from strings except those from the
    row specified as ignore.

    :param list values: Input row
    :param bool empty2zero: (optional) Whether or not to return empty cells
        as 0 (zero). Defaults to ``False``.
    :param Any default_blank: Which value to use for blank cells,
        defaults to empty string.
    :param bool allow_underscores_in_numeric_literals: Whether or not to allow
        visual underscores in numeric literals
    :param list ignore: List of ints of indices of the row (index 1) to ignore
        numericising.
    r   )rú   rû   rü   )ÚrangeÚlenr  )r|   rú   rû   rü   r  ÚindexÚnumericised_lists          r+   Únumericise_allr  .  st   € ð* Š\�r€Fô œ3˜v›;Ó'öð ð �q‰y˜FÑ"ð �5ŠMäØ�u‘Ø%Ø+Ø6[ô	ñðÐð ð Ðùòs   �%AÚrowÚcolc                 óæ   — | dk  s|dk  rt        dj                  | |«      «      ‚|}d}|r3t        |d«      \  }}|dk(  rd}|dz  }t        |t        z   «      |z   }|rŒ3dj                  || «      }|S )a™  Translates a row and column cell address to A1 notation.

    :param row: The row of the cell to be converted.
        Rows start at index 1.
    :type row: int, str

    :param col: The column of the cell to be converted.
        Columns start at index 1.
    :type row: int, str

    :returns: a string containing the cell's coordinates in A1 notation.

    Example:

    >>> rowcol_to_a1(1, 1)
    A1

    r   z({}, {})rù   é   r   z{}{})r   r}   ÚdivmodÚchrÚMAGIC_NUMBER)r  r  ÚdivÚcolumn_labelÚmodÚlabels         r+   Úrowcol_to_a1r  V  sŠ   € ð& ˆQ‚w�#˜’'Ü  ×!2Ñ!2°3¸Ó!<Ó=Ð=à
€CØ€Lá
Ü˜C “_‰
ˆˆcØ�!Š8ØˆCØ�1‰HˆCÜ˜3¤Ñ-Ó.°Ñ=ˆò ð �M‰M˜,¨Ó,€Eà€Lr,   r  c                 ó2  — t         j                  | «      }|rv|j                  d«      j                  «       }t	        |j                  d«      «      }d}t        t        |«      «      D ]   \  }}|t        |«      t        z
  d|z  z  z  }Œ" ||fS t        | «      ‚)aT  Translates a cell's address in A1 notation to a tuple of integers.

    :param str label: A cell label in A1 notation, e.g. 'B1'.
        Letter case is ignored.
    :returns: a tuple containing `row` and `column` numbers. Both indexed
              from 1 (one).
    :rtype: tuple

    Example:

    >>> a1_to_rowcol('A1')
    (1, 1)

    r   é   r   r  )
ÚCELL_ADDR_REÚmatchÚgroupÚupperr   Ú	enumerateÚreversedÚordr  r   ©r  Úmr  r  r  ÚiÚcs          r+   Úa1_to_rowcolr&  {  s•   € ô 	×Ñ˜5Ó!€AÙØ—w‘w˜q“z×'Ñ'Ó)ˆÜ�!—'‘'˜!“*‹oˆàˆÜœh |Ó4Ó5ò 	5‰DˆAˆqØ”C˜“Fœ\Ñ)¨b°!©eÑ4Ñ4‰Cð	5ð
 �ˆ:Ðô ! Ó'Ð'r,   c                 óV  — t         j                  | «      }|rˆ|j                  «       \  }}|rHd}t        t	        |j                  «       «      «      D ]   \  }}|t        |«      t        z
  d|z  z  z  }Œ" nt        d«      }|rt        |«      }||fS t        d«      }||fS t        | «      ‚)a1  Translates a cell's address in A1 notation to a tuple of integers.

    Same as `a1_to_rowcol()` but allows for missing row or column part
    (e.g. "A" for the first column)

    :returns: a tuple containing `row` and `column` numbers. Both indexed
        from 1 (one).
    :rtype: tuple

    Example:

    >>> _a1_to_rowcol_unbounded('A1')
    (1, 1)

    >>> _a1_to_rowcol_unbounded('A')
    (inf, 1)

    >>> _a1_to_rowcol_unbounded('1')
    (1, inf)

    >>> _a1_to_rowcol_unbounded('ABC123')
    (123, 731)

    >>> _a1_to_rowcol_unbounded('ABC')
    (inf, 731)

    >>> _a1_to_rowcol_unbounded('123')
    (123, inf)

    >>> _a1_to_rowcol_unbounded('1A')
    Traceback (most recent call last):
        ...
    gspread.exceptions.IncorrectCellLabel: 1A

    >>> _a1_to_rowcol_unbounded('')
    (inf, inf)

    r   r  Úinf)ÚA1_ADDR_ROW_COL_REr  Úgroupsr  r   r  r!  r  r  r   r   r"  s          r+   Ú_a1_to_rowcol_unboundedr+  ›  s»   € ôN 	× Ñ  Ó'€AÙØŸH™H›JÑˆ�cñ ØˆCÜ!¤(¨<×+=Ñ+=Ó+?Ó"@ÓAò 9‘��1Øœ˜A›¤Ñ-°"°a±%Ñ8Ñ8‘ñ9ô ˜“,ˆCáÜ�c“(ˆCð �ˆ:Ðô	 ˜“,ˆCð �ˆ:Ðô ! Ó'Ð'r,   r3   Úsheet_idc                 ó0  — | j                  d«      \  }}}t        |«      \  }}t        |xs |«      \  }}||kD  r||}}||kD  r||}}|dz
  ||dz
  |dœ}	|	j                  «       D �
�ci c]  \  }
}t        |t        «      sŒ|
|“Œ }}
}|�||d<   |S c c}}
w )a2  Converts a range defined in A1 notation to a dict representing
    a `GridRange`_.

    All indexes are zero-based. Indexes are half open, e.g the start
    index is inclusive and the end index is exclusive: [startIndex, endIndex).

    Missing indexes indicate the range is unbounded on that side.

    .. _GridRange: https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#GridRange

    Examples::

        >>> a1_range_to_grid_range('A1:A1')
        {'startRowIndex': 0, 'endRowIndex': 1, 'startColumnIndex': 0, 'endColumnIndex': 1}

    >>> a1_range_to_grid_range('A3:B4')
    {'startRowIndex': 2, 'endRowIndex': 4, 'startColumnIndex': 0, 'endColumnIndex': 2}

    >>> a1_range_to_grid_range('A:B')
    {'startColumnIndex': 0, 'endColumnIndex': 2}

    >>> a1_range_to_grid_range('A5:B')
    {'startRowIndex': 4, 'startColumnIndex': 0, 'endColumnIndex': 2}

    >>> a1_range_to_grid_range('A1')
    {'startRowIndex': 0, 'endRowIndex': 1, 'startColumnIndex': 0, 'endColumnIndex': 1}

    >>> a1_range_to_grid_range('A')
    {'startColumnIndex': 0, 'endColumnIndex': 1}

    >>> a1_range_to_grid_range('1')
    {'startRowIndex': 0, 'endRowIndex': 1}

    >>> a1_range_to_grid_range('A1', sheet_id=0)
    {'sheetId': 0, 'startRowIndex': 0, 'endRowIndex': 1, 'startColumnIndex': 0, 'endColumnIndex': 1}
    ú:r   )ÚstartRowIndexÚendRowIndexÚstartColumnIndexÚendColumnIndexÚsheetId)Ú	partitionr+  Úitemsr   r   )r3   r,  Ústart_labelr4   Ú	end_labelÚstart_row_indexÚstart_column_indexÚend_row_indexÚend_column_indexÚ
grid_rangeÚkeyr'   Úfiltered_grid_ranges                r+   Úa1_range_to_grid_ranger?  Ø  sÙ   € ðJ !%§¡¨sÓ 3Ñ€K��Iä*AÀ+Ó*NÑ'€OÐ'ä&=¸iÒ>VÈ;Ó&WÑ#€MÐ#à˜Ò&Ø)6¸˜ˆàÐ,Ò,Ø/?ÐASÐ,Ðð )¨1Ñ,Ø$Ø.°Ñ2Ø*ñ	€Jð (2×'7Ñ'7Ó'9÷+Ù#˜˜U¼ZÈÌsÕ=SˆˆU‰
ð+Ðñ +ð ÐØ)1Ð˜IÑ&àÐùó+s   Á(BÂBÚcolumnc                 óÆ   — 	 t        | «      \  }}t	        |t
        «      st        dj                  | «      «      ‚|S # t        $ r t        dj                  | «      «      ‚w xY w)aT  Converts a column letter to its numerical index.

    This is useful when using the method :meth:`gspread.worksheet.Worksheet.col_values`.
    Which requires a column index.

    This function is case-insensitive.

    Raises :exc:`gspread.exceptions.InvalidInputValue` in case of invalid input.

    Examples::

        >>> column_letter_to_index("a")
        1

    >>> column_letter_to_index("A")
    1

    >>> column_letter_to_index("AZ")
    52

    >>> column_letter_to_index("!@#$%^&")
    ...
    gspread.exceptions.InvalidInputValue: invalid value: !@#$%^&, must be a column letter
    z*invalid value: {}, must be a column letter)r+  r   r   r}   r   r   )r@  r4   r
  s      r+   Úcolumn_letter_to_indexrB    sq   € ð2
Ü,¨VÓ4‰
ˆˆEô �eœSÔ!ÜØ8×?Ñ?ÀÓGó
ð 	
ð €Løô ò 
ô  Ø8×?Ñ?ÀÓGó
ð 	
ð
ús	   ‚< ¼$A Úmethod.c           	      ó–   ‡ ‡— dt         t        df   dt        fd„Št        ‰ «      dt        dt        dt        dt        fˆˆ fd„«       }|S )zYDecorator function casts wrapped arguments to A1 notation in range
    method calls.
    r(   .rÕ   c                 ó¦   — t        | d   t        «      xr= t        | d   t        «      xr( t        | d   t        «      xr t        | d   t        «      S )Nr   r   r  é   )r   r   )r(   s    r+   Úcontains_row_colsz.cast_to_a1_notation.<locals>.contains_row_colsI  sP   € ä�t˜A‘w¤Ó$ò )Ü˜4 ™7¤CÓ(ò)ä˜4 ™7¤CÓ(ò)ô ˜4 ™7¤CÓ(ð		
r,   r/   r)   c                 óÌ   •— 	 t        |«      dk\  r: ‰|«      r2t        |d d Ž }t        |dd Ž }dj                  ||f«      }|f|dd  z   } ‰| g|¢­i |¤ŽS # t        $ r Y Œw xY w)Né   r  r.  )r	  r  Újoinr  )r/   r(   r)   Úrange_startÚ	range_endÚ
range_namerG  rC  s         €€r+   Úwrapperz$cast_to_a1_notation.<locals>.wrapperQ  s�   ø€ ð	Ü�4‹y˜AŠ~Ñ"3°DÔ"9ô +¨D°°!¨HÐ5�ä(¨$¨q°¨)Ð4�	Ø ŸX™X {°IÐ&>Ó?�
à"�} t¨A¨B xÑ/�ñ �dÐ,˜TÒ, VÑ,Ð,øô ò 	Ùð	ús   ƒAA Á	A#Á"A#)r   r   Úboolr   )rC  rN  rG  s   ` @r+   Úcast_to_a1_notationrP  D  sY   ù€ ð

¤¤c¨3 h¡ð 
´Dó 
ô ˆ6ƒ]ð-”cð -¤#ð -´ð -¼õ -ó ð-ð  €Nr,   Úurlc                 ó®   — t         j                  | «      }|r|j                  d«      S t        j                  | «      }|r|j                  d«      S t        ‚)Nr   )ÚURL_KEY_V2_REÚsearchr  ÚURL_KEY_V1_REr   )rQ  Úm2Úm1s      r+   Úextract_id_from_urlrX  e  sJ   € Ü	×	Ñ	˜cÓ	"€BÙ	Ø�x‰x˜‹{Ðä	×	Ñ	˜cÓ	"€BÙ	Ø�x‰x˜‹{Ðä
Ðr,   Úwidc                 ó€   — t        | «      dkD  r| dd n| }t        | «      dkD  rdnd}t        t        |d«      |z  «      S )z*Calculate gid of a worksheet from its wid.rF  r   NiÚ  iZ{  é$   )r	  r   r   )rY  ÚwidvalÚxorvals      r+   Ú
wid_to_gidr^  q  s@   € ä˜C› 1šˆS��‰W¨#€FÜ˜“H˜q’L‰S e€FÜŒs�6˜2‹ Ñ'Ó(Ð(r,   Úmax_lenÚpadding_valuec                 ó>   — |t        | «      z
  }|dk7  r	| |g|z  z   S | S )Nr   ©r	  )r  r_  r`  Úpad_lens       r+   Úrightpadrd  x  s-   € Øœ˜C›Ñ €GØ07¸1²ˆ3�=�/ GÑ+Ñ,ÐEÀ#ÐEr,   ÚLr>   r?   c                 óæ   — 	 |€t        d„ | D «       «      n|}|€t        | «      n|}|t        | «      z
  }|r	| g g|z  z   } | D �cg c]  }t        |||¬«      ‘Œ c}S c c}w # t        $ r g gcY S w xY w)a7  Fill gaps in a list of lists.
    e.g.,::

        >>> L = [
        ... [1, 2, 3],
        ... ]
        >>> fill_gaps(L, 2, 4)
        [
            [1, 2, 3, ""],
            ["", "", "", ""]
        ]

    :param L: List of lists to fill gaps in.
    :param rows: Number of rows to fill.
    :param cols: Number of columns to fill.
    :param padding_value: Default value to fill gaps with.

    :type L: list[list[T]]
    :type rows: int
    :type cols: int
    :type padding_value: T

    :return: List of lists with gaps filled.
    :rtype: list[list[T]]:
    c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr.   rb  ©rô   r  s     r+   rö   zfill_gaps.<locals>.<genexpr>�  s   è ø€ Ò- C”s˜3—xÑ-ùs   ‚)r`  )Úmaxr	  rd  r  )re  r>   r?   r`  Úmax_colsÚmax_rowsÚpad_rowsr  s           r+   Ú	fill_gapsrm  }  s€   € ð>Ø15°”3Ñ-¨1Ô-Ô-À4ˆØ!˜\”3�q”6¨tˆàœc !›fÑ$ˆáØ�b�T˜H‘_Ñ%ˆAàPQÖRÈ”˜˜h°mÖDÒRÐRùÒRøÜò ØˆtŠðús$   ‚AA! ÁAÁA! ÁA! Á!A0Á/A0Ú	cell_listr   c           
      óT  — | sg S t        t        «      }t        d„ | D «       «      }t        d„ | D «       «      }| D ]F  }|j                  t	        |j
                  «      |z
  i «      }|j                  ||j                  |z
  <   ŒH |sg S t        j                  d„ |j                  «       D «       «      }t        t        |«      dz   «      }t        t        |j                  «       «      dz   «      }|D �	�
cg c]$  }	|D �
cg c]  }
||	   j                  |
«      ‘Œ c}
‘Œ& c}
}	S c c}
w c c}
}	w )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr.   )r  ©rô   r%  s     r+   rö   z$cell_list_to_rect.<locals>.<genexpr>°  ó   è ø€ Ò.˜q�Q—U•UÑ.ùó   ‚c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr.   )r  rq  s     r+   rö   z$cell_list_to_rect.<locals>.<genexpr>±  rr  rs  c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr.   )Úkeysrh  s     r+   rö   z$cell_list_to_rect.<locals>.<genexpr>º  s   è ø€ Ò&K°c s§x¡x§zÑ&Kùs   ‚r   )r   ÚdictÚminÚ
setdefaultr   r  r'   r  r   Úfrom_iterabler|   r  ri  rv  Úget)rn  r>   Ú
row_offsetÚ
col_offsetÚcellr  Úall_row_keysÚ	rect_colsÚ	rect_rowsr$  Újs              r+   Úcell_list_to_rectrƒ  ª  sü   € ÙØˆ	ä0;¼DÓ0A€DäÑ. IÔ.Ó.€JÜÑ. IÔ.Ó.€Jàò 0ˆØ�o‰oœc $§(¡(›m¨jÑ8¸"Ó=ˆØ%)§Z¡ZˆˆD�H‰H�zÑ!Ò"ð0ñ Øˆ	ä×&Ñ&Ñ&K¸T¿[¹[»]Ô&KÓK€LÜ”c˜,Ó'¨!Ñ+Ó,€IÜ”c˜$Ÿ)™)›+Ó&¨Ñ*Ó+€Ið :C×C°A YÖ/ ˆT�!‰W�[‰[˜�^Ô/ÓCÐCùÒ/ùÓCs   Ã2	D$Ã;DÄD$ÄD$ÚsafeÚencodingc                 ó8   — t        | j                  |«      |«      S r.   )ÚuquoteÚencode)r'   r„  r…  s      r+   r   r   Å  s   € Ü�%—,‘,˜xÓ(¨$Ó/Ð/r,   Ú
sheet_namerM  c                 óp   — dj                  | j                  dd«      «      } |rdj                  | |«      S | S )a­  Return an absolutized path of a range.

    >>> absolute_range_name("Sheet1", "A1:B1")
    "'Sheet1'!A1:B1"

    >>> absolute_range_name("Sheet1", "A1")
    "'Sheet1'!A1"

    >>> absolute_range_name("Sheet1")
    "'Sheet1'"

    >>> absolute_range_name("Sheet'1")
    "'Sheet''1'"

    >>> absolute_range_name("Sheet''1")
    "'Sheet''''1'"

    >>> absolute_range_name("''sheet12''", "A1:B2")
    "'''''sheet12'''''!A1:B2"
    z'{}'ú'z''z{}!{})r}   rÿ   )r‰  rM  s     r+   Úabsolute_range_namerŒ  É  s9   € ð* —‘˜z×1Ñ1°#°tÓ<Ó=€JáØ�~‰~˜j¨*Ó5Ð5àÐr,   Úxc                 óH   — t        | t        «      xs t        | t        «       S )a1  Return True if the value is scalar.

    A scalar is not a sequence but can be a string.

    >>> is_scalar([])
    False

    >>> is_scalar([1, 2])
    False

    >>> is_scalar(42)
    True

    >>> is_scalar('nice string')
    True

    >>> is_scalar({})
    True

    >>> is_scalar(set())
    True
    )r   r   r   )r�  s    r+   Ú	is_scalarr�  æ  s    € ô. �aœÓÒ<¤Z°´8Ó%<Ð!<Ð<r,   Úworksheet_metadatar8  Ústart_col_indexc                 ó®  — | j                  dg «      }|D �cg c]  }t        |«      ‘Œ }}t        |«      dz
  }t        |d   «      dz
  }|D ]�  }	|	d   |	d   }}
|	d   |	d   }}|
|z  }
||z  }||z  }||z  }|
|kD  s||kD  rŒ6|
dk  s|dk  rŒA||
   |   }t        |
|«      }t        ||«      }|D ]  }|D ]  }||kD  s||kD  rŒ|||   |<   Œ Œ Œƒ |S c c}w )a“  For each merged region, replace all values with the value of the top-left cell of the region.
    e.g., replaces
    [
    [1, None, None],
    [None, None, None],
    ]
    with
    [
    [1, 1, None],
    [1, 1, None],
    ]
    if the top-left four cells are merged.

    :param worksheet_metadata: The metadata returned by the Google API for the worksheet.
        Should have a "merges" key.

    :param values: The values returned by the Google API for the worksheet. 2D array.

    :param start_row_index: The index of the first row of the values in the worksheet.
        e.g., if the values are in rows 3-5, this should be 2.

    :param start_col_index: The index of the first column of the values in the worksheet.
        e.g., if the values are in columns C-E, this should be 2.

    :returns: matrix of values with merged coordinates filled according to top-left value
    :rtype: list(list(any))
    Úmergesr   r   r/  r0  r1  r2  )r{  Úlistr	  r  )r�  r|   r8  r‘  r“  r  Ú
new_valuesÚmax_row_indexÚmax_col_indexÚmergeÚmerge_start_rowÚmerge_end_rowÚmerge_start_colÚmerge_end_colÚtop_left_valueÚrow_indicesÚcol_indicesÚ	row_indexÚ	col_indexs                      r+   Úcombined_merge_valuesr¢     sR  € ðB  ×#Ñ# H¨bÓ1€Fà'-Ö. ”$�s•)Ð.€JÐ.ô ˜“K !‘O€MÜ˜˜q™	“N QÑ&€Màò BˆØ).¨Ñ)?ÀÀ}ÑAU˜ˆàÐ$Ñ%ØÐ"Ñ#ð 'ˆð
 	˜?Ñ*ˆØ˜Ñ(ˆØ˜?Ñ*ˆØ˜Ñ(ˆà˜]Ò*¨oÀÒ.MØØ˜QÒ /°AÒ"5ØØ Ñ0°ÑAˆÜ˜O¨]Ó;ˆÜ˜O¨]Ó;ˆØ$ò 	BˆIØ(ò B�	à˜}Ò,°	¸MÒ0IØØ3A�
˜9Ñ% iÒ0ñ	Bñ	Bð'Bð4 ÐùòA /s   —CÚ	hex_colorc                 ó˜  — | j                  d«      } t        | «      dk(  r| dd } t        | «      dk(  r"dj                  | D �cg c]  }|dz  ‘Œ	 c}«      } t        | «      dk7  rt        d	«      ‚	 t	        | d
d d«      dz  t	        | dd d«      dz  t	        | dd d«      dz  dœ}|S c c}w # t        $ r}t        d| › �«      |‚d}~ww xY w)a  Convert a hex color code to RGB color values.

    :param str hex_color: Hex color code in the format "#RRGGBB".

    :returns: Dict containing the color's red, green and blue values between 0 and 1.
    :rtype: dict

    :raises:
        ValueError: If the input hex string is not in the correct format or length.

    Examples:
        >>> convert_hex_to_colors_dict("#3300CC")
        {'red': 0.2, 'green': 0.0, 'blue': 0.8}

        >>> convert_hex_to_colors_dict("#30C")
        {'red': 0.2, 'green': 0.0, 'blue': 0.8}

    ú#é   NéþÿÿÿrF  rù   r  é   z/Hex color code must be in the format '#RRGGBB'.r   é   éÿ   rI  )ÚredÚgreenÚbluez(Invalid character in hex color string: #)Úlstripr	  rJ  r  r   )r£  ÚcharÚ	rgb_colorÚexs       r+   Úconvert_hex_to_colors_dictr²  F  só   € ð& × Ñ  Ó%€Iô
 ˆ9ƒ~˜ÒØ˜c˜r�Nˆ	ô ˆ9ƒ~˜ÒØ—G‘G°)Ö<¨$˜T A›XÒ<Ó=ˆ	ä
ˆ9ƒ~˜ÒÜÐJÓKÐKð	Yä�y  1�~ rÓ*¨SÑ0Ü˜ 1 Q˜¨Ó,¨sÑ2Ü˜	 ! A˜¨Ó+¨cÑ1ñ
ˆ	ð Ðùò =øô ò YÜÐCÀIÀ;ÐOÓPÐVXÐXûðYús   ÁB'Á/7B, Â,	C	Â5CÃC	r«  r¬  r­  c                 ó˜   — dt         dt        fd„}t        d„ | ||fD «       «      rt        d«      ‚d || «      ›  ||«      ›  ||«      › �S )aü  Convert RGB color values to a hex color code.

    :param float red: Red color value (0-1).
    :param float green: Green color value (0-1).
    :param float blue: Blue color value (0-1).

    :returns: Hex color code in the format "#RRGGBB".
    :rtype: str

    :raises:
        ValueError: If any color value is out of the accepted range (0-1).

    Example:

        >>> convert_colors_to_hex_value(0.2, 0, 0.8)
        '#3300CC'

        >>> convert_colors_to_hex_value(green=0.5)
        '#008000'
    r'   rÕ   c                 ót   — t        t        | dz  «      «      dd }|j                  «       j                  d«      S )zG
        Convert an integer to a 2-digit uppercase hex string.
        rª  r  N)ÚhexÚroundr  Úzfill)r'   Ú	hex_values     r+   Úto_hexz+convert_colors_to_hex_value.<locals>.to_hexŒ  s6   € ô œ˜e c™kÓ*Ó+¨A¨BÐ/ˆ	Ø�‰Ó ×&Ñ& qÓ)Ð)r,   c              3   ó4   K  — | ]  }|d k  xs |dkD  –— Œ y­w)r   r   Nr2   )rô   r'   s     r+   rö   z.convert_colors_to_hex_value.<locals>.<genexpr>“  s    è ø€ Ò
B eˆ5�1‰9Ò!˜ ™	Ó!Ñ
Bùrs  z&Color value out of accepted range 0-1.r¥  )r  r   Úanyr  )r«  r¬  r­  r¹  s       r+   Úconvert_colors_to_hex_valuer¼  t  sY   € ð0*”eð *¤ó *ô Ñ
B°°U¸DÐ/AÔ
BÔBÜÐAÓBÐBà‰v�c‹{ˆm™F 5›M˜?©6°$«<¨.Ð9Ð9r,   c                 ó0   — t         j                  | «      duS )a”  Check if the range name is a full A1 notation.
    "A1:B2", "Sheet1!A1:B2" are full A1 notations
    "A1:B", "A1" are not

    Args:
        range_name (str): The range name to check.

    Returns:
        bool: True if the range name is a full A1 notation, False otherwise.

    Examples:

        >>> is_full_a1_notation("A1:B2")
        True

        >>> is_full_a1_notation("A1:B")
        False
    N)ÚA1_ADDR_FULL_RErT  ©rM  s    r+   Úis_full_a1_notationrÀ  ™  s   € ô& ×!Ñ! *Ó-°TÐ9Ð9r,   c                 ó6   — d| v r| j                  d«      d   S | S )züGet the A1 notation from an absolute range name.
    "Sheet1!A1:B2" -> "A1:B2"
    "A1:B2" -> "A1:B2"

    Args:
        range_name (str): The range name to check.

    Returns:
        str: The A1 notation of the range name stripped of the sheet.
    ú!r   )rì   r¿  s    r+   Úget_a1_from_absolute_rangerÃ  ¯  s(   € ð ˆjÑØ×Ñ Ó$ QÑ'Ð'ØÐr,   Úheadersc           	      óR   — |D �cg c]  }t        t        | |«      «      ‘Œ c}S c c}w )aÂ  Builds the list of dictionaries, all of them have the headers sequence as keys set,
    each key is associated to the corresponding value for the same index in each list from
    the matrix ``values``.
    There are as many dictionaries as they are entry in the list of given values.

    :param list: headers the key set for all dictionaries
    :param list: values a matrix of values

    Examples::

        >>> to_records(["name", "City"], [["Spiderman", "NY"], ["Batman", "Gotham"]])
        [
            {
                "Name": "Spiderman",
                "City": "NY",
            },
            {
                "Name": "Batman",
                "City": "Gotham",
            },
        ]
    )rw  rj   )rÄ  r|   r  s      r+   Ú
to_recordsrÆ  ¿  s$   € ð4 06Ö6¨ŒD”�W˜cÓ"Õ#Ò6Ð6ùÒ6s   …$ÚstartÚendc                 óX   — 	 | |   j                  d||«      dz
  S # t        $ r |cY S w xY w)zöThis is a private function, returning the column index of the last non empty cell
    on the given row.

    Search starts from ``start`` index column.
    Search ends on ``end`` index column.
    Searches only in the row pointed by ``row``.
    rù   r   )r
  r  )r|   rÇ  rÈ  r  s       r+   Ú_expand_rightrÊ  Ü  s9   € ðØ�c‰{× Ñ   U¨CÓ0°1Ñ4Ð4øÜò ØŠ
ðús   ‚ ›)¨)c                 ó°   — t        ||«      D ]C  }|t        | «      k\  rt        | «      dz
  c S |t        | |   «      k\  s| |   |   dk(  sŒ>|dz
  c S  |dz
  S )zóThis is a private function, returning the row index of the last non empty cell
    on the given column.

    Search starts from ``start`` index row.
    Search ends on ``end`` index row.
    Searches only in the column pointed by ``col``.
    r   rù   )r  r	  )r|   rÇ  rÈ  r  r>   s        r+   Ú_expand_bottomrÌ  ê  sk   € ô �e˜SÓ!ò ˆà”3�v“;ÒÜ�v“; ‘?Ò"ð ”#�f˜T‘lÓ#Ò# v¨d¡|°CÑ'8¸BÓ'>Ø˜!‘8ŠOðð �‰7€Nr,   Ústart_rangeÚ	directionc           	      ó”  — t        |«      \  }}|dz  }|dz  }|t        | «      k\  r$t        dj                  |t        | «      «      «      ‚|t        | |   «      k\  r't        dj                  |t        | |   «      «      «      ‚|t        j
                  k(  r|}t        | |t        | «      |«      }|t        j                  k(  r|}t        | |t        | |   «      |«      }|t        j                  k(  r1t        | |t        | |   «      |«      }t        | |t        | «      |«      }g }| |dz    D ]  }|j                  ||dz    «       Œ |S )aû  Expands a list of values based on non-null adjacent cells.

    Expand can be done in 3 directions defined in :class:`~gspread.utils.TableDirection`

        * ``TableDirection.right``: expands right until the first empty cell
        * ``TableDirection.down``: expands down until the first empty cell
        * ``TableDirection.table``: expands right until the first empty cell and down until first empty cell

    In case of empty result an empty list is restuned.

    When the given ``start_range`` is outside the given matrix of values the exception
    :class:`~gspread.exceptions.InvalidInputValue` is raised.

    Example::

        values = [
            ['', '',   '',   '', ''  ],
            ['', 'B2', 'C2', '', 'E2'],
            ['', 'B3', 'C3', '', 'E3'],
            ['', ''  , ''  , '', 'E4'],
        ]
        >>> utils.find_table(TableDirection.table, 'B2')
        [
            ['B2', 'C2'],
            ['B3', 'C3'],
        ]


    .. note::

       the ``TableDirection.table`` will look right from starting cell then look down from starting cell.
       It will not check cells located inside the table. This could lead to
       potential empty values located in the middle of the table.

    .. warning::

       Given values must be padded with `''` empty values.

    :param list[list] values: values where to find the table.
    :param gspread.utils.TableDirection direction: the expand direction.
    :param str start_range: the starting cell range.
    :rtype list(list): the resulting matrix
    r   z\given row for start_range is outside given values: start range row ({}) >= rows in values {}zegiven column for start_range is outside given values: start range column ({}) >= columns in values {})r&  r	  r   r}   rÍ   rÒ   rÌ  rÓ   rÊ  rÑ   Úappend)	r|   rÍ  rÎ  r  r  Ú	rightMostÚ
bottomMostÚresultr>   s	            r+   Ú
find_tablerÔ  þ  sb  € ô` ˜KÓ(�H€Cˆð ˆ1�H€CØˆ1�H€Cà
Œc�&‹kÒÜØj×qÑqØ”S˜“[óó
ð 	
ð Œc�&˜‘+ÓÒÜØs×zÑzØ”S˜ ™Ó%óó
ð 	
ð ”N×'Ñ'Ò'Øˆ	Ü# F¨C´°V³¸cÓBˆ
à”N×(Ñ(Ò(Øˆ
Ü! &¨#¬s°6¸#±;Ó/?ÀÓEˆ	à”N×(Ñ(Ò(Ü! &¨#¬s°6¸#±;Ó/?ÀÓEˆ	Ü# F¨C´°V³¸cÓBˆ
à€Fð �s˜Z¨!™^Ð,ò 1ˆØ�‰�d˜3 ¨Q¡Ð/Õ0ð1ð €Mr,   Ú__main__)Frù   Fr.   )rù   )NNrù   )rù   zutf-8)ç        rÖ  rÖ  )cÚ__doc__r    ÚreÚcollectionsr   Úcollections.abcr   Ú	functoolsr   Ú	itertoolsr   Útypingr   r   r	   r
   r   r   r   r   r   r   r   r   Úurllib.parser   r‡  Úgoogle.auth.credentialsr   Úgoogle.oauth2.credentialsrá   Úgoogle.oauth2.service_accountrØ   Ú
exceptionsr   r   r   r~  r   r  Úcompiler  r)  r¾  rU  rS  r   ÚEnumr   r;   rA   rI   rQ   rW   r]   rc   rl   rt   r‚   r‡   r‹   rÍ   rß   rÝ   rÜ   rï   rO  rø   r   r  r  r  r  r&  ÚIntOrInfr+  r?  rB  rP  rX  r^  rd  rm  rƒ  rŒ  r�  r¢  r²  r¼  rÀ  rÃ  rÆ  rÊ  rÌ  rÑ   rÔ  r6   ÚdoctestÚtestmodr2   r,   r+   ú<module>rè     sP  ðñó Û 	Ý #Ý $Ý Ý ÷÷ ÷ ó õ )å >Ý DÝ Rç QÑ QáÝð €Øˆr�z‰zÐ2Ó3€Ø�R—Z‘ZÐ ;Ó<Ð Ø�"—*‘*Ð9Ó:€à�—
‘
˜?Ó+€Ø�—
‘
Ð>Ó?€ôˆc�4—9‘9ô ô�ô ô
�ô ô˜ô ô"�wô "ô
 �wô  ô
*�Wô *ô
ˆwô ô�7ô ô;�ô ;ô�wô ô
 �Gô  ô
 ,˜gô  ,ôF�Wô ð [ð °[ó ð&	 ð 	¨ó 	ðT¨#ð T°+ó Tñ ˆCƒL€ð4�8˜Q˜C ˜IÑ&ð 4¨X°a©[ð 4¸Qó 4ð ØØ27ñ	HØ�FÑðHàðHð ðHð ,0ð	Hð
 ˆe�C˜ Ð&Ñ'Ñ(óHðZ ØØ27Øñ%Ø�‰Lð%àð%ð ð%ð ,0ð	%ð
 �‰Ið%ð 
ˆ(�5˜˜e VÐ+Ñ,Ñ
-Ñ.ó%ðP"�cð " ð "¨ó "ðJ˜ð   c¨3 h¡ó ð: ��e�Ñ€ð: 3ð :¨5°¸8Ð1CÑ+Dó :ñz? ð ?°¸±ð ?ÈÈcÐSVÈhÉó ?ðD' 3ð '¨3ó 'ðT ¨¨a¨Ñ 0ð °X¸cÀ1¸fÑ5Eó ðB	˜Sð 	 Só 	ð)�Cð )˜Có )ñF�$�s‘)ð F cð F¸#ð FÀtÈCÁyó Fð ØØñ	*ØˆD�‰I�ð*à
�3‰-ð*ð �3‰-ð*ð ð	*ð
 
ˆ$ˆs‰)�_ó*ðZD  f¡ð D°$°t¸HÀS¹MÑ7JÑ2Kó Dñ60�ð 0˜Cð 0°ð 0À#ó 0ñ Cð °X¸c±]ð Ècó ð:=�ð =˜ó =ð4CØ  S Ñ)ðCà��c‘‰OðCð ðCð ð	Cð
 
ˆ$ˆs‰)�_óCðL+Y¨#ð +Y°'¸#¸u¸*Ñ2Eó +Yð^ 9<ñ":Ø	ð":Ø"ð":Ø05ð":àó":ðJ: Cð :¨Dó :ð,¨3ð °3ó ð"  ÀBÀ4ñ7Ø�c‰]ð7Ø)1°(¸3±-Ñ)@ð7à	ˆ$ˆs�E˜#˜s E˜/Ñ*Ð*Ñ
+Ñ,ó7ð:˜$˜t C™y™/ð °#ð ¸Cð Àcð Ècó ð˜4  S¡	™?ð °3ð ¸Sð Àsð Èsó ð. !/× 4Ñ 4ñVØ��c‘‰OðVàðVð ðVð 
ˆ$ˆs‰)�_ó	Vðl ˆzÒÛà€G‡O�OÕð r,   