Ë
    u™ãjÜ²  ã                  óØ  — d Z ddlmZ ddlZddlmZ ddlZddlZddlmZ ddl	Z	ddl
ZddlmZ ddlmZ ddlmZmZmZmZmZ dd	lmZ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" ddl#Z$ddl#m%Z%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.c m/c m0Z1 ddl2m3Z3 er
ddl4m5Z5m6Z6m7Z7  e&d«      Z8 e&d«      Z9ejt                  	 	 	 	 dd„«       Z;dZ<dZ=d d„Z>d!d„Z? G d„ d«      Z@ G d„ de3«      ZAy)"a�  
Read SAS7BDAT files

Based on code written by Jared Hobbs:
  https://bitbucket.org/jaredhobbs/sas7bdat

See also:
  https://github.com/BioStatMatt/sas7bdat

Partial documentation of the file format:
  https://cran.r-project.org/package=sas7bdat/vignettes/sas7bdat.pdf

Reference for binary data compression:
  http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/CUJ/1992/9210/ross/ross.htm
é    )ÚannotationsN)Údatetime)ÚTYPE_CHECKING)Úusing_string_dtype)Úlib)Úread_double_with_byteswapÚread_float_with_byteswapÚread_uint16_with_byteswapÚread_uint32_with_byteswapÚread_uint64_with_byteswap)ÚParserÚcollect_page_subheaders)Úcast_from_unit_vectorized)ÚHAS_PYARROW)ÚEmptyDataErrorÚOutOfBoundsDatetimeÚPandas4Warning)Úfind_stack_level)Ú	DataFrameÚ	Timestamp)ÚStringDtype)ÚArrowStringArray)Ú
get_handle)Ú	SASReader)ÚCompressionOptionsÚFilePathÚ
ReadBufferz
1970-01-01z
1960-01-01c                ó˜  ‡ ‡— 	 t        t        t        d«      «      j                  ‰ d¬«      «      dk7  ry	 g Šg }t        d«      D ]N  }	 t        |g«      j                  ‰ «      }t        |«      dk7  r y‰j                  |j                  d«      «       ŒP |D ]1  }t        d«      D ]!  }	 t        ||g«      j                  ‰ «         y Œ3 d}|j                  ‰ d«      dj                  ˆ fd	„|D «       «      k7  ryt        d
„ ‰D «       d¬«      }t        j                  d|z  t        j                  ¬«      }t        j                  dt        j                   t        j                  ¬«      }t#        ‰«      D ]6  \  }}	|	€Œ	t        |	«      ||<   t%        |	«      |||z  ||z  t        |	«      z    Œ8 t'        ˆfd„t        d«      D «       «      }
d|j(                  _        d|j(                  _        |||
fS # t        t
        f$ r Y yw xY w# t        $ r& ‰j                  d«       |j                  |«       Y �Œòw xY w# t        $ r Y �Œ¡w xY w)uT  
    Build a byte -> utf-8 lookup table for a single-byte `encoding`.

    Returns ``(table, lengths, ascii_identity)``, where ``table`` is a flat
    ``(256 * width,)`` array whose ``b``-th row holds the utf-8 encoding of
    source byte ``b``, ``lengths[b]`` is that encoding's length (or
    ``const.undefined_byte`` if `encoding` does not define ``b``), and
    ``ascii_identity`` says whether every byte below 0x80 maps to itself, which
    lets the parser memcpy ascii runs instead of translating byte by byte.

    Returns None if `encoding` is not a simple single-byte encoding â€” the
    multi-byte CJK encodings SAS can declare (shift_jis, big5, cp936, ...) and
    utf-8 itself, none of which have a per-byte translation.

    Cached because the probing below costs far more than a chunk's parse; the
    tables are tiny and read-only.
    é   Úreplace)ÚerrorsNé   úutf-8s   \u0041Ú c              3  óV   •K  — | ]   }t        |g«      j                  ‰d «      –— Œ" y­w)r    N)ÚbytesÚdecode)Ú.0ÚvalueÚencodings     €úa/var/www/html/python-recuperauto-other/env/lib/python3.12/site-packages/pandas/io/sas/sas7bdat.pyú	<genexpr>z*_utf8_translation_table.<locals>.<genexpr>ˆ   s)   øè ø€ ò 4Ø7<Œˆuˆg‹×Ñ˜h¨	×2ñ4ùs   ƒ&)c              3  ó8   K  — | ]  }|€Œt        |«      –— Œ y ­w©N)Úlen)r(   Úutf8s     r+   r,   z*_utf8_translation_table.<locals>.<genexpr>�   s   è ø€ ÒC˜t°$Ñ2B”�T—ÑCùs   ‚Š)Údefault©Údtypec              3  óB   •K  — | ]  }‰|   t        |g«      k(  –— Œ y ­wr.   )r&   )r(   r)   Úencodeds     €r+   r,   z*_utf8_translation_table.<locals>.<genexpr>”   s    øè ø€ ÒS¸e˜ ™¬5°%°«>Õ9ÑSùs   ƒé€   F)r/   r&   Úranger'   ÚLookupErrorÚUnicodeErrorÚUnicodeDecodeErrorÚappendÚencodeÚjoinÚmaxÚnpÚzerosÚuint8ÚfullÚconstÚundefined_byteÚ	enumerateÚ	bytearrayÚallÚflagsÚ	writeable)r*   Ú	undefinedr)   ÚcharÚfollowerÚprobeÚwidthÚtableÚlengthsr0   Úascii_identityr5   s   `          @r+   Ú_utf8_translation_tablerR   K   s<  ù€ ð2ÜŒu”U˜3“ZÓ ×'Ñ'¨¸Ð'ÓCÓDÈÒKØð Lð
 #%€GØ€IÜ�s“ò 	-ˆð	Ü˜%˜“>×(Ñ(¨Ó2ˆDô
 ˆt‹9˜Š>ÙØ�‰�t—{‘{ 7Ó+Õ,ð	-ð  ò ˆÜ˜c›
ò 	ˆHðÜ�u˜hÐ'Ó(×/Ñ/°Ô9ò ñ	ðð €EØ‡|�|�H˜iÓ(¨B¯G©Gó 4Ø@Eô4ó -ò ð äÑC wÔCÈQÔO€EÜ�H‰H�S˜5‘[¬¯©Ô1€EÜ�g‰g�cœ5×/Ñ/´r·x±xÔ@€GÜ  Ó)ò O‰ˆˆtØÑÜ  ›YˆG�E‰NÜ?HÈ»ˆE�%˜%‘- %¨%¡-´#°d³)Ñ";Ñ<ðOô ÓSÄuÈTÃ{ÔSÓS€Nà!€E‡K�KÔØ#€G‡M�MÔØ�'˜>Ð)Ð)øôc œÐ&ò Ùðûô "ò 	Ø�N‰N˜4Ô Ø×Ñ˜UÔ#Úð	ûô" &ò Úðús5   „1G5 Á
H
Â+H<Ç5HÈHÈ
+H9È8H9È<	I	ÉI	iÂ^ i«©! c                óx  — |dk(  rdnd}t        j                  t        t        gt         j                  ¬«      |z  }t        j
                  t        | «      t         j                  ¬«      }t        j                  | «       }|D ]5  }||xx   | |   |k\  j                  t         j                  «      |z  z  cc<   Œ7 |S )a%  
    Compute the additive correction (in `unit`) to convert SAS day/second counts
    to proleptic Gregorian day/second counts.

    SAS omits Feb 29 for years divisible by 4000 (unlike proleptic Gregorian);
    this adds back the missing days. `unit` must be "d" (days) or "s" (seconds).
    Úsi€Q r"   r2   )
