a �DOgj�@s�dZgd�ZiZddd�Zdd�ZzeWney<Yn0dd�Zeeee�d d �Zd Z e e j �Z d d �Zdd�Zdd�Zdd�ZiZiZiZdd�Zdd�Zdd�ZdS)z�Helper to provide extensibility for pickle. This is only useful to add pickle support for extension types defined in C, not for instances of user-defined classes. )�pickle� constructor� add_extension�remove_extension�clear_extension_cacheNcCs,t|�std��|t|<|dur(t|�dS)Nz$reduction functions must be callable)�callable� TypeError�dispatch_tabler)�ob_type�pickle_function�constructor_ob�r �/usr/lib64/python3.9/copyreg.pyr s rcCst|�std��dS)Nzconstructors must be callable)rr)�objectr r r rsrcCst|j|jffS�N)�complex�real�imag)�cr r r �pickle_complex"srcCs<|turt�|�}n$|�||�}|jtjkr8|�||�|Sr)r�__new__�__init__)�cls�base�state�objr r r �_reconstructor)s     ric Cs|dks J�|j}|jD]:}t|d�r4|jt@s4qX|j}t|t�r|j|urqXqt }|t urfd}n"||ur�t d|j �d���||�}|||f}z |j }WnXt y�t|dd�r�t d|j �d|���d�z |j}Wnt y�d}Yn0Yn0|�}|�r t||fSt|fSdS)N�� __flags__zcannot pickle z object� __slots__zf object: a class that defines __slots__ without defining __getstate__ cannot be pickled with protocol )� __class__�__mro__�hasattrr� _HEAPTYPEr� isinstance� _new_type�__self__rr�__name__� __getstate__�AttributeError�getattr�__dict__r) �self�protorr�newr�args�getstate�dictr r r � _reduce_ex7s@       ��   r1cGs|j|g|�R�Sr�r)rr.r r r � __newobj__^sr3cCs|j|g|�Ri|��S)zUsed by pickle protocol 4, instead of __newobj__ to allow classes with keyword-only arguments to be pickled correctly. r2)rr.�kwargsr r r � __newobj_ex__asr5cCs�|j�d�}|dur|Sg}t|d�s(n�|jD]�}d|jvr.|jd}t|t�rV|f}|D]^}|dvrjqZqZ|�d�r�|�d�s�|j� d�}|r�|� d||f�q�|� |�qZ|� |�qZq.z ||_ Wn Yn0|S)a�Return a list of slot names for a given class. This needs to find slots defined by the class and its bases, so we can't simply return the __slots__ attribute. We must walk down the Method Resolution Order and concatenate the __slots__ of each class found there. (This assumes classes don't modify their __slots__ attribute to misrepresent their slots after the class is defined.) � __slotnames__Nr)r*� __weakref__�__�_z_%s%s) r*�getr!r r#�str� startswith�endswithr&�lstrip�appendr6)r�namesr�slots�name�strippedr r r � _slotnamesgs2         rDcCs�t|�}d|krdks&ntd��||f}t�|�|krNt�|�|krNdS|tvrjtd|t|f��|tvr�td|t|f��|t|<|t|<dS)zRegister an extension code.�i���zcode out of rangeNz)key %s is already registered with code %sz$code %s is already in use for key %s)�int� ValueError�_extension_registryr:�_inverted_registry��modulerB�code�keyr r r r�s$ � � �rcCsR||f}t�|�|ks$t�|�|kr4td||f��t|=t|=|tvrNt|=dS)z0Unregister an extension code. For testing only.z%key %s is not registered with code %sN)rHr:rIrG�_extension_cacherJr r r r�s ��rcCs t��dSr)rN�clearr r r r r�sr)N)�__doc__�__all__rrrr� NameErrorrrr"�typerFrr$r1r3r5rDrHrIrNrrrr r r r �s.     '<