§
    dŠtjÆ)  ã                   óÈ   — d 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ej        Z	 G d„ de
¦  «        Z G d„ de
¦  «        Z G d„ de	¦  «        Z G d	„ d
e¦  «        Zdd„ZdS )zb
Fast cryptographic hash of Python objects, with a special case for fast
hashing of numpy arrays.
é    Nc                   ó   — e Zd ZdZd„ ZdS )Ú_ConsistentSetz\Class used to ensure the hash of Sets is preserved
    whatever the order of its items.
    c                 ó¦   — 	 t          |¦  «        | _        d S # t          t          j        f$ r" t          d„ |D ¦   «         ¦  «        | _        Y d S w xY w)Nc              3   ó4   K  — | ]}t          |¦  «        V — Œd S ©N©Úhash)Ú.0Úes     úL/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/joblib/hashing.pyú	<genexpr>z*_ConsistentSet.__init__.<locals>.<genexpr>%   s(   è è € Ð$CÐ$C°¥T¨!¡W¤WÐ$CÐ$CÐ$CÐ$CÐ$CÐ$Có    )ÚsortedÚ	_sequenceÚ	TypeErrorÚdecimalÚInvalidOperation)ÚselfÚset_sequences     r   Ú__init__z_ConsistentSet.__init__   sj   € ð		Eõ
 $ LÑ1Ô1ˆDŒNˆNˆNøÝ�7Ô3Ð4ð 	Eð 	Eð 	Eõ $Ð$CÐ$C°lÐ$CÑ$CÔ$CÑDÔDˆDŒNˆNˆNˆNð	Eøøøs   ‚ ˜4AÁAN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   © r   r   r   r      s2   € € € € € ðð ðEð Eð Eð Eð Er   r   c                   ó   — e Zd ZdZd„ ZdS )Ú_MyHashz5Class used to hash objects that won't normally picklec                 ó   — || _         d S r   )Úargs)r   r    s     r   r   z_MyHash.__init__+   s   € ØˆŒ	ˆ	ˆ	r   Nr   r   r   r   r   r   (   s)   € € € € € Ø?Ð?ðð ð ð ð r   r   c                   ó(  — e Zd ZdZdd„Zdd„Zd„ Zd„ Zdej	        fd	„Z