r?   ÚarrayÚ_SAS_MARCH1_4000Ú_SAS_MARCH1_8000Úint64r@   r/   Úfloat64ÚisnanÚastype)ÚvaluesÚunitÚscaleÚ
thresholdsÚ
correctionÚvalidÚ	thresholds          r+   Ú_sas_to_gregorian_correctionrc   £   sŸ   € ð ˜S’[‰E a€EÜ—‘Ô+Ô-=Ð>ÄbÇhÁhÔOÐRWÑW€JÜ—‘œ#˜f›+¬R¯Z©ZÔ8€JÜ�X‰X�fÓÐ€EØò Uˆ	Ø�5Ó˜f U™m¨yÑ8×@Ñ@ÄÇÁÓLÈuÑTÑTÔðUàÐó    c           
     óê  — t         t        z
  j                  d«      }|dk(  rdnd}t        j                  | j
                  «      |k\  }|j                  «       r2| j
                  |   d   }|dk(  rdnd}t        d|› d	|› d
|› d|› �«      ‚|dk(  rh| j
                  t        | j
                  d¬«      z   }t        |dd¬«      }|j                  d«      |z   }	t        j                  |	| j                  d¬«      S | j
                  t        | j
                  d¬«      z   }t        t        j                  |dz  «      dd¬«      }
|
j                  d«      |z   }t        j                  || j                  d¬«      S )aS  
    Convert SAS day or second counts to a datetime64 Series.

    Parameters
    ----------
    sas_datetimes : Series
       Dates or datetimes in SAS
    unit : {'d', 's'}
       "d" if the floats represent dates, "s" for datetimes

    Returns
    -------
    Series
       datetime64[s] for unit="d", datetime64[ms] for unit="s".
    rT   Údg)QÎ ÈEØBg      àCr   Údater   zOut of bounds SAS z value: z	; no SAS zB can be this large, so the file is corrupt or the column is not a ©r]   Úms)r]   Úout_unitzM8[ms]F©ÚindexÚcopyg     õ@zM8[s])Ú_sas_originÚ_unix_originÚas_unitr?   ÚabsÚ_valuesÚanyr   rc   r   ÚviewÚpdÚSeriesrl   Úround)Úsas_datetimesr]   ÚtdÚlimitÚ	too_larger)   ÚwhatÚ	correctedÚmillisÚdt64msÚsecsÚdt64ss               r+   Ú_convert_datetimesr‚   ´   sx  € ô  œÑ
$×	-Ñ	-¨cÓ	2€Bð  $ sš{‰O°€EÜ—‘�}×,Ñ,Ó-°Ñ6€IØ‡}�}„Ø×%Ñ% iÑ0°Ñ3ˆØ š‰v¨*ˆÜ!Ø    h¨u¨g°Y¸t¸fð EDØDHÀ6ðKó
ð 	
ð ˆs‚{Ø!×)Ñ)Ô,HØ×!Ñ!¨ô-
ñ 
ˆ	ô +¨9¸3ÈÔNˆØ—‘˜XÓ&¨Ñ+ˆÜ�y‰y˜ }×':Ñ':ÀÔGÐGà!×)Ñ)Ô,HØ×!Ñ!¨ô-
ñ 
ˆ	ô )Ü�H‰H�Y Ñ(Ó)°¸cô
ˆð —	‘	˜'Ó" RÑ'ˆÜ�y‰y˜ m×&9Ñ&9ÀÔFÐFrd   c                  ón   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd
„Zy)Ú_ColumnÚintÚcol_idústr | bytesÚnameÚlabelÚformatr&   ÚctypeÚlengthc                óX   — || _         || _        || _        || _        || _        || _        y r.   )r†   rˆ   r‰   rŠ   r‹   rŒ   )Úselfr†   rˆ   r‰   rŠ   r‹   rŒ   s          r+   Ú__init__z_Column.__init__ô   s.   € ð ˆŒØˆŒ	ØˆŒ
ØˆŒØˆŒ
Øˆ�rd   N)r†   r…   rˆ   r‡   r‰   r‡   rŠ   r‡   r‹   r&   rŒ   r…   ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r�   © rd   r+   r„   r„   ì   sl   … ØƒKØ
ÓØÓØÓØƒLØƒKðàðð ð	ð
 ðð ðð ðð ðð 
ôrd   r„   c            	      óš  — e Zd ZU dZded<   ded<   ded<   dd	d	dej                  d	d	d
f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d,d„Zd-d„Zd.d„Z	d/d„Z
d/d„Zd/d„Zd.d„Zd.d„Zd0d„Zd1d„Zd2d„Zd3d„Zd.d„Zd4d„Zd.d„Zd.d„Zd5d„Zd5d„Zd5d„Zd5d„Zd5d„Zd5d „Zd5d!„Zd5d"„Zeeeeeeeedg	Zd6d7d#„Z 	 	 	 	 d8d$„Z!d9d%„Z"d&„ Z#d'„ Z$d0d(„Z%d:d)„Z&d*„ Z'd;d+„Z(y)<ÚSAS7BDATReadera„  
    Read SAS files in SAS7BDAT format.

    Parameters
    ----------
    path_or_buf : path name or buffer
        Name of SAS file or file-like object pointing to SAS file
        contents.
    index : column identifier, defaults to None
        Column to use as index.
    convert_dates : bool, defaults to True
        Attempt to convert dates to Pandas datetime values.  Note that
        some rarely used SAS date formats may be unsupported.
    blank_missing : bool, defaults to True
        Convert empty strings to missing values (SAS uses blanks to
        indicate missing character variables).
    chunksize : int, defaults to None
        Return SAS7BDATReader object for iterations, returns chunks
        with given number of lines.
    encoding : str, 'infer', defaults to None
        String encoding acc. to Python standard encodings,
        encoding='infer' decodes using the encoding recorded in the file
        header, falling back to latin-1 if the header does not name one
        pandas recognizes; encoding=None will leave the data in binary format.

        .. deprecated:: 3.1.0
            The default will change from ``None`` to ``'infer'``.
    convert_text : bool, defaults to True
        If False, text variables are left as raw bytes.
    convert_header_text : bool, defaults to True
        If False, header text, including column names, are left as raw
        bytes.
    r…   Ú_int_lengthzbytes | NoneÚ_cached_pagez
str | Noner*   NTÚinferc
                ó\  — |t         j                  u| _        d| _        || _        || _        || _        || _        |t         j                  u rd n|| _        || _	        || _
        d| _        d| _        g | _        g | _        g | _        g | _        t#        j$                  dt"        j&                  ¬«      | _        t#        j$                  dt"        j&                  ¬«      | _        d| _        d | _        g | _        g | _        g | _        d| _        d| _        d| _        t;        |dd|	¬«      | _        | j<                  j>                  | _         	 | jC                  «        | jE                  «        | jG                  «        | jM                  «       | _'        y # tH        $ r | jK                  «        ‚ w xY w)NFzlatin-1rd   r   r2   Úrb)Úis_textÚcompression)(r   Ú
no_defaultÚ_encoding_specifiedÚ_non_ascii_header_textrl   Úconvert_datesÚblank_missingÚ	chunksizer*   Úconvert_textÚconvert_header_textÚdefault_encodingrŸ   Úcolumn_names_rawÚcolumn_namesÚcolumn_formatsÚcolumnsr?   ÚemptyrX   Ú_data_subheader_offsetsÚ_data_subheader_lengthsÚ_data_subheader_countrš   Ú_column_data_lengthsÚ_column_data_offsetsÚ_column_typesÚ_current_row_in_file_indexÚ_current_row_on_page_indexr   ÚhandlesÚhandleÚ_path_or_bufÚ_get_propertiesÚ_parse_metadataÚ_validate_column_data_rangesÚ	ExceptionÚcloseÚ_metadata_signatureÚ_metadata_at_open)
rŽ   Úpath_or_bufrl   r£   r¤   r¥   r*   r¦   r§   rŸ   s
             r+   r�   zSAS7BDATReader.__init__.  s€  € ð $,´3·>±>Ð#AˆÔ Ø&+ˆÔ#àˆŒ
Ø*ˆÔØ*ˆÔØ"ˆŒØ (¬C¯N©NÑ :™ÀˆŒØ(ˆÔØ#6ˆÔ à )ˆÔØˆÔØ-/ˆÔØ/1ˆÔØ13ˆÔØ&(ˆŒô
 (*§x¡x°¼¿¹Ô'BˆÔ$Ü')§x¡x°¼¿¹Ô'BˆÔ$Ø%&ˆÔ"Ø ˆÔØ/1ˆÔ!Ø/1ˆÔ!Ø*,ˆÔà*+ˆÔ'Ø*+ˆÔ'Ø*+ˆÔ'ä!Ø˜ u¸+ô
