§
    �ÅjTL  ã                  óP  — d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlZd dlmZ d dlmZmZ dd	lmZmZ  ed
ej        j        d¬¦  «        Ze
eef         Z	  ede¦  «        Z	  G d„ deee         ¦  «        Z ed         Z!	  G d„ de¦  «        Z" G d„ de#¦  «        Z$ G d„ deee         ¦  «        Z% G d„ de%e         ee         ¦  «        Z& G d„ de%e         ee         ¦  «        Z'ee&ej        j                 e'ej        j                 f         Z(dS )é    )Úannotations)ÚABCÚabstractmethod)ÚEnum)
ÚAnyÚCallableÚDictÚFinalÚGenericÚLiteralÚNewTypeÚTypeVarÚUnionÚoverloadN)ÚTensor)ÚSelfÚoverrideé   )ÚSizeRequirementsÚ
pad_tensorÚTT)ÚboundÚ	covariantÚArchIdc                  óz   ‡ — e Zd ZdZddœdˆ fd„Zedd„¦   «         Zedd„¦   «         Zdd„Ze	dd„¦   «         Z
ˆ xZS )ÚArchitecturez8
    The abstract base class for all architectures.
    N)ÚnameÚidúArchId | strÚdetectúCallable[[StateDict], bool]r   ú
str | NoneÚreturnÚNonec               ó�   •— t          ¦   «                              ¦   «          t          |¦  «        | _        |p|| _        || _        d S ©N)ÚsuperÚ__init__r   Ú_idÚ_nameÚ_detect)Úselfr   r    r   Ú	__class__s       €úTC:\Projects\Historical\venv\Lib\site-packages\spandrel/__helpers/model_descriptor.pyr(   zArchitecture.__init__,   s>   ø€ õ 	‰Œ×ÒÑÔÐå"(¨¡*¤*ˆŒØ!% ¨ˆŒ
ØˆŒˆˆó    r   c                ó   — | j         S )zÆ
        The unique ID of the architecture.

        For built-in architectures, this is the same as the module name. E.g. `spandrel.architectures.RestoreFormer` has the ID `RestoreFormer`.
        )r)   ©r,   s    r.   r   zArchitecture.id9   s   € ð Œxˆr/   Ústrc                ó   — | j         S )zX
        The name of the architecture.

        This is often the same as `id`.
        )r*   r1   s    r.   r   zArchitecture.nameB   s   € ð ŒzÐr/   Ú
state_dictÚ	StateDictÚboolc                ó,   — |                       |¦  «        S )a¤  
        Inspects the given state dict and returns ``True`` if it is a state dict of this architecture.

        This guarantees that there are no false negatives, but there might be false positives.
        This is important to remember when ordering architectures in a registry.

        (Note: while false positives are allowed, they are supposed to be rare. So we do accept bug reports for false positives.)
        )r+   ©r,   r4   s     r.   r    zArchitecture.detectK   s   € ð �|Š|˜JÑ'Ô'Ð'r/   ú7ImageModelDescriptor[T] | MaskedImageModelDescriptor[T]c                ó   — dS )a�  
        Loads the given state dict into a model. The hyperparameters will automatically be deduced.

        The state dict is assumed to be a state dict of this architecture, meaning that `detect` returned `True` for the state dict.
        If this is not the case, then the behavior of this function is unspecified (the model may be loaded incorrect or an error is thrown).
        N© r8   s     r.   ÚloadzArchitecture.loadV   s   € € € r/   )r   r   r    r!   r   r"   r#   r$   )r#   r   )r#   r2   )r4   r5   r#   r6   )r4   r5   r#   r9   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   Úpropertyr   r   r    r   r<   Ú__classcell__©r-   s   @r.   r   r   '   sÊ   ø€ € € € € ðð ð  ðð ð ð ð ð ð ð ð ðð ð ñ „Xðð ðð ð ñ „Xðð	(ð 	(ð 	(ð 	(ð ðð ð ñ „^ðð ð ð ð r/   r   )ÚSRÚFaceSRÚ
