§
    }Štjf  ã                   óN   — d Z ddlZddlZddlmZ ddlmZ  G d„ de¦  «        ZdS )zGit LFS related utilitiesé    N)ÚAbstractContextManager)ÚBinaryIOc                   ót   — e Zd ZdZdededefd„Zd„ Zd„ Zdd	efd
„Z	defd„Z
ej        fdededefd„Zd„ ZdS )ÚSliceFileObja¥  
    Utility context manager to read a *slice* of a seekable file-like object as a seekable, file-like object.

    This is NOT thread safe

    Inspired by stackoverflow.com/a/29838711/593036

    Credits to @julien-c

    Args:
        fileobj (`BinaryIO`):
            A file-like object to slice. MUST implement `tell()` and `seek()` (and `read()` of course).
            `fileobj` will be reset to its original position when exiting the context manager.
        seek_from (`int`):
            The start of the slice (offset from position 0 in bytes).
        read_limit (`int`):
            The maximum number of bytes to read from the slice.

    Attributes:
        previous_position (`int`):
            The previous position

    Examples:

    Reading 200 bytes with an offset of 128 bytes from a file (ie bytes 128 to 327):
    ```python
    >>> with open("path/to/file", "rb") as file:
    ...     with SliceFileObj(file, seek_from=128, read_limit=200) as fslice:
    ...         fslice.read(...)
    ```

    Reading a file in chunks of 512 bytes
    ```python
    >>> import os
    >>> chunk_size = 512
    >>> file_size = os.getsize("path/to/file")
    >>> with open("path/to/file", "rb") as file:
    ...     for chunk_idx in range(ceil(file_size / chunk_size)):
    ...         with SliceFileObj(file, seek_from=chunk_idx * chunk_size, read_limit=chunk_size) as fslice:
    ...             chunk = fslice.read(...)

    ```
    ÚfileobjÚ	seek_fromÚ
read_limitc                 ó0   — || _         || _        || _        d S ©N)r   r   r	   )Úselfr   r   r	   s       úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/huggingface_hub/utils/_lfs.pyÚ__init__zSliceFileObj.__init__C   s   € ØˆŒØ"ˆŒØ$ˆŒˆˆó    c                 ó$  — | j                              ¦   «         | _        | j                              dt          j        ¦  «        }t          | j        || j        z
  ¦  «        | _	        | j                              | j        t          j        ¦  «         | S )Nr   )r   ÚtellÚ_previous_positionÚseekÚosÚSEEK_ENDÚminr	   r   Ú_lenÚioÚSEEK_SET)r   Úend_of_streams     r   Ú	__enter__zSliceFileObj.__enter__H   sl   € Ø"&¤,×"3Ò"3Ñ"5Ô"5ˆÔØœ×)Ò)¨!­R¬[Ñ9Ô9ˆÝ˜œ¨¸¼Ñ)GÑHÔHˆŒ	àŒ×Ò˜$œ.­"¬+Ñ6Ô6Ð6Øˆr   c                 óZ   — | j                              | j        t          j        ¦  «         d S r   )r   r   r   r   r   )r   Úexc_typeÚ	exc_valueÚ	tracebacks       r   Ú__exit__zSliceFileObj.__exit__P   s%   € ØŒ×Ò˜$Ô1µ2´;Ñ?Ô?Ð?Ð?Ð?r   éÿÿÿÿÚnc                 ó¼   — |                       ¦   «         }|| j        k    rdS | j        |z
  }| j                             |dk     r|nt	          ||¦  «        ¦  «        }|S )Nr   r   )r   r   r   Úreadr   )r   r"   ÚposÚremaining_amountÚdatas        r   r$   zSliceFileObj.readS   s`   € Ø�iŠi‰kŒkˆØ�$”)ÒÐØ�3Øœ9 s™?ÐØŒ|× Ò °Q¸²U°UÐ!1Ð!1ÅÀAÐGWÑ@XÔ@XÑYÔYˆØˆr   Úreturnc                 óD   — | j                              ¦   «         | j        z
  S r   )r   r   r   ©r   s    r   r   zSliceFileObj.tell[   s   € ØŒ|× Ò Ñ"Ô" T¤^Ñ3Ð3r   ÚoffsetÚwhencec                 óê  — | j         }|| j        z   }|t          j        t          j        fv rE|t          j        k    r||z   n||z   }t          |t          ||¦  «        ¦  «        }t          j        }na|t          j        k    r>| j         	                    ¦   «         }t          ||z
  t          |||z
  ¦  «        ¦  «        }nt          d|› d�¦  «        ‚| j                             ||¦  «        | j         z
  S )Nzwhence value z is not supported)r   r   r   r   r   Úmaxr   ÚSEEK_CURr   r   Ú
ValueErrorr   )r   r+   r,   ÚstartÚendÚcur_poss         r   r   zSliceFileObj.seek^   sä   € Ø”ˆØ�d”iÑˆØ•b”k¥2¤;Ð/Ð/Ð/Ø'-µ´Ò'<Ð'<�U˜V‘^�^À#ÈÁ,ˆFÝ˜¥ F¨CÑ 0Ô 0Ñ1Ô1ˆFÝ”[ˆFˆFØ•r”{Ò"Ð"Ø”l×'Ò'Ñ)Ô)ˆGÝ˜ ™­#¨f°c¸G±mÑ*DÔ*DÑEÔEˆFˆFåÐF¨VÐFÐFÐFÑGÔGÐGØŒ|× Ò  ¨Ñ0Ô0°4´>ÑAÐAr   c              #   ó:   K  — |                       d¬¦  «        V — d S )Ni  @ )r"   )r$   r*   s    r   Ú__iter__zSliceFileObj.__iter__l   s&   è è € Ø�iŠi˜/ˆiÑ*Ô*Ð*Ð*Ð*Ð*Ð*r   N)r!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   r    r$   r   r   r   r   r5   © r   r   r   r      sð   € € € € € ð*ð *ðX% ð %°Sð %Àcð %ð %ð %ð %ð
ð ð ð@ð @ð @ðð �cð ð ð ð ð4�cð 4ð 4ð 4ð 4ð /1¬kð Bð B˜3ð B¨ð B¸cð Bð Bð Bð Bð+ð +ð +ð +ð +r   r   )r9   r   r   Ú
contextlibr   Útypingr   r   r;   r   r   ú<module>r>      s‚   ðð  Ð à 	€	€	€	Ø 	€	€	€	Ø -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð ðW+ð W+ð W+ð W+ð W+Ð)ñ W+ô W+ð W+ð W+ð W+r   