ˆŒð !ŸL™L×/Ñ/ˆÔð	Ø× Ñ Ô"Ø× Ñ Ô"Ø×-Ñ-Ô/ð "&×!9Ñ!9Ó!;ˆÕøô ò 	Ø�J‰JŒLØð	ús   Å
0F ÆF+c           	     óÄ   — | j                   | j                  | j                  | j                  | j                  t        | j                  «      t        | j                  «      fS )aó  
        Everything the parser and ``_chunk_to_dataframe`` read out of the file's
        metadata, in one comparable value.

        The column lists are only ever appended to, so their lengths stand in
        for their contents and this stays O(1) rather than O(ncols). The
        compression is in here for completeness rather than because a file can
        change it: only the first column-text subheader is read for it, and a
        file with none of those cannot be opened at all.
        )Ú
row_lengthÚ	row_countÚ_mix_page_row_countÚcolumn_countrŸ   r/   r²   rª   ©rŽ   s    r+   r¾   z"SAS7BDATReader._metadata_signaturej  sS   € ð �O‰OØ�N‰NØ×$Ñ$Ø×ÑØ×ÑÜ�×)Ñ)Ó*Ü�×!Ñ!Ó"ð
ð 	
rd   c                ó.  — t        t        | j                  | j                  | j                  d¬«      «      D ]\  \  }\  }}}|dk(  r|dkD  rt        d|› d|› d�«      ‚||z   | j                  kD  sŒ9t        d|› d|› d	||z   › d
| j                  › d�	«      ‚ y )NT)Ústrictó   dé   zColumn z is numeric but declares zL bytes of data, more than the 8 a SAS number can occupy; the file is corruptz spans bytes ú-z of a z-byte row; the file is corrupt)rE   Úzipr²   r±   r³   Ú
ValueErrorrÂ   )rŽ   rl   ÚoffsetrŒ   r‹   s        r+   r»   z+SAS7BDATReader._validate_column_data_ranges  sË   € ô /8ÜØ×)Ñ)Ø×)Ñ)Ø×"Ñ"Øô	ó/
ò 	Ñ*ˆEÑ*�F˜F Eð ˜Š} ¨!¢Ü Ø˜e˜WÐ$=¸f¸Xð F!ð "óð ð
 ˜‰ §¡Ó0Ü Ø˜e˜W M°&°¸¸6ÀF¹?Ð:KÈ6Ø—‘Ð'Ð'EðGóð ñ#	rd   c                ó`   — t        j                  | j                  t         j                  ¬«      S )z5Return a numpy int64 array of the column data lengthsr2   )r?   Úasarrayr±   rX   rÆ   s    r+   Úcolumn_data_lengthsz"SAS7BDATReader.column_data_lengthsœ  ó   € ä�z‰z˜$×3Ñ3¼2¿8¹8ÔDÐDrd   c                ó`   — t        j                  | j                  t         j                  ¬«      S )z0Return a numpy int64 array of the column offsetsr2   )r?   rÐ   r²   rX   rÆ   s    r+   Úcolumn_data_offsetsz"SAS7BDATReader.column_data_offsets   rÒ   rd   c                ój   — t        j                  | j                  t        j                  d«      ¬«      S )zj
        Returns a numpy character array of the column types:
           s (string) or d (double)
        ÚS1r2   )r?   rÐ   r³   r3   rÆ   s    r+   Úcolumn_typeszSAS7BDATReader.column_types¤  s#   € ô
 �z‰z˜$×,Ñ,´B·H±H¸T³NÔCÐCrd   c                ó8   — | j                   j                  «        y r.   )r¶   r½   rÆ   s    r+   r½   zSAS7BDATReader.close«  s   € Ø�‰×ÑÕrd   c                óZ	  — | j                   j                  d«       | j                   j                  d«      | _        | j                  dt	        t
        j                  «       t
        j                  k7  rt        d«      ‚| j                  t
        j                  t
        j                  «      }|t
        j                  k(  r9d| _        d| _        t
        j                  | _        t
        j                   | _        n8d| _        t
        j$                  | _        t
        j&                  | _        d| _        | j                  t
        j(                  t
        j*                  «      }|t
        j,                  k(  rt
        j.                  }nd}| j                  t
        j0                  t
        j2                  «      }|dk(  r d	| _        t6        j8                  d
k(  | _        nd| _        t6        j8                  dk(  | _        | j                  t
        j<                  t
        j>                  «      d   }|t
        j@                  v rt
        j@                  |   | _!        nd|› d�| _!        | jD                  dk(  r/t
        j@                  jG                  || jH                  «      | _"        tK        ddd«      }| jM                  t
        jN                  |z   t
        jP                  «      }|tS        jT                  |d¬«      z   | _+        | jM                  t
        jX                  |z   t
        jZ                  «      }|tS        jT                  |d¬«      z   | _.        | j_                  t
        j`                  |z   t
        jb                  «      | _2        | j                   j                  | jd                  dz
  «      }| xj                  |z  c_        t	        | j                  «      | jd                  k7  rt        d«      ‚| j_                  t
        jf                  |z   t
        jh                  «      | _5        tm        | jj                  | j"                  z  dz   ddt
        jn                  z  z  «      }tq        jr                  |tp        jt                  ¬«      | _;        tq        jr                  |tp        jt                  ¬«      | _<        y )Nr   i   z'magic number mismatch (not a SAS file?)TrÊ   Fé   ó   ú<Úbigú>Úlittlezunknown (code=ú)r›   i¨  r"   rT   rh   z*The SAS7BDAT file appears to be truncated.r2   )=r¸   ÚseekÚreadrš   r/   rC   ÚmagicrÍ   Ú_read_bytesÚalign_1_offsetÚalign_1_lengthÚu64_byte_checker_valueÚU64r™   Úpage_bit_offset_x64Ú_page_bit_offsetÚsubheader_pointer_length_x64Ú_subheader_pointer_lengthÚpage_bit_offset_x86Úsubheader_pointer_length_x86Úalign_2_offsetÚalign_2_lengthÚalign_1_checker_valueÚalign_2_valueÚendianness_offsetÚendianness_lengthÚ
byte_orderÚsysÚ	byteorderÚneed_byteswapÚencoding_offsetÚencoding_lengthÚencoding_namesÚinferred_encodingr*   Úgetr¨   r   Ú_read_floatÚdate_created_offsetÚdate_created_lengthru   Úto_timedeltaÚdate_createdÚdate_modified_offsetÚdate_modified_lengthÚdate_modifiedÚ
_read_uintÚheader_size_offsetÚheader_size_lengthÚheader_lengthÚpage_size_offsetÚpage_size_lengthÚ_page_lengthÚminÚsubheader_count_lengthr?   r­   rX   r®   r¯   )rŽ   ÚbufÚalign1ÚepochÚxÚmax_subheaderss         r+   r¹   zSAS7BDATReader._get_properties®  s˜  € à×Ñ×Ñ˜qÔ!Ø ×-Ñ-×2Ñ2°3Ó7ˆÔØ×Ñ˜Q¤¤U§[¡[Ó!1Ð2´e·k±kÒAÜÐFÓGÐGð ×Ñœu×3Ñ3´U×5IÑ5IÓJˆØ”%×.Ñ.Ò.ØˆDŒHØ ˆDÔÜ$)×$=Ñ$=ˆDÔ!Ü-2×-OÑ-OˆDÕ*àˆDŒHÜ$)×$=Ñ$=ˆDÔ!Ü-2×-OÑ-OˆDÔ*Ø ˆDÔØ×Ñœu×3Ñ3´U×5IÑ5IÓJˆØ”%×-Ñ-Ò-Ü×(Ñ(‰FàˆFð ×Ñœu×6Ñ6¼×8OÑ8OÓPˆØ�'Š>Ø!ˆDŒOÜ!$§¡°%Ñ!7ˆDÕà!ˆDŒOÜ!$§¡°(Ñ!:ˆDÔð ×Ñœu×4Ñ4´e×6KÑ6KÓLÈQÑOˆØ”%×&Ñ&Ñ&Ü%*×%9Ñ%9¸#Ñ%>ˆDÕ"à'5°c°U¸!Ð%<ˆDÔ"Ø�=‰=˜GÒ#ô "×0Ñ0×4Ñ4°S¸$×:OÑ:OÓPˆDŒMô ˜˜q !Ó$ˆØ×ÑÜ×%Ñ%¨Ñ.´×0IÑ0Ió
ˆð "¤B§O¡O°A¸CÔ$@Ñ@ˆÔØ×ÑÜ×&Ñ&¨Ñ/´×1KÑ1Kó
ˆð #¤R§_¡_°Q¸SÔ%AÑAˆÔà!Ÿ_™_Ü×$Ñ$ vÑ-¬u×/GÑ/Gó
ˆÔð
 ×Ñ×$Ñ$ T×%7Ñ%7¸#Ñ%=Ó>ˆØ×Ò˜SÑ ÕÜˆt× Ñ Ó! T×%7Ñ%7Ò7ÜÐIÓJÐJà ŸO™OÜ×"Ñ" VÑ+¬U×-CÑ-Có
ˆÔô Ø×Ñ ×!?Ñ!?Ñ?À!ÑCØ�!”e×2Ñ2Ñ2Ñ3ó
ˆô (*§x¡x°ÄbÇhÁhÔ'OˆÔ$Ü')§x¡x°ÄbÇhÁhÔ'OˆÕ$rd   c                óŠ   — | j                  | j                  xs d¬«      }|j                  r| j                  «        t        ‚|S )Nr"   )Únrows)râ   r¥   r­   r½   ÚStopIteration)rŽ   Údas     r+   Ú__next__zSAS7BDATReader.__next__  s6   € Ø�Y‰Y˜TŸ^™^Ò0¨qˆYÓ1ˆØ�8Š8Ø�J‰JŒLÜÐØˆ	rd   c                óì   — | j                   €J ‚|dk(  r!t        | j                   || j                  «      S |dk(  r!t        | j                   || j                  «      S | j	                  «        t        d«      ‚)NrÚ   rÊ   zinvalid float width)rš   r	   rø   r   r½   rÍ   ©rŽ   rÎ   rN   s      r+   rþ   zSAS7BDATReader._read_float	  s{   € Ø× Ñ Ð,Ð,Ð,Ø�AŠ:Ü+Ø×!Ñ! 6¨4×+=Ñ+=óð ð �aŠZÜ,Ø×!Ñ! 6¨4×+=Ñ+=óð ð �J‰JŒLÜÐ2Ó3Ð3rd   c                ól  — | j                   €J ‚|dk(  r| j                  |d«      d   S |dk(  r!t        | j                   || j                  «      S |dk(  r!t	        | j                   || j                  «      S |dk(  r!t        | j                   || j                  «      S | j                  «        t        d«      ‚)Nr"   r   é   rÚ   rÊ   zinvalid int width)rš   rä   r
   rø   r   r   r½   rÍ   r  s      r+   r  zSAS7BDATReader._read_uint  sÃ   € Ø× Ñ Ð,Ð,Ð,Ø�AŠ:Ø×#Ñ# F¨AÓ.¨qÑ1Ð1Ø�aŠZÜ,Ø×!Ñ! 6¨4×+=Ñ+=óð ð �aŠZÜ,Ø×!Ñ! 6¨4×+=Ñ+=óð ð �aŠZÜ,Ø×!Ñ! 6¨4×+=Ñ+=óð ð �J‰JŒLÜÐ0Ó1Ð1rd   c                ó®   — | j                   €J ‚||z   t        | j                   «      kD  r| j                  «        t        d«      ‚| j                   |||z    S )NzThe cached page is too small.)rš   r/   r½   rÍ   ©rŽ   rÎ   rŒ   s      r+   rä   zSAS7BDATReader._read_bytes,  sW   € Ø× Ñ Ð,Ð,Ð,Ø�F‰?œS ×!2Ñ!2Ó3Ò3Ø�J‰JŒLÜÐ<Ó=Ð=Ø× Ñ  ¨&°6©/Ð:Ð:rd   c                ó„  — d}|sƒ| j                   j                  | j                  «      | _        t	        | j                  «      dk  rn@t	        | j                  «      | j                  k7  rt        d«      ‚| j                  «       }|sŒƒg | _        t        | j                  «      D ]Â  }| j                  |   dk(  r“| j                  r‡| j                  |   }|t        j                  v r| j                  j                  d«       Œ^|t        j                   v r| j                  j                  d«       ŒŒ| j                  j                  d «       Œ¨| j                  j                  d «       ŒÄ | j"                  sL| j$                  rd| j                  v s| j&                  r%t)        j*                  dt,        t/        «       ¬	«       y y y )
NFr   z2Failed to read a meta data page from the SAS file.rÉ   rf   rT   ó   sa:  The default value of 'encoding' in read_sas is deprecated. In a future version the default will change from None to 'infer', and text will be decoded using the encoding recorded in the file rather than returned as bytes. Pass encoding='infer' to adopt the future behavior, or encoding=None to keep the current one.)Ú
stacklevel)r¸   râ   r  rš   r/   rÍ   Ú_process_page_metaÚ_column_convert_typesr7   rÅ   r³   r£   r«   rC   Úsas_date_formatsr;   Úsas_datetime_formatsr¡   r¦   r¢   ÚwarningsÚwarnr   r   )rŽ   ÚdoneÚjÚfmts       r+   rº   zSAS7BDATReader._parse_metadata3  sƒ  € ØˆÙØ $× 1Ñ 1× 6Ñ 6°t×7HÑ7HÓ IˆDÔÜ�4×$Ñ$Ó%¨Ò*ØÜ�4×$Ñ$Ó%¨×):Ñ):Ò:Ü Ð!UÓVÐVØ×*Ñ*Ó,ˆDò ð 8:ˆÔ"Ü�t×(Ñ(Ó)ò 
	8ˆAØ×!Ñ! !Ñ$¨Ò,°×1CÒ1CØ×)Ñ)¨!Ñ,�Øœ%×0Ñ0Ñ0Ø×.Ñ.×5Ñ5°cÕ:ØœE×6Ñ6Ñ6Ø×.Ñ.×5Ñ5°cÕ:à×.Ñ.×5Ñ5°dÕ;à×*Ñ*×1Ñ1°$Õ7ð
	8ð ×'Ò'Ø×Ò 4¨4×+=Ñ+=Ñ#=Ø×*Ò*ä�M‰MðQô
 Ü+Ó-öð +ð (rd   c                óv  — | j                  «        g t        j                  ¢t        j                  ‘t        j                  ‘}| j
                  |v r| j                  «        | j
                  t        j                  k(  }| j
                  t        j                  k(  }t        |xs |xs | j                  dkD  «      S )Nr   )
Ú_read_page_headerrC   Úpage_meta_typesÚpage_amd_typeÚpage_mix_typeÚ_current_page_typeÚ_process_page_metadataÚpage_data_typeÚboolr°   )rŽ   ÚptÚis_data_pageÚis_mix_pages       r+   r"  z!SAS7BDATReader._process_page_metaZ  s›   € Ø×ÑÔ ØOŒu×$Ñ$ÐO¤e×&9Ñ&9ÐO¼5×;NÑ;NÐOˆØ×"Ñ" bÑ(Ø×'Ñ'Ô)Ø×.Ñ.´%×2FÑ2FÑFˆØ×-Ñ-´×1DÑ1DÑDˆÜ�LÒQ KÒQ°4×3MÑ3MÐPQÑ3QÓRÐRrd   c                óŽ  — | j                   }t        j                  |z   }| j                  |t        j                  «      t        j
                  z  | _        t        j                  |z   }| j                  |t        j                  «      | _	        t        j                  |z   }| j                  |t        j                  «      | _        y r.   )rê   rC   Úpage_type_offsetr  Úpage_type_lengthÚpage_type_mask2r0  Úblock_count_offsetÚblock_count_lengthÚ_current_page_block_countÚsubheader_count_offsetr  Ú_current_page_subheaders_count)rŽ   Ú
bit_offsetÚtxs      r+   r,  z SAS7BDATReader._read_page_headerc  s›   € Ø×*Ñ*ˆ
Ü×#Ñ# jÑ0ˆà�O‰O˜B¤× 6Ñ 6Ó7¼%×:OÑ:OÑOð 	Ôô ×%Ñ%¨
Ñ2ˆØ)-¯©¸¼U×=UÑ=UÓ)VˆÔ&Ü×)Ñ)¨JÑ6ˆØ.2¯o©oØ”×,Ñ,ó/
ˆÕ+rd   c                ób   — 	 t        | «      | _        y # t        $ r | j                  «        ‚ w xY wr.   )r   r°   r¼   r½   rÆ   s    r+   r1  z%SAS7BDATReader._process_page_metadatap  s/   € ð	Ü)@ÀÓ)FˆDÕ&øÜò 	Ø�J‰JŒLØð	ús   ‚ “.c           	     ó¤  — | j                   }|}|}| j                  r|dz  }|dz  }n
|dz  }|dz  }| j                  |t        j                  |z  z   |«      | _        | j
                  | j                  kD  r&t        d| j
                  › d| j                  › d�«      ‚| j                  |t        j                  |z  z   |«      | _	        | j                  |t        j                  |z  z   |«      | _        | j                  |t        j                  |z  z   |«      | _        t        j                  |z  }| j                  ||z   |«      | _        | j                  | j
                  z  | j                  kD  r3t        d| j                  › d	| j                  › d
| j
                  › d�«      ‚| j                  |d«      | _        | j                  |d«      | _        y )Niª  iÂ  ib  iz  zrow_length (z) exceeds the page size (z); the file is corruptzmix page row count (z) does not fit in a z-byte page at z# bytes per row; the file is corruptr  )r™   rè   r  rC   Úrow_length_offset_multiplierrÂ   r  rÍ   Úrow_count_offset_multiplierrÃ   Úcol_count_p1_multiplierÚcol_count_p1Úcol_count_p2_multiplierÚcol_count_p2Ú'row_count_on_mix_page_offset_multiplierrÄ   Ú_lcsÚ_lcp)rŽ   rÎ   rŒ   Úint_lenÚ
lcs_offsetÚ
lcp_offsetÚmxs          r+   Ú_process_rowsize_subheaderz)SAS7BDATReader._process_rowsize_subheaderz  sÛ  € Ø×"Ñ"ˆØˆ
Øˆ
Ø�8Š8Ø˜#ÑˆJØ˜#Ñ‰Jà˜#ÑˆJØ˜#ÑˆJàŸ/™/Ø”U×7Ñ7¸'ÑAÑAØó
ˆŒð �?‰?˜T×.Ñ.Ò.ÜØ˜tŸ™Ð/ð 0Ø×%Ñ%Ð&Ð&<ð>óð ð Ÿ™Ø”U×6Ñ6¸Ñ@Ñ@Øó
ˆŒð !ŸO™OØ”U×2Ñ2°WÑ<Ñ<¸gó
ˆÔð !ŸO™OØ”U×2Ñ2°WÑ<Ñ<¸gó
ˆÔô ×:Ñ:¸WÑDˆØ#'§?¡?°6¸B±;ÀÓ#HˆÔ ð ×#Ñ# d§o¡oÑ5¸×8IÑ8IÒIÜØ& t×'?Ñ'?Ð&@ð AØ×&Ñ&Ð' ~°d·o±oÐ5Fð G+ð,óð ð
 —O‘O J°Ó2ˆŒ	Ø—O‘O J°Ó2ˆ�	rd   c           	     ó  — | j                   }||z  }| j                  ||«      | _        | j                  | j                  z   | j                  k7  r4t        d| j                  › d| j                  › d| j                  › d�«       y y )Nz Warning: column count mismatch (z + z != z)
)r™   r  rÅ   rG  rI  Úprint)rŽ   rÎ   rŒ   rM  s       r+   Ú_process_columnsize_subheaderz,SAS7BDATReader._process_columnsize_subheader¦  sˆ   € Ø×"Ñ"ˆØ�'ÑˆØ ŸO™O¨F°GÓ<ˆÔØ×Ñ˜t×0Ñ0Ñ0°D×4EÑ4EÒEÜØ2°4×3DÑ3DÐ2EÀSØ×$Ñ$Ð% T¨$×*;Ñ*;Ð)<¸CðAõð Frd   c                 ó   — y r.   r–   r  s      r+   Ú_process_subheader_countsz(SAS7BDATReader._process_subheader_counts±  s   € Ørd   c                ór  — || j                   z  }| j                  |t        j                  «      }| j	                  ||«      }|d| j                  d«      }| j                  j                  |«       t        | j                  «      dk(  �r®d}t        j                  D ]	  }||v sŒ|}Œ || _
        || j                   z  }|dz   }| j                  r|dz  }| j	                  || j                  «      }|j                  d«      }|dk(  rNd| _        |dz   }| j                  r|dz  }| j	                  || j                  «      }|d| j                   | _        n¶|t        j                  k(  rG|d	z   }| j                  r|dz  }| j	                  || j                  «      }|d| j                   | _        n\| j                  dkD  rMd| _        |dz   }| j                  r|dz  }| j	                  || j                  «      }|d| j                   | _        t!        | d
«      r!| j#                  | j                  «      | _        y y y )Nr   s     r"   rd   é   rÚ   ó    é    é(   Úcreator_proc)r™   r  rC   Útext_block_size_lengthrä   Úrstripr©   r;   r/   Úcompression_literalsrŸ   rè   rL  rK  r\  Úrle_compressionÚhasattrÚ_convert_header_text)	rŽ   rÎ   rŒ   Útext_block_sizer  Ú	cname_rawÚcompression_literalÚclÚoffset1s	            r+   Ú_process_columntext_subheaderz,SAS7BDATReader._process_columntext_subheader´  s  € Ø�$×"Ñ"Ñ"ˆØŸ/™/¨&´%×2NÑ2NÓOˆà×Ñ˜v Ó7ˆØ˜˜/Ð*×1Ñ1°(Ó;ˆ	Ø×Ñ×$Ñ$ YÔ/äˆt×$Ñ$Ó%¨Ó*Ø"%ÐÜ×0Ñ0ò -�Ø˜’?Ø*,Ñ'ð-ð  3ˆDÔØ�d×&Ñ&Ñ&ˆFà˜r‘kˆGØ�xŠxØ˜1‘�à×"Ñ" 7¨D¯I©IÓ6ˆCØ"%§*¡*¨WÓ"5ÐØ" cÒ)Ø�”	Ø  2™+�Ø—8’8Ø˜q‘L�GØ×&Ñ& w°·	±	Ó:�Ø$'¨¨D¯I©IÐ$6�Õ!Ø$¬×(=Ñ(=Ò=Ø  2™+�Ø—8’8Ø˜q‘L�GØ×&Ñ& w°·	±	Ó:�Ø$'¨¨D¯I©IÐ$6�Õ!Ø—‘˜Q’Ø�”	Ø  2™+�Ø—8’8Ø˜q‘L�GØ×&Ñ& w°·	±	Ó:�Ø$'¨¨D¯I©IÐ$6�Ô!Ü�t˜^Ô,Ø$(×$=Ñ$=¸d×>OÑ>OÓ$P�Õ!ð -ðE +rd   c                ó¤  — | j                   }||z  }|d|z  z
  dz
  dz  }t        |«      D �]"  }|t        j                  |dz   z  z   t        j                  z   }|t        j                  |dz   z  z   t        j
                  z   }|t        j                  |dz   z  z   t        j                  z   }| j                  |t        j                  «      }	| j                  |t        j                  «      }
| j                  |t        j                  «      }| j                  |	   }||
|
|z    }| j                  j                  | j                  |«      «       �Œ% y )Nr  é   rÊ   r"   )r™   r7   rC   Úcolumn_name_pointer_lengthÚ!column_name_text_subheader_offsetÚcolumn_name_offset_offsetÚcolumn_name_length_offsetr  Ú!column_name_text_subheader_lengthÚcolumn_name_offset_lengthÚcolumn_name_length_lengthr©   rª   r;   rb  )rŽ   rÎ   rŒ   rM  Úcolumn_name_pointers_countÚiÚtext_subheaderÚcol_name_offsetÚcol_name_lengthÚidxÚ
col_offsetÚcol_lenÚname_rawÚcnames                 r+   Ú_process_columnname_subheaderz,SAS7BDATReader._process_columnname_subheaderá  s`  € Ø×"Ñ"ˆØ�'ÑˆØ&,¨q°7©{Ñ&:¸RÑ&?ÀAÑ%EÐ"ÜÐ1Ó2ó 	GˆAàÜ×2Ñ2°a¸!±eÑ<ñ=ä×9Ñ9ñ:ð ð Ü×2Ñ2°a¸!±eÑ<ñ=ä×1Ñ1ñ2ð ð Ü×2Ñ2°a¸!±eÑ<ñ=ä×1Ñ1ñ2ð ð —/‘/Ø¤× GÑ GóˆCð Ÿ™Ø¤×!@Ñ!@óˆJð —o‘o o´u×7VÑ7VÓWˆGà×,Ñ,¨SÑ1ˆHØ˜Z¨*°wÑ*>Ð?ˆEØ×Ñ×$Ñ$ T×%>Ñ%>¸uÓ%EÖFñ7	Grd   c                ó|  — | j                   }|d|z  z
  dz
  |dz   z  }t        |«      D �]  }||z   t        j                  z   ||dz   z  z   }|d|z  z   t        j                  z   ||dz   z  z   }|d|z  z   t        j
                  z   ||dz   z  z   }| j                  ||«      }	| j                  j                  |	«       | j                  |t        j                  «      }	| j                  j                  |	«       | j                  |t        j                  «      }	| j                  j                  |	dk(  rdnd«       �Œ y )Nr  rj  rÊ   r"   rÉ   r   )r™   r7   rC   Úcolumn_data_offset_offsetÚcolumn_data_length_offsetÚcolumn_type_offsetr  r²   r;   Úcolumn_data_length_lengthr±   Úcolumn_type_lengthr³   )
