Ë
    iKêjyÅ  ã                   óÂ  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZ d dlmZmZmZ d dlmZ d dlmZ d dl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m Z m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 g d¢Z3erd dl4m5Z5 e6ee6   z  Z7e!e8d<   e9e:e:f   Z;e!e8d<   e9e:e:dz  f   Z<e!e8d<   e9e d   e;f   e9e d   e<f   z  Z=e!e8d<   e
e=gef   Z>e!e8d<   de7de?fd„Z@	 d?de7e/z  e d   z  dz  ddfd„ZA G d „ d!e j„                  «      ZCd"ejˆ                  v r]es[	 d dlEZFd#ZG	 d dlHmIc mJc mKc mLZM  eOeMj                   eQ«      reMj                   eGhz  eM_P        neMj                   j¥                  eG«        G d$„ deC¬%«      ZT G d&„ d'eT«      ZUd(e:de6fd)„ZV G d*„ d+eT«      ZW G d,„ d-eW«      ZX G d.„ d/eT«      ZY G d0„ d1eT«      ZZ G d2„ d3eT«      Z[ G d4„ d5eT«      Z\d6e]de:fd7„Z^d8e:de9e]e]f   fd9„Z_d:ee-   de:fd;„Z`d8e:de9e-d<f   fd=„Zad8e:de9e-d<f   dz  fd>„Zby# eN$ r eFj’                  j”                  ZMY �Œw xY w# eS$ r Y ŒÈw xY w)@é    N)ÚCallableÚIterable)ÚdatetimeÚ	timedeltaÚtimezone)Ú	lru_cache)Úsha384)ÚPathLikeÚgetenv)ÚPathÚPurePath)ÚQueue)ÚThread)ÚTYPE_CHECKINGÚAnyÚClassVarÚLiteralÚ	TypeAliasÚcast)Ú
BadZipFileÚZipFile)ÚStorageDirectoryÚstorage_directory)ÚHypothesisExceptionÚHypothesisWarning)ÚChoiceT)ÚUniqueIdentifierÚnot_set)Únote_deprecation)ÚDirectoryBasedExampleDatabaseÚExampleDatabaseÚGitHubArtifactDatabaseÚInMemoryExampleDatabaseÚMultiplexedDatabaseÚReadOnlyDatabase)ÚBaseObserverÚStrPathTÚ	SaveDataTÚDeleteDataTÚsaveÚdeleteÚListenerEventTÚ	ListenerTÚpathÚreturnc                 óB  — t        | «      } 	 | j                  «       s| j                  } | j                  «       sŒ| j                  «       xrF t	        j
                  | t        j                  t        j                  z  t        j                  z  «      S # t        $ r Y yw xY w)zÏ
    Returns True if the desired path can be used as database path because
    either the directory exists and can be used, or its root directory can
    be used and we can make the directory as needed.
    F)
r   ÚexistsÚparentÚis_dirÚosÚaccessÚR_OKÚW_OKÚX_OKÚPermissionError©r.   s    úX/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/hypothesis/database.pyÚ_usable_dirr<   A   sw   € ô �‹:€DðØ—+‘+”-à—;‘;ˆDð —+‘+•-ð �{‰{‹}ÒM¤§¡¨4´·±¼2¿7¹7Ñ1BÄRÇWÁWÑ1LÓ!MÐMøÜò ñ ðús   �,B ºAB Â	BÂBú:memory:r!   c                 ód  — | t         u r€t        j                  d«      �t        d«      ‚t	        dd¬«      }t        |j                  «      s3t        j                  d|j                  ›�t        d¬«       t        «       S t        |«      S | d	v r
t        «       S t        t        | «      } t        | «      S )
NÚHYPOTHESIS_DATABASE_FILEzÚThe $HYPOTHESIS_DATABASE_FILE environment variable no longer has any effect.  Configure your database location via a settings profile instead.
https://hypothesis.readthedocs.io/en/latest/settings.html#settings-profilesÚexamplesF)Úintent_to_writez�The database setting is not configured, and the default location is unusable - falling back to an in-memory database for this session.  path=é   ©Ú
stacklevel)Nr=   )r   r4   r   r   r   r<   r.   ÚwarningsÚwarnr   r#   Ú_StorageDirectoryDatabaser   r'   r    )r.   Ústorage_dirs     r;   Ú_db_for_pathrI   S   s´   € ð Œw�Ü�9‰9Ð/Ó0Ð<Ü%ð^óð ô (¨
ÀEÔJˆÜ˜;×+Ñ+Ô,Ü�M‰Mð4à4?×4DÑ4DÐ3GðIô "Øõô +Ó,Ð,Ü(¨Ó5Ð5ØÐ!Ñ!Ü&Ó(Ð(Ü”˜$Ó€DÜ(¨Ó.Ð.ó    c                   ó,   ‡ — e Zd Zdededdfˆ fd„Zˆ xZS )Ú_EDMetaÚargsÚkwargsr/   r!   c                 ód   •— | t         u rt        ddd¬«       t        |i |¤ŽS t        ‰| �  |i |¤ŽS )Na%  Creating a database using the abstract ExampleDatabase() class is deprecated. Prefer using a concrete subclass, like InMemoryExampleDatabase() or DirectoryBasedExampleDatabase(path). In particular, the special string ExampleDatabase(":memory:") should be replaced by InMemoryExampleDatabase().z
2025-04-07F)ÚsinceÚhas_codemod)r!   r   rI   ÚsuperÚ__call__)ÚselfrM   rN   Ú	__class__s      €r;   rS   z_EDMeta.__call__p   sH   ø€ Ø”?Ñ"ÜðCð
 #Ø!õô   Ð0¨Ñ0Ð0Ü‰wÑ Ð0¨Ñ0Ð0rJ   )Ú__name__Ú
__module__Ú__qualname__r   rS   Ú__classcell__©rU   s   @r;   rL   rL   o   s#   ø„ ð1˜cð 1¨Sð 1Ð5F÷ 1ñ 1rJ   rL   Úsphinxz$hypothesis.database._EDMeta.__call__c                   ó  — e Zd ZdZdd„Zej                  dededdfd„«       Zej                  dede	e   fd„«       Z
ej                  dededdfd	„«       Zd
edededdfd„Zdeddfd„Zdeddfd„Zdd„Zdeddfd„Zdd„Zdd„Zy)r!   a#  
    A Hypothesis database, for use in |settings.database|.

    Hypothesis automatically saves failures to the database set in
    |settings.database|. The next time the test is run, Hypothesis will replay
    any failures from the database in |settings.database| for that test (in
    |Phase.reuse|).

    The database is best thought of as a cache that you never need to invalidate.
    Entries may be transparently dropped when upgrading your Hypothesis version
    or changing your test. Do not rely on the database for correctness; to ensure
    Hypothesis always tries an input, use |@example|.

    A Hypothesis database is a simple mapping of bytes to sets of bytes. Hypothesis
    provides several concrete database subclasses. To write your own database class,
    see :doc:`/how-to/custom-database`.

    Change listening
    ----------------

    An optional extension to |ExampleDatabase| is change listening. On databases
    which support change listening, calling |ExampleDatabase.add_listener| adds
    a function as a change listener, which will be called whenever a value is
    added, deleted, or moved inside the database. See |ExampleDatabase.add_listener|
    for details.

    All databases in Hypothesis support change listening. Custom database classes
    are not required to support change listening, though they will not be compatible
    with features that require change listening until they do so.

    .. note::

        While no Hypothesis features currently require change listening, change
        listening is required by `HypoFuzz <https://hypofuzz.com/>`_.

    Database methods
    ----------------

    Required methods:

    * |ExampleDatabase.save|
    * |ExampleDatabase.fetch|
    * |ExampleDatabase.delete|

    Optional methods:

    * |ExampleDatabase.move|

    Change listening methods:

    * |ExampleDatabase.add_listener|
    * |ExampleDatabase.remove_listener|
    * |ExampleDatabase.clear_listeners|
    * |ExampleDatabase._start_listening|
    * |ExampleDatabase._stop_listening|
    * |ExampleDatabase._broadcast_change|
    r/   Nc                 ó   — g | _         y ©N©Ú
