§
    ù²ÅjÜ0  ã                   óÚ  — d dl Z d dlmZmZmZmZmZ d dlZd dlZd dlm	Z	m
Z
 ddlmZ ddlmZ ej        j        de
de
fd	„¦   «         Zej        j        d
e
defd„¦   «         Z	 	 dde
dededeeee
f                  deeeef                  dee
eeee
f                  f         fd„Z G d„ de	j        ¦  «        Zde
dee         dee         de
fd„Zde
dee         dee         de
fd„ZdS )é    N)ÚAnyÚDictÚListÚOptionalÚTuple)ÚnnÚTensoré   )Ú	ImageList)Úpaste_masks_in_imageÚimageÚreturnc                 óH   — ddl m} |                     | ¦  «        dd …         S )Nr   )Ú	operatorséþÿÿÿ)Ú
torch.onnxr   Úshape_as_tensor)r   r   s     úWC:\Projects\Historical\venv\Lib\site-packages\torchvision/models/detection/transform.pyÚ_get_shape_onnxr      s1   € à$Ð$Ð$Ð$Ð$Ð$à×$Ò$ UÑ+Ô+¨B¨C¨CÔ0Ð0ó    Úvc                 ó   — | S ©N© )r   s    r   Ú_fake_cast_onnxr      s	   € ð €Hr   Úself_min_sizeÚself_max_sizeÚtargetÚ
fixed_sizec                 óô  — t          j        ¦   «         rt          | ¦  «        }nOt          j                             ¦   «         r"t          j        | j        dd …         ¦  «        }n| j        dd …         }d }d }d }|�|d         |d         g}�n<t          j                             ¦   «         st          j        ¦   «         rÕt          j        |¦  «         	                    t          j
        ¬¦  «        }	t          j        |¦  «         	                    t          j
        ¬¦  «        }
t          |¦  «        }t          |¦  «        }t          j        ||	z  ||
z  ¦  «        }t          j        ¦   «         rt          |¦  «        }nI|                     ¦   «         }n4t          |¦  «        }	t          |¦  «        }
t          ||	z  ||
z  ¦  «        }d}t          j        j                             | d          ||d|d¬¦  «        d         } |€| |fS d	|v rm|d	         }t          j        j                             |d d …d f                              ¦   «         |||¬
¦  «        d d …df                              ¦   «         }||d	<   | |fS )Nr   r
   r   )ÚdtypeTÚbilinearF)ÚsizeÚscale_factorÚmodeÚrecompute_scale_factorÚalign_cornersÚmasks)r#   r$   r&   )ÚtorchvisionÚ_is_tracingr   ÚtorchÚjitÚis_scriptingÚtensorÚshapeÚminÚtoÚfloat32ÚmaxÚfloatr   Úitemr   Ú