InpaintingÚRestorationc                  ó"   — e Zd ZdZdZ	 dZ	 dZdS )ÚModelTilingz<
    Describes whether and how a model supports tiling.
    r   é   é   N)r=   r>   r?   r@   Ú	SUPPORTEDÚDISCOURAGEDÚINTERNALr;   r/   r.   rI   rI   m   s=   € € € € € ðð ð €Iðð €Kðð €Hðð r/   rI   c                  ó   — e Zd ZdZdS )ÚUnsupportedDtypeErrorzŒ
    An error that will be thrown by `.to` if the model does not support the given dtype.

    See `ModelBase.to` for more information.
    N)r=   r>   r?   r@   r;   r/   r.   rP   rP   ‡   s   € € € € € ðð ð ð r/   rP   c                  ó,  — e Zd ZdZdej        fd4d„Zed5d„¦   «         Zed6d„¦   «         Z	ee
d7d„¦   «         ¦   «         Zed8d„¦   «         Zed9d„¦   «         Ze	 	 d:d;d%„¦   «         Zed<d&„¦   «         Zd=d)„Zd>d*„Zd>d+„Zd>d,„Zd>d-„Zd?d@d/„Zd>d0„ZdAdBd3„ZdS )CÚ	ModelBasez£
    The base class of all model descriptors.

    This is mostly intended for `instanceof` checks in user code. Use `ModelDescriptor` for type hints instead.
    NÚmodelr   r4   r5   ÚarchitectureúArchitecture[T]Útagsú	list[str]Úsupports_halfr6   Úsupports_bfloat16ÚscaleÚintÚinput_channelsÚoutput_channelsÚsize_requirementsúSizeRequirements | NoneÚtilingrI   c                óò   — || _         || _        || _        	 || _        	 || _        	 || _        	 || _        	 |	| _        	 |
pt          ¦   «         | _	        	 || _
        	 | j                             |¦  «         d S r&   )Ú_modelÚ_architecturerV   rX   rY   rZ   r\   r]   r   r^   r`   rS   Úload_state_dict)r,   rS   r4   rT   rV   rX   rY   rZ   r\   r]   r^   r`   s               r.   r(   zModelBase.__init__–   s³   € ð ˆŒØ.:ˆÔØ#ˆŒ	ð	ð $1ˆÔð	ð (9ˆÔð	ð  ˆŒ
ð	ð $2ˆÔð	ð %4ˆÔð	ð
 Ð3Õ!1Ñ!3Ô!3ð 	Ôð	ð $*ˆŒð	ð 	Œ
×"Ò" :Ñ.Ô.Ð.Ð.Ð.r/   r#   c                ó   — | j         S )z¦
        The model itself: a `torch.nn.Module` with weights loaded in.

        The specific subclass of `torch.nn.Module` depends on the model architecture.
        )rb   r1   s    r.   rS   zModelBase.modelÛ   s   € ð Œ{Ðr/   c                ó   — | j         S )z0
        The architecture of the model.
        )rc   r1   s    r.   rT   zModelBase.architectureä   s   € ð
 Ô!Ð!r/   ÚPurposec                ó   — dS )z,
        The purpose of this model.
        Nr;   r1   s    r.   ÚpurposezModelBase.purposeë   s	   € ð 	ˆr/   útorch.devicec                óX   — t          | j                             ¦   «         ¦  «        j        S )zq
        The device of the underlying module.

        Use `to` to move the model to a different device.
        )ÚnextrS   Ú