_listeners©rT   s    r;   Ú__init__zExampleDatabase.__init__å   s	   € Ø+-ˆ�rJ   ÚkeyÚvaluec                 óD   — t        t        | «      j                  › d�«      ‚)zpSave ``value`` under ``key``.

        If ``value`` is already present in ``key``, silently do nothing.
        z.save©ÚNotImplementedErrorÚtyperV   ©rT   rc   rd   s      r;   r*   zExampleDatabase.saveè   s!   € ô "¤T¨$£Z×%8Ñ%8Ð$9¸Ð"?Ó@Ð@rJ   c                 óD   — t        t        | «      j                  › d�«      ‚)z5Return an iterable over all values matching this key.z.fetchrf   ©rT   rc   s     r;   ÚfetchzExampleDatabase.fetchð   s!   € ô "¤T¨$£Z×%8Ñ%8Ð$9¸Ð"@ÓAÐArJ   c                 óD   — t        t        | «      j                  › d�«      ‚)zmRemove ``value`` from ``key``.

        If ``value`` is not present in ``key``, silently do nothing.
        z.deleterf   ri   s      r;   r+   zExampleDatabase.deleteõ   s!   € ô "¤T¨$£Z×%8Ñ%8Ð$9¸Ð"AÓBÐBrJ   ÚsrcÚdestc                 ó|   — ||k(  r| j                  ||«       y| j                  ||«       | j                  ||«       y)aD  
        Move ``value`` from key ``src`` to key ``dest``.

        Equivalent to ``delete(src, value)`` followed by ``save(src, value)``,
        but may have a more efficient implementation.

        Note that ``value`` will be inserted at ``dest`` regardless of whether
        it is currently present at ``src``.
        N)r*   r+   ©rT   rn   ro   rd   s       r;   ÚmovezExampleDatabase.moveý   s8   € ð �$Š;Ø�I‰I�c˜5Ô!ØØ�‰�C˜ÔØ�	‰	�$˜ÕrJ   Úfc                óŠ   — t        | j                  «      }| j                  j                  |«       |s| j                  «        yy)a�  
        Add a change listener. ``f`` will be called whenever a value is saved,
        deleted, or moved in the database.

        ``f`` can be called with two different event values:

        * ``("save", (key, value))``
        * ``("delete", (key, value))``

        where ``key`` and ``value`` are both ``bytes``.

        There is no ``move`` event. Instead, a move is broadcasted as a
        ``delete`` event followed by a ``save`` event.

        For the ``delete`` event, ``value`` may be ``None``. This might occur if
        the database knows that a deletion has occurred in ``key``, but does not
        know what value was deleted.
        N)Úboolr`   ÚappendÚ_start_listening)rT   rs   Úhad_listenerss      r;   Úadd_listenerzExampleDatabase.add_listener  s8   € ô& ˜TŸ_™_Ó-ˆØ�‰×Ñ˜qÔ!ÙØ×!Ñ!Õ#ð rJ   c                ó’   — || j                   vry| j                   j                  |«       | j                   s| j                  «        yy)z‘
        Removes ``f`` from the list of change listeners.

        If ``f`` is not in the list of change listeners, silently do nothing.
        N)r`   ÚremoveÚ_stop_listening)rT   rs   s     r;   Úremove_listenerzExampleDatabase.remove_listener%  s=   € ð �D—O‘OÑ#ØØ�‰×Ñ˜qÔ!Ø�ŠØ× Ñ Õ"ð rJ   c                 óˆ   — t        | j                  «      }| j                  j                  «        |r| j                  «        yy)zRemove all change listeners.N)ru   r`   Úclearr|   )rT   rx   s     r;   Úclear_listenerszExampleDatabase.clear_listeners1  s4   € ä˜TŸ_™_Ó-ˆØ�‰×ÑÔÙØ× Ñ Õ"ð rJ   Úeventc                 ó6   — | j                   D ]
  } ||«       Œ y)a!  
        Called when a value has been either added to or deleted from a key in
        the underlying database store. The possible values for ``event`` are:

        * ``("save", (key, value))``
        * ``("delete", (key, value))``

        ``value`` may be ``None`` for the ``delete`` event, indicating we know
        that some value was deleted under this key, but not its exact value.

        Note that you should not assume your instance is the only reference to
        the underlying database store. For example, if two instances of
        |DirectoryBasedExampleDatabase| reference the same directory,
        _broadcast_change should be called whenever a file is added or removed
        from the directory, even if that database was not responsible for
        changing the file.
        Nr_   )rT   r�   Úlisteners      r;   Ú_broadcast_changez!ExampleDatabase._broadcast_change8  s   € ð$ Ÿ™ò 	ˆHÙ�U�Oñ	rJ   c                 óV   — t        j                  | j                  › d�t        d¬«       y)a×  
        Called when the database adds a change listener, and did not previously
        have any change listeners. Intended to allow databases to wait to start
        expensive listening operations until necessary.

        ``_start_listening`` and ``_stop_listening`` are guaranteed to alternate,
        so you do not need to handle the case of multiple consecutive
        ``_start_listening`` calls without an intermediate ``_stop_listening``
        call.
        z' does not support listening for changesé   rC   N©rE   rF   rU   r   ra   s    r;   rw   z ExampleDatabase._start_listeningM  s&   € ô 	�‰Ø�~‰~ÐÐEÐFÜØö	
rJ   c                 óV   — t        j                  | j                  › d�t        d¬«       y)aC  
        Called whenever no change listeners remain on the database.

        ``_stop_listening`` and ``_start_listening`` are guaranteed to alternate,
        so you do not need to handle the case of multiple consecutive
        ``_stop_listening`` calls without an intermediate ``_start_listening``
        call.
        z0 does not support stopping listening for changesr†   rC   Nr‡   ra   s    r;   r|   zExampleDatabase._stop_listening^  s&   € ô 	�‰Ø�~‰~ÐÐNÐOÜØö	
rJ   ©r/   N)rV   rW   rX   Ú__doc__rb   ÚabcÚabstractmethodÚbytesr*   r   rl   r+   rr   r-   ry   r}   r€   r,   r„   rw   r|   © rJ   r;   r!   r!   ª   s  „ ñ8ót.ð 	×ÑðA˜ð A eð A°ò Aó ðAð 	×ÑðB˜ð B 8¨E¡?ò Bó ðBð 	×ÑðC˜%ð C¨ð C°$ò Có ðCð˜ð  Uð °5ð ¸Tó ð $˜ið $¨tó $ð0
# ð 
#°$ó 
#ó#ð ~ð ¸$ó ó*
ô"
rJ   )Ú	metaclassc                   óŽ   ‡ — e Zd ZdZdˆ fd„Zdefd„Zdedefd„Z	de
dee
   fd	„Zde
d
e
ddfd„Zde
d
e
ddfd„Zdd„Zdd„Zˆ xZS )r#   a?  A non-persistent example database, implemented in terms of an in-memory
    dictionary.

    This can be useful if you call a test function several times in a single
    session, or for testing other database implementations, but because it
    does not persist between runs we do not recommend it for general use.
    r/   Nc                 ó0   •— t         ‰| �  «        i | _        y r^   )rR   rb   Údata)rT   rU   s    €r;   rb   z InMemoryExampleDatabase.__init__w  s   ø€ Ü‰ÑÔØ-/ˆ�	rJ   c                 ó"   — d| j                   ›d�S )NzInMemoryExampleDatabase(ú))r’   ra   s    r;   Ú__repr__z InMemoryExampleDatabase.__repr__{  s   € Ø)¨$¯)©)¨°aÐ8Ð8rJ   Úotherc                 óV   — t        |t        «      xr | j                  |j                  u S r^   )Ú
isinstancer#   r’   ©rT   r–   s     r;   Ú__eq__zInMemoryExampleDatabase.__eq__~  s"   € Ü˜%Ô!8Ó9ÒU¸d¿i¹iÈ5Ï:É:Ð>UÐUrJ   rc   c              #   óX   K  — | j                   j                  |d«      E d {  –—†  y 7 Œ­w©NrŽ   )r’   Úgetrk   s     r;   rl   zInMemoryExampleDatabase.fetch�  s   è ø€ Ø—9‘9—=‘=  bÓ)×)Ò)ús   ‚ *¢(£*rd   c                 ó¼   — t        |«      }| j                  j                  |t        «       «      }||v}|j	                  |«       |r| j                  d||ff«       y y ©Nr*   )r�   r’   Ú
setdefaultÚsetÚaddr„   ©rT   rc   rd   ÚvaluesÚchangeds        r;   r*   zInMemoryExampleDatabase.save„  sX   € Ü�e“ˆØ—‘×%Ñ% c¬3«5Ó1ˆØ˜vÐ%ˆØ�
‰
�5ÔáØ×"Ñ" F¨S°%¨LÐ#9Õ:ð rJ   c                 ó¼   — t        |«      }| j                  j                  |t        «       «      }||v }|j	                  |«       |r| j                  d||ff«       y y ©Nr+   )r�   r’   r�   r¡   Údiscardr„   r£   s        r;   r+   zInMemoryExampleDatabase.delete�  sU   € Ü�e“ˆØ—‘—‘˜s¤C£EÓ*ˆØ˜6�/ˆØ�‰�uÔáØ×"Ñ" H¨s°E¨lÐ#;Õ<ð rJ   c                  ó   — y r^   rŽ   ra   s    r;   rw   z(InMemoryExampleDatabase._start_listening–  s   € ð 	rJ   c                  ó   — y r^   rŽ   ra   s    r;   r|   z'InMemoryExampleDatabase._stop_listeningœ  ó   € ØrJ   r‰   )rV   rW   rX   rŠ   rb   Ústrr•   Úobjectru   rš   r�   r   rl   r*   r+   rw   r|   rY   rZ   s   @r;   r#   r#   n  s„   ø„ ñõ0ð9˜#ó 9ðV˜Fð V tó Vð*˜ð * 8¨E¡?ó *ð;˜ð ; eð ;°ó ;ð=˜%ð =¨ð =°$ó =ó÷rJ   r#   rc   c                 ó:   — t        | «      j                  «       d d S )Né   )r	   Ú	hexdigest©rc   s    r;   Ú_hashr²      s   € Ü�#‹;× Ñ Ó" 3 BÐ'Ð'rJ   c                   ó  ‡ — e Zd ZU dZdZee   ed<    ee«      Z	ee
   ed<   deddfˆ fd„Zdd	„Zde