functionalÚinterpolateÚbyte)r   r   r   r   r   Úim_shaper#   r$   r&   Úmin_sizeÚmax_sizeÚself_min_size_fÚself_max_size_fÚscaleÚmasks                  r   Ú_resize_image_and_masksr@      sm  € õ ÔÑ Ô ð $Ý" 5Ñ)Ô)ˆˆÝ	Œ×	Ò	Ñ	!Ô	!ð $Ý”< ¤¨B¨C¨CÔ 0Ñ1Ô1ˆˆà”;˜r˜s˜sÔ#ˆà $€DØ$(€LØ-1ÐØÐØ˜1”˜z¨!œ}Ð-ˆ‰åŒ9×!Ò!Ñ#Ô#ð 	S¥{Ô'>Ñ'@Ô'@ð 	SÝ”y Ñ*Ô*×-Ò-µE´MÐ-ÑBÔBˆHÝ”y Ñ*Ô*×-Ò-µE´MÐ-ÑBÔBˆHÝ# MÑ2Ô2ˆOÝ# MÑ2Ô2ˆOÝ”I˜o°Ñ8¸/ÈHÑ:TÑUÔUˆEåÔ&Ñ(Ô(ð ,Ý.¨uÑ5Ô5��à$Ÿzšz™|œ|��õ ˜8‘}”}ˆHÝ˜8‘}”}ˆHÝ˜}¨xÑ7¸ÈÑ9QÑRÔRˆLà!%ÐåŒHÔ×+Ò+ØˆdŒØØ!ØØ5Øð ,ñ ô ð ô	€Eð €~Ø�fˆ}Ðà�&ÐÐØ�gŒˆÝŒxÔ"×.Ò.Ø����D�ŒM×ÒÑ!Ô!¨¸<Ð`vð /ñ 
ô 
à
ˆ!ˆ!ˆQˆ$ôç’‘”ð 	ð ˆˆw‰Ø�&ˆ=Ðr   c                   óº  ‡ — e Zd ZdZ	 	 ddededee         dee         ded	eeeef                  d
e	fˆ fd„Z
	 d dee         deeeeef                           deeeeeeef                           f         fd„Zdedefd„Zdee         defd„Z	 d dedeeeef                  deeeeeef                  f         fd„Zej        j        d!dee         dedefd„¦   «         Zdeee                  dee         fd„Zd!dee         dedefd„Zdeeeef                  deeeef                  deeeef                  deeeef                  fd„Zdefd„Zˆ xZS )"ÚGeneralizedRCNNTransformah  
    Performs input / target transformation before feeding the data to a GeneralizedRCNN
    model.

    The transformations it performs are:
        - input normalization (mean subtraction and std division)
        - input / target resizing to match min_size / max_size

    It returns a ImageList for the inputs, and a List[Dict[Tensor]] for the targets
    é    Nr:   r;   Ú
image_meanÚ	image_stdÚsize_divisibler   Úkwargsc                 ó  •— t          ¦   «                              ¦   «          t          |t          t          f¦  «        s|f}|| _        || _        || _        || _        || _	        || _
        |                     dd¦  «        | _        d S )NÚ_skip_resizeF)ÚsuperÚ__init__Ú
isinstanceÚlistÚtupler:   r;   rD   rE   rF   r   ÚpoprI   )	Úselfr:   r;   rD   rE   rF   r   rG   Ú	__class__s	           €r   rK   z!GeneralizedRCNNTransform.__init__b   s   ø€ õ 	‰Œ×ÒÑÔÐÝ˜(¥T­5 MÑ2Ô2ð 	#Ø �{ˆHØ ˆŒØ ˆŒØ$ˆŒØ"ˆŒØ,ˆÔØ$ˆŒØ"ŸJšJ ~°uÑ=Ô=ˆÔÐÐr   ÚimagesÚtargetsr   c                 óö  — d„ |D ¦   «         }|�?g }|D ]8}i }|                      ¦   «         D ]
\  }}|||<   Œ|                     |¦  «         Œ9|}t          t          |¦  «        ¦  «        D ]�}||         }	|�||         nd }
|	                     ¦   «         dk    rt          d|	j        › �¦  «        ‚|                      |	¦  «        }	|                      |	|
¦  «        \  }	}
|	||<   |�|
�|
||<   Œ‚d„ |D ¦   «         }|  	                    || j
        ¬¦  «        }g }|D ]N}t          j        t          |¦  «        dk    d|› �¦  «         |                     |d         |d	         f¦  «         ŒOt          ||¦  «        }||fS )
