U e5d��@s�dZdddddgZiZddd�Zdd�ZzeWnek rDYnXd d �Zeeee�d d �Zd Z dd�Z dd�Z dd�Z dd�Z iZiZiZdd�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|<|dk r(t|�dS)Nz$reduction functions must be callable)�callable� TypeError�dispatch_tabler)�ob_type�pickle_function�constructor_ob�r �/usr/lib64/python3.8/copyreg.pyr s cCst|�std��dS)Nzconstructors must be callable)rr)�objectr r r rscCst|j|jffS�N)�complex�real�imag)�cr r r �pickle_complex"srcCs<|tkrt�|�}n$|�||�}|jtjkr8|�||�|Sr)r�__new__�__init__)�cls�base�state�objr r r �_reconstructor)s     ric Cs�|dks t�|j}|jD]}t|d�r|jt@sq:qt}|tkrHd}n"||krbtd|j�d���||�}|||f}z |j }Wn\t k r�t |dd�r�td|j�d|���d�z |j }Wnt k r�d}YnXYnX|�}|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 )�AssertionError� __class__�__mro__�hasattrr� _HEAPTYPErr�__name__� __getstate__�AttributeError�getattr�__dict__r)�self�protorrr�args�getstate�dictr r r � _reduce_ex6s6     �  r.cGs|j|f|��Sr�r)rr+r r r � __newobj__Zsr0cCs|j|f|�|�S)zUsed by pickle protocol 4, instead of __newobj__ to allow classes with keyword-only arguments to be pickled correctly. r/)rr+�kwargsr r r � __newobj_ex__]sr2cCs�|j�d�}|dk r|Sg}t|d�s(n�|jD]�}d|jkr.|jd}t|t�rV|f}|D]^}|dkrjqZqZ|�d�r�|�d�s�|j� d�}|r�|� d||f�q�|� |�qZ|� |�qZq.z ||_ Wn YnX|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!� isinstance�str� startswith�endswithr$�lstrip�appendr3)r�namesr�slots�name�strippedr r r � _slotnamescs2         rBcCs�t|�}d|krdks&ntd��||f}t�|�|krNt�|�|krNdS|tkrjtd|t|f��|tkr�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_registryr7�_inverted_registry��moduler@�code�keyr r r r�s$ � � �cCsR||f}t�|�|ks$t�|�|kr4td||f��t|=t|=|tkrNt|=dS)z0Unregister an extension code. For testing only.z%key %s is not registered with code %sN)rFr7rGrE�_extension_cacherHr r r r�s ��cCs t��dSr)rL�clearr r r r r�s)N)�__doc__�__all__rrrr� NameErrorrrr#r.r0r2rBrFrGrLrrrr r r r �s4�   $<