parametersÚdevicer1   s    r.   rn   zModelBase.deviceó   s#   € õ �D”J×)Ò)Ñ+Ô+Ñ,Ô,Ô3Ð3r/   útorch.dtypec                óX   — t          | j                             ¦   «         ¦  «        j        S )zw
        The data type of the underlying module.

        Use `to` to cast the model to a different data type.
        )rl   rS   rm   Údtyper1   s    r.   rq   zModelBase.dtype  s#   € õ �D”J×)Ò)Ñ+Ô+Ñ,Ô,Ô2Ð2r/   rn   útorch.device | str | Nonerq   útorch.dtype | Noner   c                ó   — d S r&   r;   )r,   rn   rq   s      r.   ÚtozModelBase.to  s	   € ð
 ˆsr/   c                ó   — d S r&   r;   )r,   rq   s     r.   ru   zModelBase.to  s   € Ø.1¨cr/   ÚargsÚobjectc                ó  ‡— dˆfd„}t          |¦  «        dk    r~|d         }t          |t          j        ¦  «        r |d|¦  «         n¹t          |t          j        t
          f¦  «        s|€ |d
|¦  «         n‰t          dt          |¦  «        › �¦  «        ‚t          |¦  «        dk    r% |d
|d         ¦  «          |d|d         ¦  «         n2t          |¦  «        dk    rt          dt          |¦  «        › �¦  «        ‚‰                     d
d	¦  «        }‰                     dd	¦  «        }t          ‰¦  «        dk    rt          dt          ‰¦  «        › �¦  «        ‚|�\|t          j
        k    r| j        st          | j        › d�¦  «        ‚|t          j        k    r| j        st          | j        › d�¦  «        ‚t          |t
          ¦  «        rt          j        |¦  «        }| j                             ||¬¦  «         | S )aó  
        Moves and casts the parameters and buffers of the underlying module to the given device and data type.

        For more information, see https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.to.

        Use `device` to get the current device and `dtype` to get the current data type of the model.

        Throws `UnsupportedDtypeError` if the model does not support the given data type. If you want to force a dtype cast, use `.model.to(dtype)` instead.
        r   r2   Úvaluerx   c                ó>   •— | ‰v rt          d| › �¦  «        ‚|‰| <   d S )Nz.to() got multiple values for keyword argument )Ú	TypeError)r   rz   Úkwargss     €r.   Úset_kwzModelBase.to.<locals>.set_kw!  s1   ø€ Ø�vˆ~ˆ~ÝÐ WÐQUÐ WÐ WÑXÔXÐXØ ˆF�4‰LˆLˆLr/   r   r   rq   Nrn   z5to() expected a torch.device or torch.dtype, but got rJ   z2to() expected at most 2 positional arguments, got z&to() got unexpected keyword arguments z' does not support half precision (fp16)z$ does not support bfloat16 precision)rn   rq   )r   r2   rz   rx   )ÚlenÚ