ej                             ¦   «         Ze
e ee¦  «        <   e
e ee¦  «        <   e
e ee¦  «        <   e
e eej        ¦  «        <   d
„ Zd„ Zee e e¦   «         ¦  «        <   dS )ÚHasherzÉA subclass of pickler, to do cryptographic hashing, rather than
    pickling. This is used to produce a unique hash of the given
    Python object that is not necessarily cryptographically secure.
    Úmd5c                 ó´   — t          j        ¦   «         | _        d}t                               | | j        |¬¦  «         t          j        |d¬¦  «        | _        d S )Né   )ÚprotocolF)Úusedforsecurity)ÚioÚBytesIOÚstreamÚPicklerr   ÚhashlibÚnewÚ_hash)r   Ú	hash_namer&   s      r   r   zHasher.__init__5   sM   € Ý”j‘l”lˆŒð ˆÝ×Ò˜˜tœ{°XÐÑ>Ô>Ð>å”[ ¸EÐBÑBÔBˆŒ
ˆ
ˆ
r   Tc                 ó.  — 	 |                       |¦  «         n/# t          j        $ r}|xj        d|›d|›�fz  c_        ‚ d }~ww xY w| j                             ¦   «         }| j                             |¦  «         |r| j                             ¦   «         S d S )NzPicklingError while hashing z: )	ÚdumpÚpickleÚPicklingErrorr    r*   Úgetvaluer.   ÚupdateÚ	hexdigest)r   ÚobjÚreturn_digestr   Údumpss        r   r	   zHasher.hash>   s®   € ð	Ø�IŠI�c‰NŒNˆNˆNøÝÔ#ð 	ð 	ð 	ØˆFŒFˆF¸s¸s¸sÀAÀAÐFÐHÑHˆFŒFØøøøøð	øøøð ”×$Ò$Ñ&Ô&ˆØŒ
×Ò˜%Ñ Ô Ð Øð 	*Ø”:×'Ò'Ñ)Ô)Ð)ð	*ð 	*s   ‚ ˜A§?¿Ac                 óÀ  — t          |t          j        t          i j        ¦  «        f¦  «        r”t          |d¦  «        r|j        j        }n|j        }|j        }t          |¦  «        t          t          ¦  «        u rt          ||j        ¦  «        }n0|€t          ||¦  «        }n|j        j        }t          |||¦  «        }t                               | |¦  «         d S )NÚ__func__)Ú
isinstanceÚtypesÚ
MethodTypeÚtypeÚpopÚhasattrr;   r   Ú__self__r2   r   Ú	__class__r+   Úsave)r   r7   Ú	func_nameÚinstÚclss        r   rD   zHasher.saveI   sÇ   € Ý�c�EÔ,­d°2´6©l¬lÐ;Ñ<Ô<ð 	4õ �s˜JÑ'Ô'ð )ØœLÔ1�	�	àœL�	Ø”<ˆDÝ�D‰zŒz�T¥&™\œ\Ð)Ð)Ý˜i¨¬Ñ7Ô7��Ø�å˜i¨Ñ.Ô.��à”lÔ,�Ý˜i¨¨sÑ3Ô3�Ý�Š�T˜3ÑÔÐÐÐr   c                 óx   — t          |t          t          f¦  «        rd S t                               | |¦  «         d S r   )r<   ÚbytesÚstrr+   Úmemoize)r   r7   s     r   rK   zHasher.memoize\   s9   € õ
 �c�E¥3˜<Ñ(Ô(ð 	ØˆFÝ�Š˜˜cÑ"Ô"Ð"Ð"Ð"r   Nc                 ó^  — t          ||¬¦  «        }|d= 	 t          j        | |fi |¤Ž d S # t          j        $ rr t          j        | |fi |¤Ž t          |dd ¦  «        }|dk    rA|}|€|j        }t          j        |         }t          ||¦  «        st          |||¦  «         Y d S Y d S Y d S w xY w)N)ÚnameÚpackrN   r   Ú__main__)Údictr+   Úsave_globalr2   r3   Úgetattrr   ÚsysÚmodulesrA   Úsetattr)r   r7   rM   rN   ÚkwargsÚmoduleÚmy_nameÚmods           r   rQ   zHasher.save_globalg   sþ   € õ ˜4 dÐ+Ñ+Ô+ˆØ�6ˆNð	/ÝÔ  cÐ4Ð4¨VÐ4Ð4Ð4Ð4Ð4øÝÔ#ð 	/ð 	/ð 	/ÝÔ  cÐ4Ð4¨VÐ4Ð4Ð4Ý˜S ,°Ñ5Ô5ˆFØ˜Ò#Ð#Ø�Ø�?Ø!œl�GÝ”k &Ô)�Ý˜s GÑ,Ô,ð /õ ˜C ¨#Ñ.Ô.Ð.Ð.Ð.Ð.ð $Ð#Ð#ð
/ð /ð /ð	/øøøs   –+ «A7B,Â+B,c           
      óò   — 	 t          j        | t          t          |¦  «        ¦  «        g|¢R Ž  d S # t          $ r; t          j        | t          t          d„ |D ¦   «         ¦  «        ¦  «        g|¢R Ž  Y d S w xY w)Nc              3   ó>   K  — | ]\  }}t          |¦  «        |fV — Œd S r   r   )r
   ÚkÚvs      r   r   z)Hasher._batch_setitems.<locals>.<genexpr>”   s0   è è € Ð!AÐ!A±4°1°a¥4¨¡7¤7¨A ,Ð!AÐ!AÐ!AÐ!AÐ!AÐ!Ar   )r+   Ú_batch_setitemsÚiterr   r   )r   Úitemsr    s      r   r^   zHasher._batch_setitemsˆ   sª   € ð	õ
 Ô# D­$­v°e©}¬}Ñ*=Ô*=ÐEÀÐEÐEÐEÐEÐEÐEøÝð 	ð 	ð 	õ Ô#Ø•d�6Ð!AÐ!A¸5Ð!AÑ!AÔ!AÑAÔAÑBÔBðØEIðð ð ð ð ð ð ð	øøøs   ‚-1 ±AA6Á5A6c                 óV   — t                                | t          |¦  «        ¦  «         d S r   )r+   rD   r   )r   Ú	set_itemss     r   Úsave_setzHasher.save_set—   s$   € å�Š�T�>¨)Ñ4Ô4Ñ5Ô5Ð5Ð5Ð5r   )r#   )T)r   r   r   r   r   r	   rD   rK   ÚstructrN   rQ   r+   ÚdispatchÚcopyr?   ÚlenÚobjectr2   r1   r^   rc   Úsetr   r   r   r"   r"   /   s  € € € € € ðð ð
Cð Cð Cð Cð	*ð 	*ð 	*ð 	*ð ð  ð  ð&#ð #ð #ð %)¨v¬{ð /ð /ð /ð /ð* Ô×$Ò$Ñ&Ô&€Hà%€HˆTˆT�#‰YŒYÑà(€HˆTˆT�&‰\Œ\Ñà)€HˆTˆT�'‰]Œ]Ñà"-€HˆTˆT�&”+ÑÔÑðð ð ð6ð 6ð 6ð %€HˆTˆT�#�#‘%”%‰[Œ[ÑÐÐr   r"   c                   ó    — e Zd ZdZdd„Zd„ ZdS )ÚNumpyHasherz1Special case the hasher for when numpy is loaded.r#   Fc                 ó¶   — || _         t                               | |¬¦  «         ddl}|| _        t          |d¦  «        r|j        | _        dS t          | _        dS )zå
        Parameters
        ----------
        hash_name: string
            The hash algorithm to be used
        coerce_mmap: boolean
            Make no difference between np.memmap and np.ndarray
            objects.
        ©r/   r   NÚ	getbuffer)	Úcoerce_mmapr"   r   ÚnumpyÚnprA   rn   Ú