rŽ   rÎ   rŒ   rM  Úcolumn_attributes_vectors_countrs  Úcol_data_offsetÚcol_data_lenÚ	col_typesr  s
             r+   Ú#_process_columnattributes_subheaderz2SAS7BDATReader._process_columnattributes_subheader  sO  € Ø×"Ñ"ˆØ+1°A¸±KÑ+?À"Ñ+DÈ'ÐTUÉ+Ñ*VÐ'ÜÐ6Ó7ó 	@ˆAà˜Ñ ¤5×#BÑ#BÑBÀQÈ'ÐTUÉ+ÑEVÑVð ð Ø�g‘+ñä×1Ñ1ñ2ð �w ‘{Ñ#ñ$ð ð ˜˜W™Ñ$¤u×'?Ñ'?Ñ?À!ÀwÐQRÁ{ÑBSÑSð ð —‘ °Ó9ˆAØ×%Ñ%×,Ñ,¨QÔ/à—‘ ¬e×.MÑ.MÓNˆAØ×%Ñ%×,Ñ,¨QÔ/à—‘ 	¬5×+CÑ+CÓDˆAØ×Ñ×%Ñ%¨a°1ªf¡d¸$Ö?ñ+	@rd   c                 ó   — y r.   r–   r  s      r+   Ú_process_columnlist_subheaderz,SAS7BDATReader._process_columnlist_subheader  s   € àrd   c           	     óì  — | j                   }|t        j                  z   d|z  z   }|t        j                  z   d|z  z   }|t        j                  z   d|z  z   }|t        j
                  z   d|z  z   }|t        j                  z   d|z  z   }|t        j                  z   d|z  z   }	| j                  |t        j                  «      }