Nc                 ó   — g | ]}|‘ŒS r   r   ©Ú.0Úimgs     r   ú
<listcomp>z4GeneralizedRCNNTransform.forward.<locals>.<listcomp>z   s   € Ð(Ð(Ð(˜#�#Ð(Ð(Ð(r   é   zFimages is expected to be a list of 3d tensors of shape [C, H, W], got c                 ó,   — g | ]}|j         d d…         ‘ŒS )r   N©r/   rV   s     r   rY   z4GeneralizedRCNNTransform.forward.<locals>.<listcomp>“   s"   € Ð8Ð8Ð8¨#�s”y   ”~Ð8Ð8Ð8r   )rF   é   zMInput tensors expected to have in the last two elements H and W, instead got r   r
   )ÚitemsÚappendÚrangeÚlenÚdimÚ
ValueErrorr/   Ú	normalizeÚresizeÚbatch_imagesrF   r+   Ú_assertr   )rP   rR   rS   Útargets_copyÚtÚdataÚkr   Úir   Útarget_indexÚimage_sizesÚimage_sizes_listÚ
image_sizeÚ
image_lists                  r   Úforwardz GeneralizedRCNNTransform.forwardw   sÛ  € ð )Ð( Ð(Ñ(Ô(ˆØÐð
 57ˆLØð *ð *�Ø*,�ØŸGšG™IœIð  ð  ‘D�A�qØ�D˜‘G�GØ×#Ò# DÑ)Ô)Ð)Ð)Ø"ˆGÝ•s˜6‘{”{Ñ#Ô#ð 
	*ð 
	*ˆAØ˜1”IˆEØ)0Ð)<˜7 1œ:˜:À$ˆLà�yŠy‰{Œ{˜aÒÐÝ Ð!wÐjoÔjuÐ!wÐ!wÑxÔxÐxØ—N’N 5Ñ)Ô)ˆEØ"&§+¢+¨e°\Ñ"BÔ"BÑˆE�<ØˆF�1‰IØÐ" |Ð'?Ø)�˜‘
øà8Ð8°Ð8Ñ8Ô8ˆØ×"Ò" 6¸$Ô:MÐ"ÑNÔNˆØ24ÐØ%ð 	Dð 	DˆJÝŒMÝ�J‘” 1Ò$ØlÐ`jÐlÐlñô ð ð ×#Ò# Z°¤]°J¸q´MÐ$BÑCÔCÐCÐCå˜vÐ'7Ñ8Ô8ˆ
Ø˜7Ð"Ð"r   r   c                 ó"  — |                      ¦   «         st          d|j        › d�¦  «        ‚|j        |j        }}t	          j        | j        ||¬¦  «        }t	          j        | j        ||¬¦  «        }||d d …d d f         z
  |d d …d d f         z  S )NzOExpected input images to be of floating type (in range [0, 1]), but found type z instead©r!   Údevice)Úis_floating_pointÚ	TypeErrorr!   ru   r+   Ú	as_tensorrD   rE   )rP   r   r!   ru   ÚmeanÚstds         r   rd   z"GeneralizedRCNNTransform.normalize    s®   € Ø×&Ò&Ñ(Ô(ð 	Ýð8Ø"'¤+ð8ð 8ð 8ñô ð ð œ U¤\ˆvˆÝŒ˜tœ°eÀFÐKÑKÔKˆÝŒo˜dœn°EÀ&ÐIÑIÔIˆØ˜˜Q˜Q˜Q  d˜]Ô+Ñ+¨s°1°1°1°d¸D°=Ô/AÑAÐAr   rk   c           
      óÔ   — t          t          j        d¦  «                             dt	          t          |¦  «        ¦  «        ¦  «                             ¦   «         ¦  «        }||         S )z”
        Implements `random.choice` via torch ops, so it can be compiled with
        TorchScript and we use PyTorch's RNG (not native RNG)
        r
   g        )Úintr+   ÚemptyÚuniform_r4   ra   r5   )rP   rk   Úindexs      r   Útorch_choicez%GeneralizedRCNNTransform.torch_choice«   sJ   € õ
 •E”K ‘N”N×+Ò+¨Cµµs¸1±v´v±´Ñ?Ô?×DÒDÑFÔFÑGÔGˆØ�Œxˆr   r   c                 óª  — |j         dd …         \  }}| j        r&| j        r||fS |                      | j        ¦  «        }n| j        d         }t          ||| j        || j        ¦  «        \  }}|€||fS |d         }t          |||f|j         dd …         ¦  «        }||d<   d|v r-|d         }t          |||f|j         dd …         ¦  «        }||d<   ||fS )Nr   éÿÿÿÿÚboxesÚ	keypoints)