_getbufferÚ
memoryview)r   r/   ro   rq   s       r   r   zNumpyHasher.__init__¡   s_   € ð 'ˆÔÝ�Š˜¨	ˆÑ2Ô2Ð2àÐÐÐàˆŒÝ�2�{Ñ#Ô#ð 	)Ø œlˆDŒOˆOˆOå(ˆDŒOˆOˆOr   c                 óN  — t          || j        j        ¦  «        rú|j        j        sî|j        dk    r|                     ¦   «         }n7|j        j        r|}n(|j        j	        r|j
        }n|                     ¦   «         }| j                             |                      |                     | j        j        ¦  «        ¦  «        ¦  «         | j        r't          || j        j        ¦  «        r| j        j        }n|j        }|d|j        |j        |j        ff}nut          || j        j        ¦  «        r[| j                             d                     d¦  «        ¦  «         | j                             t+          j        |¦  «        ¦  «         dS t.                               | |¦  «         dS )zŸSubclass the save method, to hash ndarray subclass, rather
        than pickling them. Off course, this is a total abuse of
        the Pickler class.
        r   ÚHASHEDÚ_HASHED_DTYPEzutf-8N)r<   rq   ÚndarrayÚdtypeÚ	hasobjectÚshapeÚflattenÚflagsÚc_contiguousÚf_contiguousÚTr.   r5   rr   ÚviewÚuint8ro   ÚmemmaprC   ÚstridesÚencoder2   r9   r"   rD   )r   r7   Úobj_c_contiguousÚklasss       r   rD   zNumpyHasher.save¶   s‰  € õ
 �c˜4œ7œ?Ñ+Ô+ð 8	°C´IÔ4Gð 8	ð Œy˜BŠˆð $'§;¢;¡=¤=Ð Ð Ø”Ô'ð 1Ø#&Ð Ð Ø”Ô'ð 1Ø#&¤5Ð Ð ð
 $'§;¢;¡=¤=Ð ð ŒJ×Ò˜dŸošoÐ.>×.CÒ.CÀDÄGÄMÑ.RÔ.RÑSÔSÑTÔTÐTð
 Ôð &¥J¨s°D´G´NÑ$CÔ$Cð &ð œœ��àœ�ð
 ˜8 S¤Y°´	¸3¼;ÐGÐHˆCˆCÝ˜˜TœWœ]Ñ+Ô+ð 	ð  ŒJ×Ò˜o×4Ò4°WÑ=Ô=Ñ>Ô>Ð>ØŒJ×Ò�fœl¨3Ñ/Ô/Ñ0Ô0Ð0ØˆFÝ�Š�D˜#ÑÔÐÐÐr   N©r#   F)r   r   r   r   r   rD   r   r   r   rk   rk   ž   s=   € € € € € Ø;Ð;ð)ð )ð )ð )ð*>ð >ð >ð >ð >r   rk   r#   Fc                 óÞ   — d}||vr#t          d                     ||¦  «        ¦  «        ‚dt          j        v rt	          ||¬¦  «        }nt          |¬¦  «        }|                     | ¦  «        S )aI  Quick calculation of a hash to identify uniquely Python objects
    containing numpy arrays.

    Parameters
    ----------
    hash_name: 'md5' or 'sha1'
        Hashing algorithm used. sha1 is supposedly safer, but md5 is
        faster.
    coerce_mmap: boolean
        Make no difference between np.memmap and np.ndarray
    )r#   Úsha1zAValid options for 'hash_name' are {}. Got hash_name={!r} instead.rp   )r/   ro   rm   )Ú
ValueErrorÚformatrS   rT   rk   r"   r	   )r7   r/   ro   Úvalid_hash_namesÚhashers        r   r	   r	   ÷   s…   € ð 'ÐØÐ(Ð(Ð(ÝØO×VÒVØ  )ñô ñ
ô 
ð 	
ð
 •#”+ÐÐÝ y¸kÐJÑJÔJˆˆå )Ð,Ñ,Ô,ˆØ�;Š;�sÑÔÐr   r‡   )r   r   r,   r(   r2   rd   rS   r=   Ú_Picklerr+   rh   r   r   r"   rk   r	   r   r   r   ú<module>r�      s7  ððð ð €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø 
€
€
€
Ø €€€à
Œ/€ðEð Eð Eð Eð E�Vñ Eô Eð Eð&ð ð ð ð ˆfñ ô ð ðl%ð l%ð l%ð l%ð l%ˆWñ l%ô l%ð l%ð^Vð Vð Vð Vð V�&ñ Vô Vð Vðrð ð ð ð ð r   