t        |
t        | j                  «      dz
  «      }| j                  |t        j                  «      }| j                  |t        j                  «      }| j                  |t        j                  «      }t        |t        | j                  «      dz
  «      }| j                  |t        j                   «      }| j                  |	t        j"                  «      }| j                  |   }| j%                  ||||z    «      }| j                  |   }| j%                  ||||z    «      }t        | j&                  «      }t)        || j*                  |   ||| j,                  |   | j.                  |   «      }| j0                  j3                  |«       | j&                  j3                  |«       y )Né   r"   )r™   rC   Ú)column_format_text_subheader_index_offsetÚcolumn_format_offset_offsetÚcolumn_format_length_offsetÚ(column_label_text_subheader_index_offsetÚcolumn_label_offset_offsetÚcolumn_label_length_offsetr  Ú)column_format_text_subheader_index_lengthr  r/   r©   Úcolumn_format_offset_lengthÚcolumn_format_length_lengthÚ(column_label_text_subheader_index_lengthÚcolumn_label_offset_lengthÚcolumn_label_length_lengthrb  r¬   r„   rª   r³   r±   r«   r;   )rŽ   rÎ   rŒ   rM  Útext_subheader_formatÚcol_format_offsetÚcol_format_lenÚtext_subheader_labelÚcol_label_offsetÚcol_label_lenr  Ú