isinstanceÚtorchrq   rn   r2   r|   ÚtypeÚpopÚlistÚfloat16rX   rP   rT   Úbfloat16rY   rS   ru   )r,   rw   r}   r~   Úargrn   rq   s     `    r.   ru   zModelBase.to  s4  ø€ ð	!ð 	!ð 	!ð 	!ð 	!ð 	!õ
 ˆt‰9Œ9˜Š>ˆ>Ø˜qœ'ˆCÝ˜#�uœ{Ñ+Ô+ð Ø��w Ñ$Ô$Ð$Ð$Ý˜C¥%¤,µÐ!4Ñ5Ô5ð ¸¸Ø��x Ñ%Ô%Ð%Ð%åØWÍDÐQTÉIÌIÐWÐWñô ð õ �‰YŒY˜!Š^ˆ^ØˆF�8˜T !œWÑ%Ô%Ð%ØˆF�7˜D œGÑ$Ô$Ð$Ð$Ý�‰YŒY˜Š]ˆ]ÝØPÅSÈÁYÄYÐPÐPñô ð ð -3¯JªJ°xÀÑ,FÔ,FˆØ$*§J¢J¨w¸Ñ$=Ô$=ˆåˆv‰;Œ;˜Š?ˆ?ÝÐSÅTÈ&Á\Ä\ÐSÐSÑTÔTÐTàÐØ�œÒ%Ð%¨dÔ.@Ð%Ý+ØÔ(ÐQÐQÐQñô ð ð �œÒ&Ð&¨tÔ/EÐ&Ý+ØÔ(ÐNÐNÐNñô ð õ �f�cÑ"Ô"ð 	*Ý”\ &Ñ)Ô)ˆFàŒ
�Š˜V¨5ˆÑ1Ô1Ð1Øˆr/   c                óD   — |                       t          j        ¦  «         | S )z�
        Moves the parameters and buffers of the underlying module to half precision (fp16).

        Same as `self.to(torch.half)`.
        )ru   r�   Úhalfr1   s    r.   r‰   zModelBase.halfN  s   € ð 	�Š•”
ÑÔÐØˆr/   c                óD   — |                       t          j        ¦  «         | S )zŽ
        Moves the parameters and buffers of the underlying module to bfloat16 precision.

        Same as `self.to(torch.bfloat16)`.
        )ru   r�   r†   r1   s    r.   r†   zModelBase.bfloat16W  s   € ð 	�Š•”ÑÔÐØˆr/   c                óD   — |                       t          j        ¦  «         | S )z�
        Moves the parameters and buffers of the underlying module to single precision (fp32).

        Same as `self.to(torch.float)`.
        )ru   r�   Úfloatr1   s    r.   rŒ   zModelBase.float`  s   € ð 	�Š•”ÑÔÐØˆr/   c                ó8   — | j                              ¦   «          | S )zˆ
        Moves the parameters and buffers of the underlying module to the CPU.

        Same as `self.to(torch.device("cpu"))`.
        )rS   Úcpur1   s    r.   rŽ   zModelBase.cpui  s   € ð 	Œ
�ŠÑÔÐØˆr/   ú
int | Nonec                ó:   — | j                              |¦  «         | S )z‰
        Moves the parameters and buffers of the underlying module to the GPU.

        Same as `self.to(torch.device("cuda"))`.
        )rS   Úcuda)r,   rn   s     r.   r‘   zModelBase.cudar  s   € ð 	Œ
�Š˜ÑÔÐØˆr/   c                ó8   — | j                              ¦   «          | S )zf
        Sets the underlying module in evaluation mode.

        Same as `self.train(False)`.
        )rS   Úevalr1   s    r.   r“   zModelBase.eval{  s   € ð 	Œ
�ŠÑÔÐØˆr/   TÚmodec                ó:   — | j                              |¦  «         | S )zi
        Sets the underlying module in training mode.

        Same as `self.model.train(mode)`.
        )rS   Útrain)r,   r”   s     r.   r–   zModelBase.train„  s   € ð 	Œ