r/   ÚtrainingrI   r€   r:   r@   r;   r   Úresize_boxesÚresize_keypoints)rP   r   r   ÚhÚwr#   Úbboxr„   s           r   re   zGeneralizedRCNNTransform.resize³   s  € ð
 Œ{˜2˜3˜3Ô‰ˆˆ1ØŒ=ð 	%ØÔ ð %Ø˜f�}Ð$Ø×$Ò$ T¤]Ñ3Ô3ˆDˆDà”= Ô$ˆDÝ/°°t¸T¼]ÈFÐTXÔTcÑdÔd‰ˆˆvàˆ>Ø˜&�=Ð à�gŒˆÝ˜D 1 a &¨%¬+°b°c°cÔ*:Ñ;Ô;ˆØˆˆw‰à˜&Ð Ð Ø˜{Ô+ˆIÝ(¨°Q¸°F¸E¼KÈÈÈÔ<LÑMÔMˆIØ"+ˆF�;ÑØ�fˆ}Ðr   c                 ó&  ‡
— g }t          |d                              ¦   «         ¦  «        D ]ƒŠ
t          j        t          j        ˆ
fd„|D ¦   «         ¦  «                             t          j        ¦  «        ¦  «                             t          j        ¦  «        }|                     |¦  «         Œ„|}t          j	        |d                              t          j        ¦  «        |z  ¦  «        |z                       t          j        ¦  «        |d<   t          j	        |d                              t          j        ¦  «        |z  ¦  «        |z                       t          j        ¦  «        |d<   t          |¦  «        }g }|D ]€}d„ t          |t          |j        ¦  «        ¦  «        D ¦   «         }t          j        j                             |d|d         d|d         d|d         f¦  «        }	|                     |	¦  «         Œ�t          j        |¦  «        S )Nr   c                 ó*   •— g | ]}|j         ‰         ‘ŒS r   r\   )rW   rX   rl   s     €r   rY   z?GeneralizedRCNNTransform._onnx_batch_images.<locals>.<listcomp>Ô   s   ø€ Ð/OÐ/OÐ/OÀ°´	¸!´Ð/OÐ/OÐ/Or   r
   r]   c                 ó   — g | ]