fd
„Zdedefd„Zdedefd„Zdededefd„Zdedee   fd„Zdededdfd„Zdedededdfd„Zdededdfd„Zdd„Zdd„Zˆ xZS )r    aê  Use a directory to store Hypothesis examples as files.

    Each test corresponds to a directory, and each example to a file within that
    directory.  While the contents are fairly opaque, a
    |DirectoryBasedExampleDatabase| can be shared by checking the directory
    into version control, for example with the following ``.gitignore``::

        # Ignore files cached by Hypothesis...
        .hypothesis/*
        # except for the examples directory
        !.hypothesis/examples/

    Note however that this only makes sense if you also pin to an exact version of
    Hypothesis, and we would usually recommend implementing a shared database with
    a network datastore - see |ExampleDatabase|, and the |MultiplexedDatabase| helper.
    s   .hypothesis-keysÚ_metakeys_nameÚ_metakeys_hashr.   r/   Nc                 ól   •— t         ‰| �  «        t        |«      | _        i | _        d | _        d| _        y )NF)rR   rb   r   r.   ÚkeypathsÚ	_observerÚ_ensure_directory_exists_called)rT   r.   rU   s     €r;   rb   z&DirectoryBasedExampleDatabase.__init__»  s/   ø€ Ü‰ÑÔÜ˜“JˆŒ	Ø+-ˆŒØ.2ˆŒØ/4ˆÕ,rJ   c                 óf   — | j                   ry | j                  j                  dd¬«       d| _         y ©NT©Úexist_okÚparents)r¹   r.   Úmkdirra   s    r;   Ú_ensure_directory_existsz6DirectoryBasedExampleDatabase._ensure_directory_existsÂ  s*   € à×/Ò/Øà�	‰	�‰ ¨tˆÔ4Ø/3ˆÕ,rJ   c                 ó"   — d| j                   ›d�S )NzDirectoryBasedExampleDatabase(r”   r:   ra   s    r;   r•   z&DirectoryBasedExampleDatabase.__repr__Ê  s   € Ø/°·	±	¨}¸AÐ>Ð>rJ   r–   c                 óX   — t        |t        «      xr | j                  |j                  k(  S r^   )r˜   r    r.   r™   s     r;   rš   z$DirectoryBasedExampleDatabase.__eq__Í  s$   € ä�uÔ;Ó<ÒXÀÇÁÈeÏjÉjÑAXð	
rJ   rc   c                 ó¨   — 	 | j                   |   S # t        $ r Y nw xY w| j                  t        |«      z  | j                   |<   | j                   |   S r^   )r·   ÚKeyErrorr.   r²   rk   s     r;   Ú	_key_pathz'DirectoryBasedExampleDatabase._key_pathÒ  sR   € ð	Ø—=‘= Ñ%Ð%øÜò 	Ùð	úà!ŸY™Y¬¨s«Ñ3ˆ�‰�cÑØ�}‰}˜SÑ!Ð!s   ‚ ‘	œrd   c                 ó<   — | j                  |«      t        |«      z  S r^   )rÅ   r²   ri   s      r;   Ú_value_pathz)DirectoryBasedExampleDatabase._value_pathÚ  s   € Ø�~‰~˜cÓ"¤U¨5£\Ñ1Ð1rJ   c              #   óî   K  — | j                  |«      }|j                  «       sy 	 t        j                  |«      D ]  }	 ||z  j	                  «       –— Œ y # t
        $ r Y Œ'w xY w# t
        $ r Y y w xY w­wr^   )rÅ   r3   r4   ÚlistdirÚ
read_bytesÚOSError)rT   rc   Úkpr.   s       r;   rl   z#DirectoryBasedExampleDatabase.fetchÝ  sx   è ø€ Ø�^‰^˜CÓ ˆØ�y‰yŒ{Øð	ÜŸ
™
 2›ò �ðØ ™9×0Ñ0Ó2Ó2ñøô ò Ùðûäò 	áð	üsK   ‚#A5¦A& ¿AÁA& ÁA5Á	A#Á A& Á"A#Á#A& Á&	A2Á/A5Á1A2Á2A5c                 ó  — | j                  |«      }|j                  | j                  k7  r| j                  | j                  |«       	 | j                  «        |j                  dd¬«       | j                  ||«      }|j                  «       srt        j                  «       \  }}t        |«      }t        j                  ||«       t        j                  |«       	 |j                  |«       |j                  «       rJ ‚y y # t         $ rg}|j"                  t"        j$                  k(  r0	 |j'                  |j)                  «       «       n# t         $ r Y nw xY w|j+                  «        Y d }~Œd }~ww xY w# t         $ r Y y w xY wr»   )rÅ   Únamerµ   r*   r´   rÀ   r¿   rÇ   r1   ÚtempfileÚmkstempr   r4   ÚwriteÚcloseÚrenamerË   ÚerrnoÚEXDEVÚwrite_bytesrÊ   Úunlink)	rT   rc   rd   Úkey_pathr.   ÚfdÚtmpnameÚtmppathÚerrs	            r;   r*   z"DirectoryBasedExampleDatabase.saveì  sE  € Ø—>‘> #Ó&ˆØ�=‰=˜D×/Ñ/Ò/ð �I‰I�d×)Ñ)¨3Ô/ð
	Ø×)Ñ)Ô+Ø�N‰N D°$ˆNÔ7Ø×#Ñ# C¨Ó/ˆDØ—;‘;”=ô
 '×.Ñ.Ó0‘��GÜ˜w›-�Ü—‘˜˜UÔ#Ü—‘˜”ð
%Ø—N‘N 4Ô(ð #Ÿ>™>Ô+Ð+Ð+Ð+ð) !øô ò %Ø—y‘y¤E§K¡KÒ/ð!Ø ×,Ñ,¨W×-?Ñ-?Ó-AÕBøÜ&ò !Ù ð!úà—N‘N×$Ñ$ûð%ûô ò 	Ùð	úsa   ÁBE3 ÃD  Ã,E3 Ä 	E0Ä	E+Ä'EÅE+Å	EÅE+ÅEÅE+Å&E3 Å+E0Å0E3 Å3	E?Å>E?rn   ro   c                 ó†  — ||k(  r| j                  ||«       y | j                  ||«      }| j                  ||«      }| j                  |«      j                  «       s| j                  | j                  |«       	 t        j                  ||«       y # t        $ r' | j                  ||«       | j                  ||«       Y y w xY wr^   )	r*   rÇ   rÅ   r1   r´   r4   ÚrenamesrË   r+   )rT   rn   ro   rd   Úsrc_pathÚ	dest_paths         r;   rr   z"DirectoryBasedExampleDatabase.move  s§   € Ø�$Š;Ø�I‰I�c˜5Ô!Øà×#Ñ# C¨Ó/ˆØ×$Ñ$ T¨5Ó1ˆ	ð �~‰~˜dÓ#×*Ñ*Ô,Ø�I‰I�d×)Ñ)¨4Ô0ð	#Ü�J‰J�x Õ+øÜò 	#Ø�K‰K˜˜UÔ#Ø�I‰I�d˜EÖ"ð	#ús   Á9B Â-C Â?C c                 óú   — 	 | j                  ||«      j                  «        	 | j                  |«      j	                  «        | j                  | j                  |«       y # t        $ r Y y w xY w# t        $ r Y y w xY wr^   )rÇ   r×   rË   rÅ   Úrmdirr+   r´   ri   s      r;   r+   z$DirectoryBasedExampleDatabase.delete$  sw   € ð	Ø×Ñ˜S %Ó(×/Ñ/Ô1ð	2Ø�N‰N˜3Ó×%Ñ%Ô'ð �K‰K˜×+Ñ+¨SÕ1øô ò 	Ùð	ûô ò 	Ùð	ús"   ‚ A £A. Á	A+Á*A+Á.	A:Á9A:c                 óf  ‡‡‡‡‡	‡
‡‡‡— 	 ddl mŠmŠmŠmŠmŠ	mŠ
m} ddlm	} | j!                  | j"                  «      D �ci c]  }t%        |«      |“Œ c}Š| j&                  Š| j(                  Š G ˆˆˆˆˆ	ˆ
ˆˆˆf	d„d	|«      }| j+                  «         |«       | _        | j,                  j/                   |«       | j0                  d
‰‰	‰
g¬«       | j,                  j3                  «        y # t        $ r7 t        j                  d| j                  j                  › d�t        d¬«       Y y w xY wc c}w )Nr   )ÚDirCreatedEventÚDirDeletedEventÚDirMovedEventÚFileCreatedEventÚFileDeletedEventÚFileMovedEventÚFileSystemEventHandler)ÚObserverzlistening for changes in a zR requires the watchdog library. To install, run `pip install hypothesis[watchdog]`r†   rC   c                   óv   •	— e Zd ZdW °W ° z  ddfˆ ˆˆˆfd„ZdW °W °z  ddfˆˆˆfd„ZdW °W °z  ddfˆˆˆfd„Zy)ú?DirectoryBasedExampleDatabase._start_listening.<locals>.Handlerr�   r/   Nc                 ó–  •— t        |‰«      rJ ‚t        |j                  t        «      sJ ‚t        |j                  «      }|j                  j
                  }|‰k(  r	 |j                  «       ‰	|j
                  <   y ‰	j                  |«      }|€y 	 |j                  «       } ‰d||ff«       y # t        $ r Y y w xY w# t        $ r Y y w xY wrŸ   )	r˜   rß   r¬   r   r2   rÎ   rÊ   rË   r�   )
Ú_selfr�   Ú
value_pathÚkey_hashrc   rd   rä   r„   rµ   Úhash_to_keys
         €€€€r;   Ú
on_createdzJDirectoryBasedExampleDatabase._start_listening.<locals>.Handler.on_createdS  sÛ   ø€ ä% e¨_Ô=Ð=Ð=ô " %§.¡.´#Ô6Ð6Ð6ä! %§.¡.Ó1�
à%×,Ñ,×1Ñ1�à˜~Ò-ðØ7A×7LÑ7LÓ7N˜ J§O¡OÑ4ð à!—o‘o hÓ/�Ø�;ð ðØ&×1Ñ1Ó3�Eñ " 6¨C°¨<Ð"8Õ9øô% #ò ð Øðûô ò Ùðús$   ÁB- ÂB< Â-	B9Â8B9Â<	CÃCc                 óì   •— t        |‰«      rJ ‚t        |j                  t        «      sJ ‚t        |j                  «      }‰j	                  |j
                  j                  «      }|€y  ‰d|d ff«       y r§   )r˜   rß   r¬   r   r�   r2   rÎ   )rT   r�   rð   rc   rå   r„   rò   s       €€€r;   Ú
on_deletedzJDirectoryBasedExampleDatabase._start_listening.<locals>.Handler.on_deletedu  sh   ø€ Ü% e¨_Ô=Ð=Ð=Ü! %§.¡.´#Ô6Ð6Ð6ä! %§.¡.Ó1�
Ø!—o‘o j×&7Ñ&7×&<Ñ&<Ó=�Ø�;Øá! 8¨c°4¨[Ð"9Õ:rJ   c                 óô  •— t        |‰«      rJ ‚t        |j                  t        «      sJ ‚t        |j                  t        «      sJ ‚t	        |j                  «      }t	        |j                  «      }‰	j                  |j                  j                  «      }‰	j                  |j                  j                  «      }|�|€y 	 |j                  «       } ‰d||ff«        ‰d||ff«       y # t        $ r Y y w xY w)Nr+   r*   )
r˜   rß   r¬   rà   r   r�   r2   rÎ   rÊ   rË   )
rT   r�   rß   rà   Úk1Úk2rd   ræ   r„   rò   s
          €€€r;   Úon_movedzHDirectoryBasedExampleDatabase._start_listening.<locals>.Handler.on_moved€  sà   ø€ Ü% e¨]Ô;Ð;Ð;Ü! %§.¡.´#Ô6Ð6Ð6Ü! %§/¡/´3Ô7Ð7Ð7ä §¡Ó/�Ü  §¡Ó1�	Ø —_‘_ X§_¡_×%9Ñ%9Ó:�Ø —_‘_ Y×%5Ñ%5×%:Ñ%:Ó;�à�:  ØðØ%×0Ñ0Ó2�Eñ " 8¨b°%¨[Ð"9Ô:Ù! 6¨B°¨;Ð"7Õ8øô	 ò Ùðús   ÃC+ Ã+	C7Ã6C7)rV   rW   rX   ró   rõ   rù   )	rä   rå   ræ   rç   rè   ré   r„   rµ   rò   s	   €€€€€€€€€r;   ÚHandlerrí   P  sY   ø„ ð :Ñ)9¹OÑ)Kð  :ÐPT÷  :ð  :ðD	;Ñ(8¹?Ñ(Jð 	;Èt÷ 	;ð9¡n±}Ñ&Dð 9È÷ 9ð 9rJ   rú   T)Ú	recursiveÚevent_filter)Úwatchdog.eventsrä   rå   ræ   rç   rè   ré   rê   Úwatchdog.observersrë   ÚImportErrorrE   rF   rU   rV   r   rl   r´   r²   rµ   r„   rÀ   r¸   Úscheduler.   Ústart)rT   rê   rë   rc   rú   rä   rå   ræ   rç   rè   ré   r„   rµ   rò   s        @@@@@@@@@r;   rw   z.DirectoryBasedExampleDatabase._start_listening6  s  ÿø€ ð	÷÷ ñ õ 4ð 37·*±*¸T×=PÑ=PÓ2QÖR¨3”u˜S“z 3‘ÒRˆØ×,Ñ,ˆØ ×2Ñ2Ð÷C	9ö C	9Ø"ôC	9ðT 	×%Ñ%Ô'Ù!›ˆŒØ�‰×ÑÙ‹Ið �I‰IØØ*Ð,<¸nÐMð 	 ô 	
ð 	�‰×ÑÕøôE ò 	Ü�M‰MØ-¨d¯n©n×.EÑ.EÐ-Fð G5ð 5ô "Øõñ ð	üò Ss   ‹C+ Á D.Ã+=D+Ä*D+c                 ó–   — | j                   €J ‚| j                   j                  «        | j                   j                  «        d | _         y r^   )r¸   ÚstopÚjoinra   s    r;   r|   z-DirectoryBasedExampleDatabase._stop_listening¦  s9   € Ø�~‰~Ð)Ð)Ð)Ø�‰×ÑÔØ�‰×ÑÔØˆ�rJ   r‰   )rV   rW   rX   rŠ   r´   r   r�   Ú__annotations__r²   rµ   r¬   r'   rb   rÀ   r•   r­   ru   rš   r   rÅ   rÇ   r   rl   r*   rr   r+   rw   r|   rY   rZ   s   @r;   r    r    ¤  s  ø… ñð& ':€N�H˜U‘OÓ9Ù$)¨.Ó$9€N�H˜S‘MÓ9ð5˜Xð 5¨$õ 5ó4ð?˜#ó ?ð
˜Fð 
 tó 
ð
"˜Uð " tó "ð2˜uð 2¨Uð 2°tó 2ð˜ð  8¨E¡?ó ð$˜ð $ eð $°ó $ðL#˜ð # Uð #°5ð #¸Tó #ð$2˜%ð 2¨ð 2°$ó 2ó$n÷`rJ   r    c                   ó0   ‡ — e Zd Zdeddfˆ fd„Zdd„Zˆ xZS )rG   rH   r/   Nc                 óF   •— t         ‰| �  |j                  «       || _        y r^   )rR   rb   r.   Ú_storage_dir)rT   rH   rU   s     €r;   rb   z"_StorageDirectoryDatabase.__init__·  s   ø€ Ü‰Ñ˜×)Ñ)Ô*Ø'ˆÕrJ   c                 ó`   — | j                   ry | j                  j                  «        d| _         y )NT)r¹   r  Úcreate_if_missingra   s    r;   rÀ   z2_StorageDirectoryDatabase._ensure_directory_exists»  s(   € Ø×/Ò/Øà×Ñ×+Ñ+Ô-Ø/3ˆÕ,rJ   r‰   )rV   rW   rX   r   rb   rÀ   rY   rZ   s   @r;   rG   rG   ­  s   ø„ ð(Ð$4ð (¸õ (÷4rJ   rG   c                   ó–   ‡ — e Zd ZdZdeddfˆ fd„Zdefd„Zdede	fd„Z
d	edee   fd
„Zd	ededdfd„Zd	ededdfd„Zdd„Zdd„Zˆ xZS )r%   a§  A wrapper to make the given database read-only.

    The implementation passes through ``fetch``, and turns ``save``, ``delete``, and
    ``move`` into silent no-ops.

    Note that this disables Hypothesis' automatic discarding of stale examples.
    It is designed to allow local machines to access a shared database (e.g. from CI
    servers), without propagating changes back from a local or in-development branch.
    Údbr/   Nc                 óT   •— t         ‰| �  «        t        |t        «      sJ ‚|| _        y r^   )rR   rb   r˜   r!   Ú_wrapped©rT   r  rU   s     €r;   rb   zReadOnlyDatabase.__init__Î  s%   ø€ Ü‰ÑÔÜ˜"œoÔ.Ð.Ð.Øˆ�rJ   c                 ó"   — d| j                   ›d�S )NzReadOnlyDatabase(r”   )r  ra   s    r;   r•   zReadOnlyDatabase.__repr__Ó  s   € Ø" 4§=¡=Ð"3°1Ð5Ð5rJ   r–   c                 óX   — t        |t        «      xr | j                  |j                  k(  S r^   )r˜   r%   r  r™   s     r;   rš   zReadOnlyDatabase.__eq__Ö  s"   € Ü˜%Ô!1Ó2ÒV°t·}±}ÈÏÉÑ7VÐVrJ   rc   c              #   óV   K  — | j                   j                  |«      E d {  –—†  y 7 Œ­wr^   )r  rl   rk   s     r;   rl   zReadOnlyDatabase.fetchÙ  s   è ø€ Ø—=‘=×&Ñ& sÓ+×+Ò+ús   ‚)¡'¢)rd   c                  ó   — y r^   rŽ   ri   s      r;   r*   zReadOnlyDatabase.saveÜ  r«   rJ   c                  ó   — y r^   rŽ   ri   s      r;   r+   zReadOnlyDatabase.deleteß  r«   rJ   c                  ó   — y r^   rŽ   ra   s    r;   rw   z!ReadOnlyDatabase._start_listeningâ  s   € àrJ   c                  ó   — y r^   rŽ   ra   s    r;   r|   z ReadOnlyDatabase._stop_listeningæ  r«   rJ   r‰   )rV   rW   rX   rŠ   r!   rb   r¬   r•   r­   ru   rš   r�   r   rl   r*   r+   rw   r|   rY   rZ   s   @r;   r%   r%   Ã  s’   ø„ ñð˜?ð ¨tõ ð
6˜#ó 6ðW˜Fð W tó Wð,˜ð , 8¨E¡?ó ,ð˜ð  eð °ó ð˜%ð ¨ð °$ó ó÷rJ   r%   c                   ó®   ‡ — e Zd ZdZdeddfˆ fd„Zdefd„Zdede	fd„Z
d	edee   fd
„Zd	ededdfd„Zd	ededdfd„Zdedededdfd„Zdd„Zdd„Zˆ xZS )r$   aü  A wrapper around multiple databases.

    Each ``save``, ``fetch``, ``move``, or ``delete`` operation will be run against
    all of the wrapped databases.  ``fetch`` does not yield duplicate values, even
    if the same value is present in two or more of the wrapped databases.

    This combines well with a :class:`ReadOnlyDatabase`, as follows:

    .. code-block:: python

        local = DirectoryBasedExampleDatabase("/tmp/hypothesis/examples/")
        shared = CustomNetworkDatabase()

        settings.register_profile("ci", database=shared)
        settings.register_profile(
            "dev", database=MultiplexedDatabase(local, ReadOnlyDatabase(shared))
        )
        settings.load_profile("ci" if os.environ.get("CI") else "dev")

    So your CI system or fuzzing runs can populate a central shared database;
    while local runs on development machines can reproduce any failures from CI
    but will only cache their own failures locally and cannot remove examples
    from the shared database.
    Údbsr/   Nc                 óX   •— t         ‰| �  «        t        d„ |D «       «      sJ ‚|| _        y )Nc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr^   )r˜   r!   )Ú.0r  s     r;   ú	<genexpr>z/MultiplexedDatabase.__init__.<locals>.<genexpr>  s   è ø€ ÒA°r”:˜b¤/×2ÑAùs   ‚)rR   rb   Úallr  )rT   r  rU   s     €r;   rb   zMultiplexedDatabase.__init__  s)   ø€ Ü‰ÑÔÜÑA¸SÔAÔAÐAÐAØˆ�rJ   c                 ór   — dj                  dj                  t        t        | j                  «      «      «      S )NzMultiplexedDatabase({})z, )Úformatr  ÚmapÚreprr  ra   s    r;   r•   zMultiplexedDatabase.__repr__	  s'   € Ø(×/Ñ/°·	±	¼#¼dÀDÇMÁMÓ:RÓ0SÓTÐTrJ   r–   c                 óX   — t        |t        «      xr | j                  |j                  k(  S r^   )r˜   r$   r  r™   s     r;   rš   zMultiplexedDatabase.__eq__  s$   € ä�uÔ1Ó2ÒV°t·}±}ÈÏÉÑ7Vð	
rJ   rc   c              #   ó¢   K  — t        «       }| j                  D ]2  }|j                  |«      D ]  }||vsŒ|–— |j                  |«       Œ Œ4 y ­wr^   )r¡   r  rl   r¢   )rT   rc   Úseenr  rd   s        r;   rl   zMultiplexedDatabase.fetch  sO   è ø€ Ü‹uˆØ—-‘-ò 	$ˆBØŸ™ #›ò $�Ø Ò$Ø’KØ—H‘H˜U•Oñ$ñ	$ùs
   ‚2AµArd   c                 óJ   — | j                   D ]  }|j                  ||«       Œ y r^   )r  r*   ©rT   rc   rd   r  s       r;   r*   zMultiplexedDatabase.save  s#   € Ø—-‘-ò 	 ˆBØ�G‰G�C˜Õñ	 rJ   c                 óJ   — | j                   D ]  }|j                  ||«       Œ y r^   )r  r+   r&  s       r;   r+   zMultiplexedDatabase.delete  s#   € Ø—-‘-ò 	"ˆBØ�I‰I�c˜5Õ!ñ	"rJ   rn   ro   c                 óL   — | j                   D ]  }|j                  |||«       Œ y r^   )r  rr   )rT   rn   ro   rd   r  s        r;   rr   zMultiplexedDatabase.move!  s%   € Ø—-‘-ò 	&ˆBØ�G‰G�C˜˜uÕ%ñ	&rJ   c                 ó\   — | j                   D ]  }|j                  | j                  «       Œ y r^   )r  ry   r„   ©rT   r  s     r;   rw   z$MultiplexedDatabase._start_listening%  s'   € Ø—-‘-ò 	4ˆBØ�O‰O˜D×2Ñ2Õ3ñ	4rJ   c                 ó\   — | j                   D ]  }|j                  | j                  «       Œ y r^   )r  r}   r„   r*  s     r;   r|   z#MultiplexedDatabase._stop_listening)  s)   € Ø—-‘-ò 	7ˆBØ×Ñ˜t×5Ñ5Õ6ñ	7rJ   r‰   )rV   rW   rX   rŠ   r!   rb   r¬   r•   r­   ru   rš   r�   r   rl   r*   r+   rr   rw   r|   rY   rZ   s   @r;   r$   r$   ê  s²   ø„ ñð2˜_ð °õ ð
U˜#ó Uð
˜Fð 
 tó 
ð
$˜ð $ 8¨E¡?ó $ð ˜ð   eð  °ó  ð"˜%ð "¨ð "°$ó "ð&˜ð & Uð &°5ð &¸Tó &ó4÷7rJ   r$   c                   ó"  ‡ — e Zd ZdZd ed¬«      dfdededed	ed
edz  f
ˆ fd„Zdefd„Zde	de
fd„Zdd„Zdd„Zdededz  fd„Zdedz  fd„Zeededefd„«       «       Zdedee   fd„Zdededdfd„Zdedededdfd„Zdededdfd„Zˆ xZS )r"   a˜  
    A file-based database loaded from a `GitHub Actions <https://docs.github.com/en/actions>`_ artifact.

    You can use this for sharing example databases between CI runs and developers, allowing
    the latter to get read-only access to the former. This is particularly useful for
    continuous fuzzing (i.e. with `HypoFuzz <https://hypofuzz.com/>`_),
    where the CI system can help find new failing test cases through fuzzing,
    and developers can reproduce them locally without any manual effort.

    .. note::
        You must provide ``GITHUB_TOKEN`` as an environment variable. In CI, Github Actions provides
        this automatically, but it needs to be set manually for local usage. In a developer machine,
        this would usually be a `Personal Access Token <https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens>`_.
        If the repository is private, it's necessary for the token to have ``repo`` scope
        in the case of a classic token, or ``actions:read`` in the case of a fine-grained token.


    In most cases, this will be used
    through the :class:`~hypothesis.database.MultiplexedDatabase`,
    by combining a local directory-based database with this one. For example:

    .. code-block:: python

        local = DirectoryBasedExampleDatabase(".hypothesis/examples")
        shared = ReadOnlyDatabase(GitHubArtifactDatabase("user", "repo"))

        settings.register_profile("ci", database=local)
        settings.register_profile("dev", database=MultiplexedDatabase(local, shared))
        # We don't want to use the shared database in CI, only to populate its local one.
        # which the workflow should then upload as an artifact.
        settings.load_profile("ci" if os.environ.get("CI") else "dev")

    .. note::
        Because this database is read-only, you always need to wrap it with the
        :class:`ReadOnlyDatabase`.

    A setup like this can be paired with a GitHub Actions workflow including
    something like the following:

    .. code-block:: yaml

        - name: Download example database
          uses: dawidd6/action-download-artifact@v9
          with:
            name: hypothesis-example-db
            path: .hypothesis/examples
            if_no_artifact_found: warn
            workflow_conclusion: completed

        - name: Run tests
          run: pytest

        - name: Upload example database
          uses: actions/upload-artifact@v3
          if: always()
          with:
            name: hypothesis-example-db
            path: .hypothesis/examples

    In this workflow, we use `dawidd6/action-download-artifact <https://github.com/dawidd6/action-download-artifact>`_
    to download the latest artifact given that the official `actions/download-artifact <https://github.com/actions/download-artifact>`_
    does not support downloading artifacts from previous workflow runs.

    The database automatically implements a simple file-based cache with a default expiration period
    of 1 day. You can adjust this through the ``cache_timeout`` property.

    For mono-repo support, you can provide a unique ``artifact_name`` (e.g. ``hypofuzz-example-db-frontend``).
    zhypothesis-example-dbé   )ÚdaysNÚownerÚrepoÚartifact_nameÚcache_timeoutr.   c                 óf  •— t         ‰| �  «        || _        || _        || _        || _        t        d«      | _        d | _        |€:t        d| j                  › d�«      | _        | j                  j                  | _
        nt        |«      | _
        d| _        d| _        d | _        d | _        d| _        y )NÚGITHUB_TOKENzgithub-artifacts/ú/Fz{This database is read-only. Please wrap this class with ReadOnlyDatabasei.e. ReadOnlyDatabase(GitHubArtifactDatabase(...)).)rR   rb   r/  r0  r1  r2  r   Útokenr  r   r.   r   Ú_initializedÚ	_disabledÚ	_artifactÚ_access_cacheÚ_read_only_message)rT   r/  r0  r1  r2  r.   rU   s         €r;   rb   zGitHubArtifactDatabase.__init__t  s¹   ø€ ô 	‰ÑÔØˆŒ
ØˆŒ	Ø*ˆÔØ*ˆÔô "(¨Ó!7ˆŒ
à59ˆÔØˆ<Ü 1Ø# D×$6Ñ$6Ð#7°qÐ9ó!ˆDÔð ×)Ñ)×.Ñ.ˆD�Iä˜T›
ˆDŒIð #(ˆÔØ$ˆŒð '+ˆŒàCGˆÔðBð 	ÕrJ   r/   c                 óV   — d| j                   ›d| j                  ›d| j                  ›d�S )NzGitHubArtifactDatabase(owner=z, repo=z, artifact_name=r”   )r/  r0  r1  ra   s    r;   r•   zGitHubArtifactDatabase.__repr__   s6   € à+¨D¯J©J¨>ð :Ø—I‘I�=Ð 0°×1CÑ1CÐ0FÀaðIð	
rJ   r–   c                 óú   — t        |t        «      xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S r^   )r˜   r"   r/  r0  r1  r.   r™   s     r;   rš   zGitHubArtifactDatabase.__eq__¦  sn   € ä�uÔ4Ó5ò (Ø—
‘
˜eŸk™kÑ)ò(à—	‘	˜UŸZ™ZÑ'ò(ð ×"Ñ" e×&9Ñ&9Ñ9ò(ð —	‘	˜UŸZ™ZÑ'ð	
rJ   c                 ó  — | j                   €J d«       ‚| j                  ry 	 t        | j                   «      5 }|j                  «       rt        ‚	 d d d «       i | _        t        | j                   «      5 }|j                  «       }|D ]¢  }|j                  |«      }|j                  «       r.| j
                  j                  t        |«      t        «       «       ŒRt        |«      j                  }| j
                  j                  |t        «       «      j                  t        |«      «       Œ¤ 	 d d d «       d| _        y # 1 sw Y   ŒîxY w# 1 sw Y   ŒxY w# t        $ r- t        j                  dt         d¬«       d| _        Y d| _        y w xY w)NzArtifact not loaded.z™The downloaded artifact from GitHub is invalid. This could be because the artifact was corrupted, or because the artifact was not created by Hypothesis. rB   rC   T)r9  r7  r   Útestzipr   r:  ÚnamelistÚgetinfor3   r    r   r¡   r2   r¢   rE   rF   r   r8  )rT   rs   Úzfr@  ÚfilenameÚfileinfoÚkeypaths          r;   Ú_prepare_for_ioz&GitHubArtifactDatabase._prepare_for_io¯  s_  € Ø�~‰~Ð)ÐAÐ+AÓAÐ)à×ÒØð!	"Ü˜Ÿ™Ó(ð %¨AØ—9‘9”;Ü$Ð$ð ÷%ð "$ˆDÔÜ˜Ÿ™Ó(ð ¨BØŸ;™;›=�à (ò 
�HØ!Ÿz™z¨(Ó3�HØ—‘Ô(Ø×*Ñ*×5Ñ5´h¸xÓ6HÌ#Ë%ÕPô #+¨8Ó"4×";Ñ";˜à×*Ñ*×5Ñ5°g¼s»uÓE×IÑIÜ$ XÓ.õñ
÷ð0 !ˆÕ÷E%ð %ú÷ð ûô ò 	"Ü�M‰MðJô "Øõð "ˆD�Nà ˆÕð	"úsA   ¢E ·D<Á$E Á3B8EÄ,E Ä<EÅE ÅEÅE Å,F
Æ	F
c                 ób  — t        | j                  j                  «       | j                  �| j                  j	                  «        n| j                  j                  dd¬«       t        | j                  j                  d«      d„ ¬«      }|d d D ]  }|j                  «        Œ 	 |d   }|�ht        j                  t        j                  «      t        j                  |j                  j!                  dd«      «      z
  | j"                  k  r|| _        ny| j'                  «       }|r|�|j                  «        || _        nM|�'t)        j*                  d	|› �t,        d
¬«       || _        n$t)        j*                  dt,        d
¬«       d| _        y | j1                  «        y # t        $ r d }Y �Œw xY w)NTr¼   z*.zipc                 ó`   — t        j                  | j                  j                  dd«      «      S )NÚ_ú:)r   ÚfromisoformatÚstemÚreplace©Úas    r;   ú<lambda>z7GitHubArtifactDatabase._initialize_db.<locals>.<lambda>ç  s    € œ(×0Ñ0°·±·±ÀÀSÓ1IÓJ€ rJ   r±   éÿÿÿÿrI  rJ  z:Using an expired artifact as a fallback for the database: é   rC   z@Couldn't acquire a new or existing artifact. Disabling database.)r   r.   rÎ   r  r
  r¿   ÚsortedÚglobr×   Ú
IndexErrorr   Únowr   ÚutcrK  rL  rM  r2  r9  Ú_fetch_artifactrE   rF   r   r8  rF  )rT   Úcached_artifactsÚartifactÚfound_artifactÚnew_artifacts        r;   Ú_initialize_dbz%GitHubArtifactDatabase._initialize_dbÛ  sŠ  € ä˜$Ÿ)™)Ÿ.™.Ô)à×ÑÐ(Ø×Ñ×/Ñ/Õ1à�I‰I�O‰O T°4ˆOÔ8ô "Ø�I‰I�N‰N˜7Ó#ÙJô
Ðð )¨¨"Ð-ò 	ˆHØ�O‰OÕð	ð	"Ø-¨bÑ1ˆNð
 Ð%Ü�L‰LœŸ™Ó&Ü×$Ñ$ ^×%8Ñ%8×%@Ñ%@ÀÀcÓ%JÓKñLà× Ñ ò!ð ,ˆD�Nð  ×/Ñ/Ó1ˆLáØ!Ð-Ø"×)Ñ)Ô+Ø!-�•ØÐ+Ü—‘ØPØ%Ð&ð(ä%Ø õ	ð "0�•ä—‘ØVÜ%Ø õð
 "&�”Øà×ÑÕøôG ò 	"Ø!‹Nð	"ús   Â&F ÆF.Æ-F.Úurlc                 ó´  — ddl m}m} ddlm}m}  ||dddœ¬«      }|j                  dd	| j                  › �«       d }d }	  ||«      5 }	|	j                  «       }d d d «       |�t        j                  |t        d¬«       y |S # 1 sw Y   Œ*xY w# |$ r.}
|
j                  d
k(  rd}nd}|
j                  «        Y d }
~
Œ[d }
~
w|$ r d}Y Œgt        $ r d}Y Œsw xY w)Nr   )Ú	HTTPErrorÚURLError)ÚRequestÚurlopenzapplication/vnd.github+jsonz2022-11-28 )ÚAcceptzX-GitHub-Api-Version)ÚheadersÚAuthorizationzBearer i‘  z„Authorization failed when trying to download artifact from GitHub. Check that you have a valid GITHUB_TOKEN set in your environment.zpCould not get the latest artifact from GitHub. This could be because the repository or artifact does not exist. z8Could not connect to GitHub to get the latest artifact. zNCould not connect to GitHub to get the latest artifact (connection timed out).r†   rC   )Úurllib.errorr`  ra  Úurllib.requestrb  rc  Úadd_unredirected_headerr6  ÚreadÚcoderÒ   ÚTimeoutErrorrE   rF   r   )rT   r^  r`  ra  rb  rc  ÚrequestÚwarning_messageÚresponse_bytesÚresponseÚes              r;   Ú
_get_bytesz!GitHubArtifactDatabase._get_bytes  sö   € ÷ 	5ß3áØà7Ø(5ñô
ˆð 	×'Ñ'¨¸7À4Ç:Á:À,Ð9OÔPØˆØ'+ˆð	Ù˜Ó!ð 1 XØ!)§¡£�÷1ð0 Ð&Ü�M‰M˜/Ô+<ÈÕKØàÐ÷91ð 1ûàò 	Ø�v‰v˜Š}ðXñ  ð3ð  ð �G‰G�I‰IûØò 	YØXŠOÜò 	ð*ò ð	ús<   ÁB Á
BÁB ÂBÂ	B ÂCÂ$B>Â>
CÃ

CÃCc                 óZ  — d| j                   › d| j                  › d�}| j                  |«      }|€y t        j                  |«      d   }|D �cg c]  }|d   | j
                  k(  sŒ|‘Œ }}|sy t        |d„ ¬«      }|d   }| j                  |«      }|€y t        j                  t        j                  «      j                  «       j                  d	d
«      }| j                  |› d�z  }	 |j                  |«       |S c c}w # t        $ r t!        j"                  dt$        d¬«       Y y w xY w)Nzhttps://api.github.com/repos/r5  z/actions/artifactsÚ	artifactsrÎ   c                 ó   — | d   S )NÚ
created_atrŽ   rN  s    r;   rP  z8GitHubArtifactDatabase._fetch_artifact.<locals>.<lambda>T  s
   € °°,±€ rJ   r±   Úarchive_download_urlrJ  rI  z.zipz0Could not save the latest artifact from GitHub. rB   rC   )r/  r0  rr  ÚjsonÚloadsr1  Úmaxr   rV  r   rW  Ú	isoformatrM  r.   rÖ   rË   rE   rF   r   )	rT   r^  ro  rt  rO  rZ  Úartifact_bytesÚ	timestampÚartifact_paths	            r;   rX  z&GitHubArtifactDatabase._fetch_artifactF  s1  € à-¨d¯j©j¨\¸¸4¿9¹9¸+ÐEWÐXˆØŸ™¨Ó-ˆØÐ!Øä—J‘J˜~Ó.¨{Ñ;ˆ	Ø )ÖM˜1¨Q¨v©Y¸$×:LÑ:LÓ-L’QÐMˆ	ÐMáØô �yÑ&?Ô@ˆØÐ-Ñ.ˆð Ÿ™¨Ó-ˆØÐ!Øô
 —L‘L¤§¡Ó.×8Ñ8Ó:×BÑBÀ3ÈÓLˆ	ØŸ	™	 y k°Ð$6Ñ6ˆð	Ø×%Ñ% nÔ5ð Ðùò; Nøô* ò 	Ü�M‰MØBÜ!Øõñ
 ð	ús   ÁC=Á&C=Ã*D Ä%D*Ä)D*rc   c                 ó0   — t        t        | «      dz   «      S )Nr5  )r   r²   r±   s    r;   rÅ   z GitHubArtifactDatabase._key_pathm  s   € ô œ˜c›
 SÑ(Ó)Ð)rJ   c              #   óú  K  — | j                   ry | j                  s| j                  «        | j                   ry | j                  €J ‚| j                  €J ‚| j                  |«      }t        | j                  «      5 }| j                  j                  |d«      }|D ]<  }|j                  |j                  «       «      5 }|j                  «       –— d d d «       Œ> 	 d d d «       y # 1 sw Y   ŒRxY w# 1 sw Y   y xY w­wrœ   )r8  r7  r]  r9  r:  rÅ   r   r�   ÚopenÚas_posixrj  )rT   rc   rÌ   rB  Ú	filenamesrC  rs   s          r;   rl   zGitHubArtifactDatabase.fetchr  sé   è ø€ Ø�>Š>Øà× Ò Ø×ÑÔ!Ø�~Š~Øà�~‰~Ð)Ð)Ð)Ø×!Ñ!Ð-Ð-Ð-à�^‰^˜CÓ ˆä�T—^‘^Ó$ð 	#¨à×*Ñ*×.Ñ.¨r°2Ó6ˆIØ%ò #�Ø—W‘W˜X×.Ñ.Ó0Ó1ð #°QØŸ&™&›(’N÷#ð #ñ#÷	#ð 	#÷#ð #ú÷		#ð 	#üs7   ‚A9C;Á;AC/Â<C#Ã
C/Ã	C;Ã#C,Ã(C/Ã/C8Ã4C;rd   c                 ó,   — t        | j                  «      ‚r^   ©ÚRuntimeErrorr;  ri   s      r;   r*   zGitHubArtifactDatabase.saveˆ  ó   € Ü˜4×2Ñ2Ó3Ð3rJ   rn   ro   c                 ó,   — t        | j                  «      ‚r^   r…  rq   s       r;   rr   zGitHubArtifactDatabase.move‹  r‡  rJ   c                 ó,   — t        | j                  «      ‚r^   r…  ri   s      r;   r+   zGitHubArtifactDatabase.deleteŽ  r‡  rJ   r‰   )rV   rW   rX   rŠ   r   r¬   r'   rb   r•   r­   ru   rš   rF  r]  r�   rr  r   rX  Ústaticmethodr   r   rÅ   r   rl   r*   rr   r+   rY   rZ   s   @r;   r"   r"   .  s>  ø„ ñCðR 5Ù#,°!Ô#4Ø $ñ*
àð*
ð ð*
ð ð	*
ð
 !ð*
ð ˜‰oõ*
ðX
˜#ó 
ð
˜Fð 
 tó 
ó*!óX8ðt/˜cð / e¨d¡ló /ðb% ¨¡ó %ðN Øð*�uð * ò *ó ó ð*ð#˜ð # 8¨E¡?ó #ð,4˜ð 4 eð 4°ó 4ð4˜ð 4 Uð 4°5ð 4¸Tó 4ð4˜%ð 4¨ð 4°$÷ 4rJ   r"   c                   óÔ   ‡ — e Zd ZdZdeddfˆ fd„Zd„ Zdefd„Zde	de
fd	„Zdd
„Zddedz  ddfd„Zdedee   fd„Zdededdfd„Zdededdfd„Zdedededdfd„Zdd„Zdd„Zˆ xZS )ÚBackgroundWriteDatabasezßA wrapper which defers writes on the given database to a background thread.

    Calls to :meth:`~hypothesis.database.ExampleDatabase.fetch` wait for any
    enqueued writes to finish before fetching from the database.
    r  r/   Nc                 ó\   •— t         ‰| �  «        || _        t        «       | _        d | _        y r^   )rR   rb   Ú_dbr   Ú_queueÚ_threadr  s     €r;   rb   z BackgroundWriteDatabase.__init__™  s%   ø€ Ü‰ÑÔØˆŒÜ<A»GˆŒØ&*ˆ�rJ   c                 óÌ   — | j                   €Xt        | j                  d¬«      | _         | j                   j                  «        t	        j
                  | | j                  d«       y y )NT)ÚtargetÚdaemongš™™™™™¹?)r�  r   Ú_workerr  ÚweakrefÚfinalizeÚ_joinra   s    r;   Ú_ensure_threadz&BackgroundWriteDatabase._ensure_threadŸ  sK   € Ø�<‰<ÐÜ!¨¯©¸dÔCˆDŒLØ�L‰L×ÑÔ ô ×Ñ˜T 4§:¡:¨sÕ3ð  rJ   c                 ó"   — d| j                   ›d�S )NzBackgroundWriteDatabase(r”   )rŽ  ra   s    r;   r•   z BackgroundWriteDatabase.__repr__§  s   € Ø)¨$¯(©(¨°QÐ7Ð7rJ   r–   c                 óX   — t        |t        «      xr | j                  |j                  k(  S r^   )r˜   rŒ  rŽ  r™   s     r;   rš   zBackgroundWriteDatabase.__eq__ª  s"   € Ü˜%Ô!8Ó9ÒS¸d¿h¹hÈ%Ï)É)Ñ>SÐSrJ   c                 ó¦   — 	 | j                   j                  «       \  }} t        | j                  |«      |Ž  | j                   j	                  «        ŒQr^   )r�  r�   ÚgetattrrŽ  Ú	task_done)rT   ÚmethodrM   s      r;   r”  zBackgroundWriteDatabase._worker­  sC   € ØØŸ;™;Ÿ?™?Ó,‰LˆF�DØ%ŒG�D—H‘H˜fÓ% tÑ,Ø�K‰K×!Ñ!Ô#ð rJ   Útimeoutc                 óþ   — | j                   j                  5  | j                   j                  r<| j                   j                  j                  |«       | j                   j                  rŒ<d d d «       y # 1 sw Y   y xY wr^   )r�  Úall_tasks_doneÚunfinished_tasksÚwait)rT   rŸ  s     r;   r—  zBackgroundWriteDatabase._join³  sX   € à�[‰[×'Ñ'ñ 	9Ø—+‘+×.Ò.Ø—‘×*Ñ*×/Ñ/°Ô8ð —+‘+×.Ó.÷	9÷ 	9ñ 	9ús   —AA3Á3A<rc   c                 óX   — | j                  «        | j                  j                  |«      S r^   )r—  rŽ  rl   rk   s     r;   rl   zBackgroundWriteDatabase.fetch¹  s   € Ø�
‰
ŒØ�x‰x�~‰~˜cÓ"Ð"rJ   rd   c                 ób   — | j                  «        | j                  j                  d||ff«       y rŸ   ©r˜  r�  Úputri   s      r;   r*   zBackgroundWriteDatabase.save½  s'   € Ø×ÑÔØ�‰�‰˜ # u Ð.Õ/rJ   c                 ób   — | j                  «        | j                  j                  d||ff«       y r§   r¦  ri   s      r;   r+   zBackgroundWriteDatabase.deleteÁ  s'   € Ø×ÑÔØ�‰�‰˜ C¨ <Ð0Õ1rJ   rn   ro   c                 ód   — | j                  «        | j                  j                  d|||ff«       y )Nrr   r¦  rq   s       r;   rr   zBackgroundWriteDatabase.moveÅ  s*   € Ø×ÑÔØ�‰�‰˜ # t¨UÐ!3Ð4Õ5rJ   c                 óN   — | j                   j                  | j                  «       y r^   )rŽ  ry   r„   ra   s    r;   rw   z(BackgroundWriteDatabase._start_listeningÉ  s   € Ø�‰×Ñ˜d×4Ñ4Õ5rJ   c                 óN   — | j                   j                  | j                  «       y r^   )rŽ  r}   r„   ra   s    r;   r|   z'BackgroundWriteDatabase._stop_listeningÌ  s   € Ø�‰× Ñ  ×!7Ñ!7Õ8rJ   r‰   r^   )rV   rW   rX   rŠ   r!   rb   r˜  r¬   r•   r­   ru   rš   r”  Úfloatr—  r�   r   rl   r*   r+   rr   rw   r|   rY   rZ   s   @r;   rŒ  rŒ  ’  sÔ   ø„ ñð+˜?ð +¨tõ +ò4ð8˜#ó 8ðT˜Fð T tó Tó$ñ9˜U T™\ð 9°Tó 9ð#˜ð # 8¨E¡?ó #ð0˜ð 0 eð 0°ó 0ð2˜%ð 2¨ð 2°$ó 2ð6˜ð 6 Uð 6°5ð 6¸Tó 6ó6÷9rJ   rŒ  rd   c                 óˆ   — t        «       }| dk\  sJ ‚	 | dz  }| dz  } | r|dz  }|j                  |«       | s	 t        |«      S Œ1)zü
    Serialize an integer into variable-length bytes. For each byte, the first 7
    bits represent (part of) the integer, while the last bit indicates whether the
    integer continues into the next byte.

    https://en.wikipedia.org/wiki/LEB128
    r   é   é   é€   )Ú	bytearrayrv   r�   )rd   ÚpartsÚbytes      r;   Ú_pack_uleb128r´  Ð  sZ   € ô ‹K€EØ�AŠ:Ðˆ:Ø
à˜Ñ%ˆØ�!‰ˆáØ�F‰NˆDà�‰�TÔÙØÜ�‹<Ðð rJ   Úbufferc                 óh   — d}t        | «      D ]  \  }}|dz  }|||dz  z  z  }|dz	  rŒ n dz   |fS )ze
    Inverts _pack_uleb128, and also returns the index at which at which we stopped
    reading.
    r   r®  r¯  r-  )Ú	enumerate)rµ  rd   Úir³  Úns        r;   Ú_unpack_uleb128rº  è  sW   € ð
 €EÜ˜VÓ$ò ‰ˆˆ4Ø�LÑ!ˆØ��q˜1‘u‘Ñˆà�q‹yÙðð �‰E�5ˆ>ÐrJ   Úchoicesc                óÈ  — g }| D �]J  }t        |t        «      r|j                  |rdnd«       Œ*t        |t        «      rd}t	        j
                  d|«      }ntt        |t        «      r+d}|j                  d|j                  «       dz  z   dd	¬
«      }n9t        |t        «      rd}n&t        |t        «      sJ ‚d}|j                  d¬«      }t        |«      }|dk  r%|j                  ||z  j                  dd«      «       n>|j                  |dz  j                  dd«      «       |j                  t        |«      «       |j                  |«       �ŒM dj                  |«      S )zISerialize a list of choices to a bytestring.  Inverts choices_from_bytes.ó   ó    é    ú!dé@   r-  é   ÚbigT©Úsignedé`   r°  Úsurrogatepass©Úerrorsé   rJ   )r˜   ru   rv   r¬  ÚstructÚpackÚintÚto_bytesÚ
bit_lengthr�   r¬   ÚencodeÚlenr´  r  )r»  r²  ÚchoiceÚtagÚsizes        r;   Úchoices_to_bytesrÕ  ÷  s8  € ð €EØó ˆÜ�fœdÔ#à�L‰L¡&™¨eÔ4Øô �fœeÔ$ØˆCÜ—[‘[  vÓ.‰FÜ˜¤Ô$ØˆCØ—_‘_ Q¨×):Ñ):Ó)<ÀÑ)AÑ%AÀ5ÐQU�_ÓV‰FÜ˜¤Ô&Ø‰Cä˜f¤cÔ*Ð*Ð*ØˆCØ—]‘]¨/�]Ó:ˆFä�6‹{ˆØ�'Š>Ø�L‰L˜# ™*×.Ñ.¨q°%Ó8Õ9à�L‰L˜# ™-×1Ñ1°!°UÓ;Ô<Ø�L‰Lœ tÓ,Ô-Ø�‰�VÖð5ð8 �8‰8�E‹?ÐrJ   .c                ó^  — g }d}|t        | «      k  �r| |   dz	  }| |   dz  }|dz  }|dk(  r|j                  t        |«      «       ŒD|dk(  rt        | |d  «      \  }}||z  }| |||z    }||z  }|dk(  r2|dk(  sJ d«       ‚|j	                  t        j                  d|«      «       nl|dk(  r(|j                  t        j                  |d	d
¬«      «       n?|dk(  r|j                  |«       n(|dk(  sJ ‚|j                  |j                  d¬«      «       |t        | «      k  r�Œt        |«      S )Nr   é   rÊ  r-  rÂ  zexpected float64rÀ  rR  rÃ  TrÄ  rB   r†   rÇ  rÈ  )rÑ  rv   ru   rº  ÚextendrË  ÚunpackrÍ  Ú
from_bytesÚdecodeÚtuple)rµ  r²  ÚidxrÓ  rÔ  ÚoffsetÚchunks          r;   Ú_choices_from_bytesrà    s5  € à€EØ
€CØ
”�F“Ó
Ø�S‰k˜QÑˆØ�c‰{˜WÑ$ˆØˆq‰ˆà�!Š8Ø�L‰Lœ˜d›Ô$ØØ�7Š?Ü*¨6°#°$¨<Ó8‰LˆF�DØ�6‰MˆCØ�s˜S 4™ZÐ(ˆØˆt‰ˆà�!Š8Ø˜1’9Ð0Ð0Ó0�9Ø�L‰LœŸ™ t¨UÓ3Õ4Ø�AŠXØ�L‰LœŸ™¨¨u¸T˜ÓBÕCØ�AŠXØ�L‰L˜Õà˜!’8ˆO�8Ø�L‰L˜Ÿ™¨_˜Ó=Ô>ð/ ”�F“Ô
ô0 �‹<ÐrJ   c                ó8   — 	 t        | «      S # t        $ r Y yw xY w)z³
    Deserialize a bytestring to a tuple of choices. Inverts choices_to_bytes.

    Returns None if the given bytestring is not a valid serialization of choice
    sequences.
    N)rà  Ú	Exception)rµ  s    r;   Úchoices_from_bytesrã  >  s&   € ðÜ" 6Ó*Ð*øÜò ñ ðús   ‚
 �	˜r^   )cr‹   rÔ   rx  r4   rË  ÚsysrÏ   rE   r•  Úcollections.abcr   r   r   r   r   Ú	functoolsr   Úhashlibr	   r
   r   Úpathlibr   r   Úqueuer   Ú	threadingr   Útypingr   r   r   r   r   r   Úzipfiler   r   Úhypothesis.configurationr   r   Úhypothesis.errorsr   r   Ú%hypothesis.internal.conjecture.choicer   Úhypothesis.utils.conventionsr   r   Úhypothesis.utils.deprecationr   Ú__all__Úwatchdog.observers.apir&   r¬   r'   r  rÜ  r�   r(   r)   r,   r-   ru   r<   rI   ÚABCMetarL   ÚmodulesÚsphinx.ext.autodocr[   Ú	signatureÚ'sphinx.ext.autodoc._dynamic._signaturesÚextÚautodocÚ_dynamicÚ_signaturesÚ_modulerÿ   r˜   Ú_METACLASS_CALL_BLACKLISTÚ	frozensetrv   râ  r!   r#   r²   r    rG   r%   r$   r"   rŒ  rÍ  r´  rº  rÕ  rà  rã  rŽ   rJ   r;   ú<module>r      sî  ðô Û Û Û 	Û Û 
Û Û Û ß .ß 2Ñ 2Ý Ý ß ß "Ý Ý ÷÷ ÷ (ç Hß DÝ 9ß BÝ 9ò€ñ Ý3à˜H S™MÑ)€ˆ)Ó )Ø˜U E˜\Ñ*€	ˆ9Ó *Ø˜u e¨d¡lÐ2Ñ3€ˆYÓ 3à	ˆ'�&‰/˜9Ð
$Ñ%¨¨g°hÑ.?ÀÐ.LÑ(MÑMð �	ó ð   Ð 0°#Ð 5Ñ6€	ˆ9Ó 6ð�hð  4ó ð& FJñ/Ø
Ð%Ñ
%¨°
Ñ(;Ñ
;¸dÑ
Bð/àó/ô81ˆc�k‰kô 1ðH ˆs�{‰{Ñ¡=ðÛ!à:ˆ	ð	)ßEÖEñ
 �g×7Ñ7¸ÔCØ07×0QÑ0QØðUñ 1ˆGÕ-ð ×-Ñ-×4Ñ4°YÔ?ô
A
 õ A
ôH/˜oô /ðd(ˆuð (˜ó (ôF Oô FôR4Ð =ô 4ô,$�ô $ôNA7˜/ô A7ôHa4˜_ô a4ôH;9˜oô ;9ð|˜ð  ó ð0˜Eð  e¨C°¨H¡oó ð%˜h wÑ/ð %°uó %ðP ð ¨U°7¸C°<Ñ-@ó ð>˜uð ¨E°'¸3°,Ñ,?À$Ñ,Fô øðE% ò 	)Ø—j‘j×(Ñ(‹Gð	)ûð ò Ùðús7   Ä;I ÅH4 ÅAI È4IÉI ÉIÉI ÉIÉI