×Ò˜ÑÔÐØˆr/   )rS   r   r4   r5   rT   rU   rV   rW   rX   r6   rY   r6   rZ   r[   r\   r[   r]   r[   r^   r_   r`   rI   )r#   r   )r#   rU   )r#   rg   )r#   rj   )r#   ro   )NN)rn   rr   rq   rs   r#   r   )rq   ro   r#   r   )rw   rx   r#   r   )r#   r   r&   )rn   r�   r#   r   )T)r”   r6   r#   r   )r=   r>   r?   r@   rI   rL   r(   rA   rS   rT   r   ri   rn   rq   r   ru   r‰   r†   rŒ   rŽ   r‘   r“   r–   r;   r/   r.   rR   rR   �   sâ  € € € € € ðð ð" 6:Ø)Ô3ðC/ð C/ð C/ð C/ð C/ðJ ðð ð ñ „Xðð ð"ð "ð "ñ „Xð"ð Øðð ð ñ „^ñ „Xðð ð4ð 4ð 4ñ „Xð4ð ð3ð 3ð 3ñ „Xð3ð ð -1Ø$(ðð ð ð ñ „Xðð Ø1Ð1Ð1ñ „XØ1ð7ð 7ð 7ð 7ðrð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð ðð ð ð ðð ð ð ð ð ð r/   rR   c                  ó�   ‡ — e Zd ZdZdej        dfd ˆ fd„Zeed!d„¦   «         ¦   «         Z	 e
j        ¦   «         d"d„¦   «         Zˆ xZS )#ÚImageModelDescriptorzi
    A model that takes an image as input and returns an image. See `__call__` for more information.
    NrS   r   r4   r5   rT   rU   ri   ú&Literal['SR', 'FaceSR', 'Restoration']rV   rW   rX   r6   rY   rZ   r[   r\   r]   r^   r_   r`   rI   Úcall_fnú$Callable[[T, Tensor], Tensor] | Nonec                ó®   •— |dk    s|dk    s
J d¦   «         ‚t          ¦   «                              ||||||||	|
||¬¦  «         || _        |pd„ | _        d S )NrG   r   z)Restoration models must have a scale of 1©rX   rY   rZ   r\   r]   r^   r`   c                ó   —  | |¦  «        S r&   r;   )rS   Úimages     r.   ú<lambda>z/ImageModelDescriptor.__init__.<locals>.<lambda>·  s   € ¸¸¸u¹¼€ r/   ©r'   r(   Ú_purposeÚ_call_fn)r,   rS   r4   rT   ri   rV   rX   rY   rZ   r\   r]   r^   r`   rš   r-   s                 €r.   r(   zImageModelDescriptor.__init__“  sŠ   ø€ ð" �}Ò$Ð$¨°ª
¨
¨
Ø6ñ )3¬
Ð2õ 	‰Œ×ÒØØØØØ'Ø/ØØ)Ø+Ø/Øð 	ñ 	
ô 	
ð 	
ð AHˆŒàÐFÐ$EÐ$EˆŒˆˆr/   r#   c                ó   — | j         S r&   ©r¢   r1   s    r.   ri   zImageModelDescriptor.purpose¹  ó   € ð Œ}Ðr/   rŸ   r   c                ó,  — t          |j        ¦  «        dk    rt          d|j        › �¦  «        ‚|j        \  }}}}t          || j        ¦  «        \  }}| j        j        r| j                             ¦   «          |                      | j        |¦  «        }t          |t          ¦  «        s4J dt          | j        ¦  «        j        › dt          |¦  «        › �¦   «         ‚|                     dd¦  «        }|r|dd|| j        z  …d|| j        z  …f         }|S )	aš  
        Takes a single image tensor as input and returns a single image tensor as output.

        The `image` tensor must be a 4D tensor with shape `(1, input_channels, H, W)`. The data type (float32, float16, bfloat16) and device of the `image` tensor must be the same as the model. The range of the `image` tensor must be ``[0, 1]``.

        The output tensor will be a 4D tensor with shape `(1, output_channels, H*scale, W*scale)`. The data type and device of the output tensor will be the same as the `image` tensor. The range of the output tensor will be ``[0, 1]``.

        If the width and height of the `image` tensor do not satisfy the `size_requirements` of the model, then the `image` tensor will be padded to satisfy the requirements. The additional padding will be removed from the output tensor before returning it. If the image already satisfies the requirements, then no padding will be added.
        é   ú4Expected image tensor to have 4 dimensions, but got ú	Expected z# model to return a tensor, but got r   r   .N)r   ÚshapeÚ