format_idxÚformat_startÚ
format_lenÚ	label_idxÚlabel_startÚ	label_lenÚlabel_namesÚcolumn_labelÚformat_namesÚcolumn_formatÚcurrent_column_numberÚcols                          r+   Ú_process_format_subheaderz(SAS7BDATReader._process_format_subheader   sX  € Ø×"Ñ"ˆà”U×DÑDÑDÀqÈ7Á{ÑRð 	ð #¤U×%FÑ%FÑFÈÈWÉÑTÐØ¤%×"CÑ"CÑCÀaÈ'ÁkÑQˆà”U×CÑCÑCÀaÈ'ÁkÑQð 	ð "¤E×$DÑ$DÑDÀqÈ7Á{ÑRÐØ¤×!AÑ!AÑAÀAÈÁKÑOˆà�O‰OØ!¤5×#RÑ#Ró
ˆô ˜œC × 5Ñ 5Ó6¸Ñ:Ó;ˆ
à—‘Øœu×@Ñ@ó
ˆð —_‘_ ^´U×5VÑ5VÓWˆ
à—O‘OØ ¤%×"PÑ"Pó
ˆ	ô ˜	¤3 t×'<Ñ'<Ó#=ÀÑ#AÓBˆ	à—o‘oØœe×>Ñ>ó
ˆð —O‘O M´5×3SÑ3SÓTˆ	à×+Ñ+¨IÑ6ˆØ×0Ñ0Ø˜ k°IÑ&=Ð>ó
ˆð ×,Ñ,¨ZÑ8ˆØ×1Ñ1Ø˜¨°zÑ(AÐBó
ˆô !$ D§L¡LÓ 1ÐäØ!Ø×ÑÐ3Ñ4ØØØ×ÑÐ4Ñ5Ø×%Ñ%Ð&;Ñ<ó
ˆð 	×Ñ×"Ñ" =Ô1Ø�‰×Ñ˜CÕ rd   c                óê  — |€| j                   �| j                   }n|€| j                  }t        | j                  «      dk(  r| j	                  «        t        d«      ‚|dkD  r#| j                  | j                  k\  r
t        «       S t        || j                  | j                  z
  «      }| j                  j                  d«      }| j                  j                  d«      }t        j                  |d|z  ft        j                  ¬«      | _        | j                  ||«       d| _        	 t!        | «      }|j#                  |«       | j%                  «       | j&                  k7  rt)        d«      ‚| j*                  t,        j.                  k7  r|j1                  «       | _        ~| j5                  «       }| j8                  �|j;                  | j8                  «      }|S # t6        $ r | j	                  «        ‚ w xY w)Nr   zNo columns to parse from filerÉ   r   rÊ   r2   zLThe file changes the layout it declared partway through; the file is corrupt)r¥   rÃ   r/   r³   r½   r   r´   r   r  Úcountr?   r@   rA   Ú_byte_chunkÚ_setup_string_buffersÚ_current_row_in_chunk_indexr   râ   r¾   r¿   rÍ   Ú	_str_moderC   Ústring_mode_objectÚstring_valuesÚ_str_valuesÚ_chunk_to_dataframer¼   rl   Ú	set_index)rŽ   r  ÚndÚnsÚpÚrslts         r+   râ   zSAS7BDATReader.readf  s©  € ØˆM §¡Ð :Ø—N‘N‰EØˆ]Ø—N‘NˆEäˆt×!Ñ!Ó" aÒ'Ø�J‰JŒLÜ Ð!@ÓAÐAà�1Š9˜×8Ñ8¸D¿N¹NÒJÜ“;Ðä�E˜4Ÿ>™>¨D×,KÑ,KÑKÓLˆà×Ñ×%Ñ% dÓ+ˆØ×Ñ×%Ñ% dÓ+ˆäŸ8™8 R¨¨U© O¼2¿8¹8ÔDˆÔØ×"Ñ" 2 uÔ-à+,ˆÔ(ð	Ü�t“ˆAØ�F‰F�5ŒMð ×'Ñ'Ó)¨T×-CÑ-CÒCÜ ð*óð ð �~‰~¤×!9Ñ!9Ò9Ø#$§?¡?Ó#4�Ô ð à×+Ñ+Ó-ˆDð �:‰:Ð!Ø—>‘> $§*¡*Ó-ˆDàˆøô ò 	ð
 �J‰JŒLØð	ús   Ä'BG ÇG2c                ó<  — |dk(  s| j                   r| j                  €t        j                  dfS t	        «       rt
        st        j                  dfS t        t        j                  ¬«      j                  dk7  rt        j                  dfS 	 t        j                  | j                  «      j                  }|dk(  rt        j                  dfS t        |«      }|€t        j                  dfS t        j                   |fS # t        $ r t        j                  dfcY S w xY w)aD  
        Pick how the Cython parser should emit string cells for this chunk.

        Returns ``(mode, table)``; see the string modes in sas_constants.py. The
        pyarrow modes require that the result actually be a pyarrow-backed str
        column, and that the source encoding translate byte by byte to utf-8.
        r   N©Úna_valueÚpyarrowr#   )r¦   r*   rC   r±  r   r   r   r?   ÚnanÚstorageÚcodecsÚlookuprˆ   r8   Ústring_mode_utf8rR   Ústring_mode_table)rŽ   r·  Ú	canonicalrO   s       r+   Ú_string_modezSAS7BDATReader._string_mode   sû   € ð �Š7˜$×+Ò+¨t¯}©}Ð/Dä×+Ñ+¨TÐ1Ð1Ü"Ô$­Ü×+Ñ+¨TÐ1Ð1Ü¤§¡Ô'×/Ñ/°9Ò<ô ×+Ñ+¨TÐ1Ð1ð	2ÜŸ™ d§m¡mÓ4×9Ñ9ˆIð ˜ÒÜ×)Ñ)¨4Ð/Ð/Ü'¨	Ó2ˆØˆ=ä×+Ñ+¨TÐ1Ð1Ü×&Ñ&¨Ð-Ð-øô ò 	2ä×+Ñ+¨TÐ1Ò1ð	2ús   Â)C= Ã=DÄDc                ó<  — | j                  |«      \  }}|| _        t        j                  dt        j                  ¬«      }t        j                  |t
        j                  k(  r|nd|ft        ¬«      | _        || _	        || _
        d| _        d| _        | j                  | _        |t
        j                  k(  rUt        j                  dt        j                  ¬«      | _        t        j                  dt        j                  ¬«      | _        y t        j$                  ||dz   ft        j                  ¬«      | _        t        j$                  ||ft        j                  ¬«      | _        |�3|\  | _	        | _
        | _        t'        | j                  «      dz  | _        y y )Nr   r2   r"   F©r   r   r   )rÅ  r°  r?   r­   rA   rC   r±  ÚobjectÚ_string_chunkÚ
_str_tableÚ_str_table_lenÚ_str_table_widthÚ_str_ascii_identityr*   Ú_str_encodingrX   Ú_str_offsetsÚ
_str_validr@   r/   )rŽ   r·  r  ÚmoderO   Úempty_u1s         r+   r®  z$SAS7BDATReader._setup_string_buffersÁ  s8  € Ø×'Ñ'¨Ó+‰ˆˆeØˆŒô —8‘8˜A¤R§X¡XÔ.ˆÜŸX™XØœ5×3Ñ3Ò3‰R¸¸EÐBÌ&ô
ˆÔð #ˆŒØ&ˆÔØ !ˆÔØ#(ˆÔ Ø!Ÿ]™]ˆÔØ”5×+Ñ+Ò+Ü "§¡¨´r·x±xÔ @ˆDÔÜ Ÿh™h v´R·X±XÔ>ˆDŒOØäŸH™H b¨%°!©) _¼B¿H¹HÔEˆÔô Ÿ(™( B¨ ;´b·h±hÔ?ˆŒØÐØMRÑJˆDŒO˜TÔ0°$Ô2JÜ$'¨¯©Ó$8¸CÑ$?ˆDÕ!ð rd   c                ób  — d| _         | j                  j                  | j                  «      | _        t        | j                  «      dk  ryt        | j                  «      | j                  k7  rC| j                  «        dt        | j                  «      d›d| j                  d›d�}t        |«      ‚y)z6Read the next page from the file. Returns True if EOF.r   Tz-failed to read complete page from file (read rf   z of z bytes)F)r°   r¸   râ   r  rš   r/   r½   rÍ   )rŽ   Úmsgs     r+   Ú_read_page_datazSAS7BDATReader._read_page_dataÜ  s¢   € à%&ˆÔ"Ø ×-Ñ-×2Ñ2°4×3DÑ3DÓEˆÔÜˆt× Ñ Ó! QÒ&ØÜ�×"Ñ"Ó# t×'8Ñ'8Ò8Ø�J‰JŒLà?Ü�t×(Ñ(Ó)¨!Ð,¨D°×1BÑ1BÀ1Ð0EÀWðNð ô ˜S“/Ð!Ørd   c                ó>  — | j                  «       }|ry| j                  «        | j                  t        j                  v r| j                  «        | j                  g t        j                  ¢t        j                  ‘t        j                  ‘vr| j                  «       S y)NTF)	rÕ  r,  r0  rC   r-  r1  r2  r/  Ú_read_next_page)rŽ   r(  s     r+   r×  zSAS7BDATReader._read_next_pageë  s•   € Ø×#Ñ#Ó%ˆÙØà×ÑÔ Ø×"Ñ"¤e×&;Ñ&;Ñ;Ø×'Ñ'Ô)à×"Ñ"ð +
Ü×"Ñ"ð+
ä× Ñ ð+
ô ×Ñð+
ñ 
ð
 ×'Ñ'Ó)Ð)àrd   c                ó8  — | j                   }| j                  }t        ||z
  |«      }i }d\  }}t        «       }t        | j                  «      D �]¯  }| j
                  |   }	| j                  |   dk(  rƒ| j                  |d d …f   j                  | j                  dz   ¬«      }