\  }}||z
  ‘ŒS r   r   )rW   Ús1Ús2s      r   rY   z?GeneralizedRCNNTransform._onnx_batch_images.<locals>.<listcomp>à   s    € ÐOÐOÐO¡V R¨˜˜R™ÐOÐOÐOr   )r`   rb   r+   r3   Ústackr1   r2   Úint64r_   ÚceilrN   Úzipr/   r   r6   Úpad)rP   rR   rF   r;   Ú
max_size_iÚstrideÚpadded_imgsrX   ÚpaddingÚ
padded_imgrl   s             @r   Ú_onnx_batch_imagesz+GeneralizedRCNNTransform._onnx_batch_imagesÐ   sÀ  ø€ àˆÝ�v˜a”y—}’}‘”Ñ'Ô'ð 	(ð 	(ˆAÝœ¥5¤;Ð/OÐ/OÐ/OÐ/OÈÐ/OÑ/OÔ/OÑ#PÔ#P×#SÒ#SÕTYÔTaÑ#bÔ#bÑcÔc×fÒfÕglÔgrÑsÔsˆJØ�OŠO˜JÑ'Ô'Ð'Ð'ØˆÝ”z 8¨A¤;§>¢>µ%´-Ñ#@Ô#@ÀFÑ"JÑKÔKÈfÑT×XÒXÕY^ÔYdÑeÔeˆ�‰Ý”z 8¨A¤;§>¢>µ%´-Ñ#@Ô#@ÀFÑ"JÑKÔKÈfÑT×XÒXÕY^ÔYdÑeÔeˆ�‰Ý˜‘?”?ˆð
 ˆØð 	+ð 	+ˆCØOÐO­s°8½UÀ3Ä9Ñ=MÔ=MÑ/NÔ/NÐOÑOÔOˆGÝœÔ,×0Ò0°°q¸'À!¼*ÀaÈÐQRÌÐUVÐX_Ð`aÔXbÐ6cÑdÔdˆJØ×Ò˜zÑ*Ô*Ð*Ð*åŒ{˜;Ñ'Ô'Ð'r   Úthe_listc                 óŒ   — |d         }|dd …         D ]0}t          |¦  «        D ]\  }}t          ||         |¦  «        ||<   ŒŒ1|S )Nr   r
   )Ú	enumerater3   )rP   r›   ÚmaxesÚsublistr   r5   s         r   Úmax_by_axisz$GeneralizedRCNNTransform.max_by_axisæ   s`   € Ø˜”ˆØ   ”|ð 	7ð 	7ˆGÝ(¨Ñ1Ô1ð 7ð 7‘��tÝ" 5¨¤<°Ñ6Ô6��e‘�ð7àˆr   c                 óú  — t          j        ¦   «         r|                      ||¦  «        S |                      d„ |D ¦   «         ¦  «        }t	          |¦  «        }t          |¦  «        }t          t          j        t	          |d         ¦  «        |z  ¦  «        |z  ¦  «        |d<   t          t          j        t	          |d         ¦  «        |z  ¦  «        |z  ¦  «        |d<   t          |¦  «        g|z   }|d          
                    |d¦  «        }t          |j        d         ¦  «        D ]P}||         }||d |j        d         …d |j        d         …d |j        d         …f                              |¦  «         ŒQ|S )Nc                 ó6   — g | ]}t          |j        ¦  «        ‘ŒS r   )rM   r/   rV   s     r   rY   z9GeneralizedRCNNTransform.batch_images.<locals>.<listcomp>ó   s    € Ð$GÐ$GÐ$G¸¥T¨#¬)¡_¤_Ð$GÐ$GÐ$Gr   r
   r]   r   )r)   r*   rš   r    r4   rM   r|   Úmathr’   ra   Únew_fullr`   r/   Úcopy_)	rP   rR   rF   r;   r–   Úbatch_shapeÚbatched_imgsrl   rX   s	            r   rf   z%GeneralizedRCNNTransform.batch_imagesí   sg  € ÝÔ"Ñ$Ô$ð 	Cð ×*Ò*¨6°>ÑBÔBÐBà×#Ò#Ð$GÐ$GÀÐ$GÑ$GÔ$GÑHÔHˆÝ�~Ñ&Ô&ˆÝ˜‘>”>ˆÝ�$œ)¥E¨(°1¬+Ñ$6Ô$6¸Ñ$?Ñ@Ô@À6ÑIÑJÔJˆ�‰Ý�$œ)¥E¨(°1¬+Ñ$6Ô$6¸Ñ$?Ñ@Ô@À6ÑIÑJÔJˆ�‰å˜6‘{”{�m hÑ.ˆØ˜a”y×)Ò)¨+°qÑ9Ô9ˆÝ�|Ô)¨!Ô,Ñ-Ô-ð 	Wð 	WˆAØ˜”)ˆCØ˜˜N˜cœi¨œl˜N¨N¨c¬i¸¬l¨N¸N¸c¼iÈ¼l¸NÐJÔK×QÒQÐRUÑVÔVÐVÐVàÐr   ÚresultÚimage_shapesÚoriginal_image_sizesc                 óP  — | j         r|S t          t          |||¦  «        ¦  «        D ]}\  }\  }}}|d         }t          |||¦  «        }|||         d<   d|v r$|d         }	t	          |	||¦  «        }	|	||         d<   d|v r$|d         }