ValueErrorr   r^   rS   Útrainingr“   r£   r€   r   r‚   r=   Úclamp_rZ   )r,   rŸ   Ú_ÚhÚwÚdid_padÚoutputs          r.   Ú__call__zImageModelDescriptor.__call__¾  s@  € õ ˆuŒ{ÑÔ˜qÒ Ð ÝØTÀuÄ{ÐTÐTñô ð ð ”[‰
ˆˆ1ˆa�õ $ E¨4Ô+AÑBÔB‰ˆ�ð Œ:Ôð 	ØŒJ�OŠOÑÔÐð —’˜tœz¨5Ñ1Ô1ˆÝØ•Fñ
ô 
ð 	dð 	dàc•t˜DœJÑ'Ô'Ô0ÐcÐcÕUYÐZ`ÑUaÔUaÐcÐcñ	dô 	dð 
ð
 —’˜q !Ñ$Ô$ˆð ð 	EØ˜CÐ!1 1 t¤z¡>Ð!1Ð3C°Q¸¼±^Ð3CÐCÔDˆFàˆr/   )rS   r   r4   r5   rT   rU   ri   r™   rV   rW   rX   r6   rY   r6   rZ   r[   r\   r[   r]   r[   r^   r_   r`   rI   rš   r›   )r#   r™   )rŸ   r   r#   r   )r=   r>   r?   r@   rI   rL   r(   rA   r   ri   r�   Úinference_moder´   rB   rC   s   @r.   r˜   r˜   Ž  s¸   ø€ € € € € ðð ð  6:Ø)Ô3Ø8<ð$Gð $Gð $Gð $Gð $Gð $Gð $GðL Øðð ð ñ „Xñ „Xðð €UÔÑÔð%ð %ð %ñ Ôð%ð %ð %ð %ð %r/   r˜   c                  óf   ‡ — e Zd ZdZdej        dfd ˆ fd„Zeed!d„¦   «         ¦   «         Z	d"d„Z
ˆ xZS )#ÚMaskedImageModelDescriptorzƒ
    A model that takes an image and a mask for that image as input and returns an image. See `__call__` for more information.
    NrS   r   r4   r5   rT   rU   ri   úLiteral['Inpainting']rV   rW   rX   r6   rY   r\   r[   r]   r^   r_   r`   rI   rš   ú,Callable[[T, Tensor, Tensor], Tensor] | Nonec                ó‚   •— t          ¦   «                              ||||||d||	|
|¬¦  «         || _        |pd„ | _        d S )Nr   r�   c                ó   —  | ||¦  «        S r&   r;   )rS   rŸ   Úmasks      r.   r    z5MaskedImageModelDescriptor.__init__.<locals>.<lambda>  s   € ¸u¸uÀUÈDÑ?QÔ?Q€ r/   r¡   )r,   rS   r4   rT   ri   rV   rX   rY   r\   r]   r^   r`   rš   r-   s                €r.   r(   z#MaskedImageModelDescriptor.__init__ì  sd   ø€ õ 	‰Œ×ÒØØØØØ'Ø/ØØ)Ø+Ø/Øð 	ñ 	
ô 	
ð 	
ð 07ˆŒàÐRÐ$QÐ$QˆŒˆˆr/   r#   c                ó   — | j         S r&   r¥   r1   s    r.   ri   z"MaskedImageModelDescriptor.purpose  r¦   r/   rŸ   r   r¼   c                óì  — t          |j        ¦  «        dk    rt          d|j        › �¦  «        ‚t          |j        ¦  «        dk    rt          d|j        › �¦  «        ‚|j        \  }}}}t          j        dd||g¦  «        }|j        |k    rt          d|› d|j        › �¦  «        ‚t          || j        ¦  «        \  }}t          || j        ¦  «        \  }}|                      | j        ||¦  «        }t          |t          ¦  «        s4J dt          | j        ¦  «        j        › dt          |¦  «        › �¦   «         ‚|                     d	d¦  «        }|r|d
d|| j        z  …d|| j        z  …f         }|S )a�  
        Takes an image tensor and an image mask tensor as input and returns a single image tensor as output.

        The data type (float32, float16, bfloat16) and device of the `image` and `mask` tensors must be the same as the model.

        The `image` tensor must be a 4D tensor with shape `(1, input_channels, H, W)`. The range of the `image` tensor must be ``[0, 1]``.

        The `mask` tensor must be a 4D tensor with shape `(1, 1, H, W)`. The width and height must be the same as `image` tensor. The values of the `mask` tensor must be either 0 (keep) or 1 (inpaint).

        The output tensor will be a 4D tensor with shape `(1, output_channels, H, W)`. The data type and device of the output tensor will be the same as the `image` tensor. The range of the output tensor will be ``[0, 1]``.

        If the width and height of the `image` tensor do not satisfy the `size_requirements` of the model, then the `image` tensor will be padded to satisfy the requirements. The additional padding will be removed from the output tensor before returning it. If the image already satisfies the requirements, then no padding will be added.
        r¨   r©   z3Expected mask tensor to have 4 dimensions, but got r   zExpected mask shape to be z