t        j                  |
t        j                  |d¬«      ||	<   | j                  |   }|�t        ||	   |«      ||	<   |dz  }Œ¨| j                  |   dk(  rÍ| j                   t"        j$                  k7  r+t        j                  | j'                  |«      |d¬	«      ||	<   n~t        j                  | j(                  |d d …f   |d¬	«      ||	<   | j*                  rF| j,                  �:| j/                  ||	   j0                  «      ||	<   |r||	   j3                  d
«      ||	<   |dz  }�Œ‡| j5                  «        t7        d| j                  |   ›�«      ‚ t9        || j
                  |d¬«      }|S )NrÇ  rÉ   rf   r2   F)r3   rl   rm   r"   r   rk   Ústrzunknown column type )r¬   rl   rm   )r¯  r´   r7   r   rÅ   rª   r³   r­  rt   rõ   ru   rv   r?   rY   r#  r‚   r°  rC   r±  Ú_string_columnrÉ  r¦   r*   Ú_decode_stringrÙ  r[   r½   rÍ   r   )rŽ   ÚnÚmÚixr¹  ÚjsÚjbÚinfer_stringr)  rˆ   Úcol_arrÚconvert_typeÚdfs                r+   r´  z"SAS7BDATReader._chunk_to_dataframeý  s  € Ø×,Ñ,ˆØ×+Ñ+ˆÜ�1�q‘5˜!‹_ˆØˆà‰ˆˆBÜ)Ó+ˆÜ�t×(Ñ(Ó)ó 	SˆAØ×$Ñ$ QÑ'ˆDà×!Ñ! !Ñ$¨Ò,Ø×*Ñ*¨2ªq¨5Ñ1×6Ñ6¸T¿_¹_ÈsÑ=RÐ6ÓS�ÜŸY™Y w´b·j±jÈÐQVÔW��T‘
Ø#×9Ñ9¸!Ñ<�ØÐ+Ü!3°D¸±JÀÓ!M�D˜‘JØ�a‘‘Ø×#Ñ# AÑ&¨$Ò.Ø—>‘>¤U×%=Ñ%=Ò=Ü!#§¡Ø×+Ñ+¨BÓ/°rÀô"�D˜’Jô "$§¡Ø×*Ñ*¨2ªq¨5Ñ1¸À%ô"�D˜‘Jð ×(Ò(¨d¯m©mÐ.GØ%)×%8Ñ%8¸¸d¹¿¹Ó%H˜˜T™
Ù'Ø)-¨d©×):Ñ):¸5Ó)A˜D ™Jà�a‘’à—
‘
”Ü Ð#7¸×8JÑ8JÈ1Ñ8MÐ7PÐ!QÓRÐRð7	Sô: �t T×%6Ñ%6¸bÀuÔMˆØˆ	rd   c           	     ób  — ddl }| j                  |   }| j                  |   j                  «       }| j                  |   }t        |«      }| j                  }||k  r||   ||dz   d |j                  «       rd}n&|j                  t        j                  |d¬«      «      }|j                  j                  |j                  «       |||j                  |«      |j                  |«      g«      }	| j                  t        j                   k(  r	 |	j#                  d¬«       t/        |j1                  |	g«      t3        t        j4                  ¬	«      ¬
«      S # |j$                  j&                  $ rD t)        t        |«      dz
  «      D ](  }