t          |
||¦  «        }
|
||         d<   Œ~|S )Nrƒ   r(   r„   )r…   r�   r“   r†   r   r‡   )rP   r¨   r©   rª   rl   ÚpredÚim_sÚo_im_srƒ   r(   r„   s              r   Úpostprocessz$GeneralizedRCNNTransform.postprocess  sÖ   € ð Œ=ð 	ØˆMÝ'0µ°V¸\ÐK_Ñ1`Ô1`Ñ'aÔ'að 	3ð 	3Ñ#ˆAÑ#��d˜FØ˜”MˆEÝ  ¨¨fÑ5Ô5ˆEØ!&ˆF�1ŒI�gÑØ˜$ˆˆØ˜Wœ�Ý,¨U°E¸6ÑBÔB�Ø%*��q”	˜'Ñ"Ø˜dÐ"Ð"Ø  Ô-�	Ý,¨Y¸¸fÑEÔE�	Ø)2��q”	˜+Ñ&øØˆr   c                 ó’   — | j         j        › d�}d}||› d| j        › d| j        › d�z  }||› d| j        › d| j        › d�z  }|d	z  }|S )
Nú(z
    zNormalize(mean=z, std=ú)zResize(min_size=z, max_size=z, mode='bilinear')z
))rQ   Ú__name__rD   rE   r:   r;   )rP   Úformat_stringÚ_indents      r   Ú__repr__z!GeneralizedRCNNTransform.__repr__  sx   € Øœ>Ô2Ð5Ð5Ð5ˆØˆØ˜GÐ\Ð\°D´OÐ\Ð\È4Ì>Ð\Ð\Ð\Ñ\ˆØ˜GÐpÐp°T´]ÐpÐpÈtÌ}ÐpÐpÐpÑpˆØ˜ÑˆØÐr   )rC   Nr   )rC   )r³   Ú
__module__Ú__qualname__Ú__doc__r|   r   r4   r   r   r   rK   r	   r   Ústrr   rr   rd   r€   re   r+   r,   Úunusedrš   r    rf   r¯   r¶   Ú__classcell__)rQ   s   @r   rB   rB   V   sø  ø€ € € € € ð	ð 	ð" !Ø04ð>ð >àð>ð ð>ð ˜”Kð	>ð
 ˜”;ð>ð ð>ð ˜U 3¨ 8œ_Ô-ð>ð ð>ð >ð >ð >ð >ð >ð, RVð'#ð '#Ø˜6”lð'#Ø-5°d¸4ÀÀVÀÔ;LÔ6MÔ-Nð'#à	ˆy˜( 4¨¨S°&¨[Ô(9Ô#:Ô;Ð;Ô	<ð'#ð '#ð '#ð '#ðR	B˜vð 	B¨&ð 	Bð 	Bð 	Bð 	Bð˜d 3œið ¨Cð ð ð ð ð /3ðð àðð ˜˜c 6˜kÔ*Ô+ðð 