, but got rª   z$ model to returns a tensor, but got r   .N)r   r«   r¬   r�   ÚSizer   r^   r£   rS   r€   r   r‚   r=   r®   rZ   )	r,   rŸ   r¼   r¯   r°   r±   Ú
mask_shaper²   r³   s	            r.   r´   z#MaskedImageModelDescriptor.__call__  s¸  € õ ˆuŒ{ÑÔ˜qÒ Ð ÝØTÀuÄ{ÐTÐTñô ð õ ˆtŒz‰?Œ?˜aÒÐÝØRÀdÄjÐRÐRñô ð ð ”[‰
ˆˆ1ˆa�õ ”Z  A q¨! Ñ-Ô-ˆ
ØŒ:˜Ò#Ð#ÝØO¨ZÐOÐOÀ4Ä:ÐOÐOñô ð õ
 $ E¨4Ô+AÑBÔB‰ˆ�Ý˜T 4Ô#9Ñ:Ô:‰ˆˆ4ð —’˜tœz¨5°$Ñ7Ô7ˆÝØ•Fñ
ô 
ð 	eð 	eàd•t˜DœJÑ'Ô'Ô0ÐdÐdÕVZÐ[aÑVbÔVbÐdÐdñ	eô 	eð 
ð
 —’˜q !Ñ$Ô$ˆð ð 	EØ˜CÐ!1 1 t¤z¡>Ð!1Ð3C°Q¸¼±^Ð3CÐCÔDˆFàˆr/   )rS   r   r4   r5   rT   rU   ri   r¸   rV   rW   rX   r6   rY   r6   r\   r[   r]   r[   r^   r_   r`   rI   rš   r¹   )r#   r¸   )rŸ   r   r¼   r   r#   r   )r=   r>   r?   r@   rI   rL   r(   rA   r   ri   r´   rB   rC   s   @r.   r·   r·   ç  s    ø€ € € € € ðð ð 6:Ø)Ô3Ø@DðSð Sð Sð Sð Sð Sð SðB Øðð ð ñ „Xñ „Xðð1ð 1ð 1ð 1ð 1ð 1ð 1ð 1r/   r·   ))Ú
__future__r   Úabcr   r   Úenumr   Útypingr   r   r	   r
   r   r   r   r   r   r   r�   r   Útyping_extensionsr   r   Úsize_reqr   r   ÚnnÚModuler   r2   r5   r   r   rg   rI   Ú	ExceptionrP   rR   r˜   r·   ÚModelDescriptorr;   r/   r.   ú<module>rË      sÇ  ðØ "Ð "Ð "Ð "Ð "Ð "à #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð €€€Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2à€GˆC�u”x”°$Ð7Ñ7Ô7€à��c�ŒN€	ðð 
ˆ�˜3Ñ	Ô	€ðð
8ð 8ð 8ð 8ð 8�3˜ œ
ñ 8ô 8ð 8ðv Ð=Ô
>€ððð ð ð ð �$ñ ô ð ð4ð ð ð ð ˜Iñ ô ð ð|ð |ð |ð |ð |��W˜Q”Zñ |ô |ð |ð~Vð Vð Vð Vð V˜9 Qœ<¨°¬ñ Vô Vð Vðr\ð \ð \ð \ð \ ¨1¤¨w°q¬zñ \ô \ð \ð~ Ø˜œœÔ)Ø˜uœxœÔ/ð1ô€ðð r/   