t+        |||
   ||
dz       «      j-                  d«       Œ* ‚ w xY w)u  
        Wrap string column `js`'s parse buffers as a pyarrow-backed str column.

        The Cython parser has already written utf-8 into ``_str_values[js]``,
        so this only has to hand the buffers to pyarrow â€” there is no
        object-dtype array of bytes to decode.
        r   Nr"   rß   )ÚbitorderT)rB   r#   r»  r2   )r½  r³  rÏ  rm   rÐ  r/   r¯  rG   Ú	py_bufferr?   ÚpackbitsÚArrayÚfrom_buffersÚlarge_stringr°  rC   rÂ  Úvalidater   ÚArrowInvalidr7   r&   r'   r   Úchunked_arrayr   r¾  )rŽ   rß  Úpar\   Úoffsetsra   r  ÚparsedÚvalidityÚpa_arrÚrows              r+   rÚ  zSAS7BDATReader._string_column%  sŠ  € ó 	à×!Ñ! "Ñ%ˆð ×#Ñ# BÑ'×,Ñ,Ó.ˆØ—‘ Ñ#ˆÜ�E“
ˆà×1Ñ1ˆØ�EŠ>ð %,¨F¡OˆG�F˜Q‘J�LÐ!à�9‰9Œ;Ø‰Hà—|‘|¤B§K¡K°ÀÔ$IÓJˆHØ—‘×&Ñ&Ø�O‰OÓØØ�r—|‘| GÓ,¨b¯l©l¸6Ó.BÐCó
ˆð
 �>‰>œU×3Ñ3Ò3ðØ—‘ T�Ô*ô  Ø×Ñ˜f˜XÓ&¬kÄ2Ç6Á6Ô.Jô
ð 	
øð —6‘6×&Ñ&ò ä ¤ W£°Ñ!1Ó2ò S�CÜ˜& ¨¡°¸¸a¹Ñ0@ÐAÓB×IÑIÈ'ÕRðSàð	ús   Ä
E ÅAF.c                óT   — |j                  | j                  xs | j                  «      S r.   )r'   r*   r¨   ©rŽ   Úbs     r+   rÛ  zSAS7BDATReader._decode_stringZ  s    € Ø�x‰x˜Ÿ™Ò>¨×)>Ñ)>Ó?Ð?rd   c                ón   — | j                   r(|j                  «       sd| _        | j                  |«      S |S )NT)r§   Úisasciir¢   rÛ  rö  s     r+   rb  z#SAS7BDATReader._convert_header_text]  s2   € Ø×#Ò#Ø—9‘9”;à.2�Ô+Ø×&Ñ& qÓ)Ð)àˆHrd   )rÀ   zFilePath | ReadBuffer[bytes]r£   r3  r¤   r3  r¥   ú
int | Noner*   zstr | lib.NoDefault | Noner¦   r3  r§   r3  rŸ   r   r�   r‘   )r�   z*tuple[int, int, int, int, bytes, int, int])r�   r‘   )r�   ú
np.ndarray)r�   r   )rÎ   r…   rN   r…   r�   Úfloat)rÎ   r…   rN   r…   r�   r…   )rÎ   r…   rŒ   r…   )r�   r3  )rÎ   r…   rŒ   r…   r�   r‘   r.   )r  rú  r�   r   )r·  r…   r�   z6tuple[int, tuple[np.ndarray, np.ndarray, bool] | None])r·  r…   r  r…   r�   r‘   )rß  r…   r�   r   )r÷  r&   r�   r‡   ))r’   r“   r”   Ú__doc__r•   r   r    r�   r¾   r»   rÑ   rÔ   r×   r½   r¹   r  rþ   r  rä   rº   r"  r,  r1  rQ  rT  rV  rh  r|  r‡  r‰  rª  Ú_subheader_processorsrâ   rÅ  r®  rÕ  r×  r´  rÚ  rÛ  rb  r–   rd   r+   r˜   r˜     s‚  … ñ ðD ÓØÓØÓð
 Ø"Ø"Ø $Ø/2¯~©~Ø!Ø$(Ø*1ð:<à1ð:<ð ð	:<ð
 ð:<ð ð:<ð -ð:<ð ð:<ð "ð:<ð (ð:<ð 
ó:<óx
ó*ó:EóEóDóóQPófó4ó2ó(;ó%óNSó
óó*3óXóó+QóZGóB@ó4ó5!ðv 	#Ø%Ø!Ø%Ø%Ø+Ø!Ø%Øð
Ðô8ðt.Øð.à	?ó.óB@ò6òó$&óP3
òj@ôrd   r˜   )r*   rÙ  r�   z*tuple[np.ndarray, np.ndarray, bool] | None)r\   rû  r]   rÙ  r�   rû  )rx   ú	pd.Seriesr]   rÙ  r�   rÿ  )Brý  Ú
__future__r   rÀ  r   Ú	functoolsrö   Útypingr   r&  Únumpyr?   Úpandas._configr   Úpandas._libsr   Úpandas._libs.byteswapr   r	   r
   r   r   Úpandas._libs.sasr   r   Úpandas._libs.tslibs.conversionr   Úpandas.compatr   Úpandas.errorsr   r   r   Úpandas.util._exceptionsr   Úpandasru   r   r   Úpandas.core.arrays.string_r   Úpandas.core.arrays.string_arrowr   Úpandas.io.commonr   Úpandas.io.sas.sas_constantsÚioÚsasÚsas_constantsrC   Úpandas.io.sas.sasreaderr   Úpandas._typingr   r   r   ro   rn   ÚcacherR   rV   rW   rc   r‚   r„   r˜   r–   rd   r+   ú<module>r     sï   ðñõ  #ã Ý Û Û 
Ý  Û ã å -å ÷õ ÷õ EÝ %÷ñ õ
 5ã ÷õ 3Ý <å 'ß +Ó +Ý -á÷ñ ñ ˜Ó&€Ù˜Ó%€ð ‡�ðL*ØðL*à/òL*ó ðL*ðf Ð ØÐ óó"5G÷pñ ô6]�Yõ ]rd   