ˆv�x  S¨& [Ô 1Ô2Ð2Ô	3ð	ð ð ð ð: „YÔð(ð (¨¨f¬ð (Àsð (ÐTZð (ð (ð (ñ Ôð(ð* D¨¨c¬¤Oð ¸¸S¼	ð ð ð ð ðð  4¨¤<ð Àð Èfð ð ð ð ð(à�T˜#˜v˜+Ô&Ô'ðð ˜5  c œ?Ô+ðð # 5¨¨c¨¤?Ô3ð	ð
 
ˆd�3˜�;ÔÔ	 ðð ð ð ð,˜#ð ð ð ð ð ð ð ð r   rB   r„   Úoriginal_sizeÚnew_sizec                 ó„  ‡ — ˆ fd„t          ||¦  «        D ¦   «         }|\  }}‰                      ¦   «         }t          j                             ¦   «         rK|d d …d d …df         |z  }|d d …d d …df         |z  }t          j        |||d d …d d …df         fd¬¦  «        }n |dxx         |z  cc<   |dxx         |z  cc<   |S )Nc                 ó°   •— g | ]R\  }}t          j        |t           j        ‰j        ¬ ¦  «        t          j        |t           j        ‰j        ¬ ¦  «        z  ‘ŒSS ©rt   ©r+   r.   r2   ru   )rW   ÚsÚs_origr„   s      €r   rY   z$resize_keypoints.<locals>.<listcomp>!  sd   ø€ ð ð ð ñ ˆAˆvõ 	Œ�Q�eœm°IÔ4DÐEÑEÔEÝ
Œ,�v¥U¤]¸9Ô;KÐ
LÑ
LÔ
Lñ	Mðð ð r   r   r
   r]   ©rb   ).r   ).r
   )r“   Úcloner+   Ú_CÚ_get_tracing_stater�   )	r„   r½   r¾   ÚratiosÚratio_hÚratio_wÚresized_dataÚresized_data_0Úresized_data_1s	   `        r   r‡   r‡      s  ø€ ðð ð ð õ ˜X }Ñ5Ô5ðñ ô €Fð
 Ñ€GˆWØ—?’?Ñ$Ô$€LÝ„x×"Ò"Ñ$Ô$ð (Ø% a a a¨¨¨¨A gÔ.°Ñ8ˆØ% a a a¨¨¨¨A gÔ.°Ñ8ˆÝ”{ N°NÀLÐQRÐQRÐQRÐTUÐTUÐTUÐWXÐQXÔDYÐ#ZÐ`aÐbÑbÔbˆˆà�VÐÐÔ Ñ'ÐÐÑØ�VÐÐÔ Ñ'ÐÐÑØÐr   rƒ   c                 óÖ   ‡ — ˆ fd„t          ||¦  «        D ¦   «         }|\  }}‰                      d¦  «        \  }}}}	||z  }||z  }||z  }|	|z  }	t          j        ||||	fd¬¦  «        S )Nc                 ó°   •— g | ]R\  }}t          j        |t           j        ‰j        ¬ ¦  «        t          j        |t           j        ‰j        ¬ ¦  «        z  ‘ŒSS rÁ   rÂ   )rW   rÃ   rÄ   rƒ   s      €r   rY   z resize_boxes.<locals>.<listcomp>3  sb   ø€ ð ð ð ñ ˆAˆvõ 	Œ�Q�eœm°E´LÐAÑAÔAÝ
Œ,�v¥U¤]¸5¼<Ð
HÑ
HÔ
Hñ	Iðð ð r   r
   rÅ   )r“   Úunbindr+   r�   )
rƒ   r½   r¾   rÉ   Úratio_heightÚratio_widthÚxminÚyminÚxmaxÚymaxs
   `         r   r†   r†   2  s¡   ø€ ðð ð ð õ ˜X }Ñ5Ô5ðñ ô €Fð
 !'Ñ€L�+Ø"Ÿ\š\¨!™_œ_Ñ€Dˆ$��dà�+Ñ€DØ�+Ñ€DØ�,Ñ€DØ�,Ñ€DÝŒ;˜˜d D¨$Ð/°QÐ7Ñ7Ô7Ð7r   )NN)r£   Útypingr   r   r   r   r   r+   r)   r   r	   rq   r   Ú	roi_headsr   r,   r»   r   r4   r   r|   rº   r@   ÚModulerB   r‡   r†   r   r   r   ú<module>rÛ      s0  ðØ €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à !Ð !Ð !Ð !Ð !Ð !Ø +Ð +Ð +Ð +Ð +Ð +ð „Ôð1˜6ð 1 fð 1ð 1ð 1ñ Ôð1ð „Ôð�vð  %ð ð ð ñ Ôðð +/Ø,0ð:ð :Øð:àð:ð ð:ð �T˜#˜v˜+Ô&Ô'ð	:ð
 ˜˜s C˜xœÔ)ð:ð ˆ6�8˜D  f Ô-Ô.Ð.Ô/ð:ð :ð :ð :ðzGð Gð Gð Gð G˜rœyñ Gô Gð GðT ð °t¸C´yð ÈDÐQTÌIð ÐZ`ð ð ð ð ð$8˜ð 8¨t°C¬yð 8ÀDÈÄIð 8ÐRXð 8ð 8ð 8ð 8ð 8ð 8r   