a
    KcòfêH  ã                   @   sj  d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	 d dl
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 d dlmZ d d	lmZ eeefZG d
d„ dƒZG dd„ deeƒZG dd„ deƒZ G dd„ dƒZ!G dd„ dƒZ"G dd„ de"eƒZ#G dd„ deƒZ$G dd„ deƒZ%G dd„ deƒZ&G dd„ deƒZ'G dd„ deƒZ(G d d!„ d!eƒZ)G d"d#„ d#eƒZ*G d$d%„ d%e"e ƒZ+G d&d'„ d'e"e ƒZ,G d(d)„ d)e"e ƒZ-G d*d+„ d+ƒZ.G d,d-„ d-e.e"eƒZ/G d.d/„ d/e ƒZ0G d0d1„ d1e ƒZ1G d2d3„ d3eƒZ2G d4d5„ d5eƒZ3G d6d7„ d7eƒZ4G d8d9„ d9eƒZ5G d:d;„ d;e"e ƒZ6ej7G d<d=„ d=eeƒƒZ8ej7G d>d?„ d?e"eeƒƒZ9G d@dA„ dAe.e"eƒZ:G dBdC„ dCeƒZ;G dDdE„ dEe ƒZ<G dFdG„ dGeƒZ=G dHdI„ dIeƒZ>G dJdK„ dKeƒZ?G dLdM„ dMe.e"eƒZ@G dNdO„ dOe"e ƒZAG dPdQ„ dQeƒZBG dRdS„ dSe!e ƒZCG dTdU„ dUe!e ƒZDG dVdW„ dWe"e ƒZEG dXdY„ dYe ƒZG dZd[„ d[eCƒZFG d\d]„ d]e"e ƒZGd^S )_é    )ÚDecimal)ÚBaseSpatialFieldÚGeometryField)Ú	AreaFieldÚDistanceField)ÚGEOSGeometry)Ú
FieldError)ÚNotSupportedError)ÚBinaryFieldÚBooleanFieldÚ
FloatFieldÚFuncÚIntegerFieldÚ	TextFieldÚ	TransformÚValue)ÚCast)Úcached_propertyc                       s`   e Zd ZdZdZ‡ fdd„Zedd„ ƒZedd„ ƒZ	d‡ fd	d
„	Z
‡ fdd„Zddd„Z‡  ZS )ÚGeoFuncMixinN)r   c              	      s¾   t ƒ j|i |¤Ž | jD ] }| j| }t|tƒs2qz
|j}W n tyR   d }Y n0 |j}t|t	ƒrr|rˆt|t
ƒsˆtd| j|d f ƒ‚|jsš|sštdƒ‚|st|t
|jd�d�| j|< qd S )Nz9%s function requires a geometric argument in position %d.é   z$SRID is required for all geometries.©Úsrid)Úoutput_field)ÚsuperÚ__init__Úgeom_param_posÚsource_expressionsÚ
isinstancer   r   r   Úvaluer   r   Ú	TypeErrorÚnamer   Ú
ValueError)ÚselfÚexpressionsÚextraÚposÚexprr   Zgeom©Ú	__class__© úc/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/contrib/gis/db/models/functions.pyr      s6    




ÿþýÿÿ
ÿzGeoFuncMixin.__init__c                 C   s   | j jS ©N)r(   Ú__name__©r"   r)   r)   r*   r    9   s    zGeoFuncMixin.namec                 C   s   | j | jd  jS ©Nr   )r   r   Úfieldr-   r)   r)   r*   Ú	geo_field=   s    zGeoFuncMixin.geo_fieldc                    s:   | j d u r |d u r |j | j¡}tƒ j||fd|i|¤ŽS )NÚfunction)r1   ÚopsÚspatial_function_namer    r   Úas_sql)r"   ÚcompilerÚ
connectionr1   Úextra_contextr'   r)   r*   r4   A   s    zGeoFuncMixin.as_sqlc           
         s¶   t ƒ j|i |¤Ž}| js|S | ¡ }| jD ]4}|| }t|tƒs*td| j|d t|ƒj	f ƒ‚q*|j
j}| jdd … D ]:}|j| }|jj}	|	|krvt||ƒj|i |¤Ž|j|< qv|S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   Úresolve_expressionr   Úget_source_fieldsr   r   r   r    Útyper,   r0   r   r   r   r   )
r"   ÚargsÚkwargsÚresZsource_fieldsr%   r/   Z	base_sridr&   Z	expr_sridr'   r)   r*   r8   F   s8    

ýÿÿ	
ÿþþzGeoFuncMixin.resolve_expressionÚ c                 C   s,   t |dƒs(|r(t||ƒs(td||f ƒ‚|S )Nr8   z2The %s parameter has the wrong type: should be %s.)Úhasattrr   r   )r"   r   Ú
param_nameZcheck_typesr)   r)   r*   Ú_handle_paramd   s    
ÿÿzGeoFuncMixin._handle_param)N)r>   N)r,   Ú
__module__Ú__qualname__r1   r   r   Úpropertyr    r   r0   r4   r8   rA   Ú__classcell__r)   r)   r'   r*   r      s   

r   c                   @   s   e Zd ZdS )ÚGeoFuncN©r,   rB   rC   r)   r)   r)   r*   rF   n   s   rF   c                   @   s   e Zd Zedd„ ƒZdS )ÚGeomOutputGeoFuncc                 C   s   t | jjd�S )Nr   )r   r0   r   r-   r)   r)   r*   r   s   s    zGeomOutputGeoFunc.output_fieldN)r,   rB   rC   r   r   r)   r)   r)   r*   rH   r   s   rH   c                   @   s   e Zd ZdZdd„ ZdS )ÚSQLiteDecimalToFloatMixinz›
    By default, Decimal values are converted to str by the SQLite backend, which
    is not acceptable by the GIS functions expecting numeric values.
    c                 K   s4   |   ¡ }| dd„ | ¡ D ƒ¡ |j||fi |¤ŽS )Nc                 S   s4   g | ],}t |d ƒr,t|jtƒr,tt|jƒƒn|‘qS )r   )r?   r   r   r   r   Úfloat)Ú.0r&   r)   r)   r*   Ú
<listcomp>�   s   þÿ
ÿz7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)ÚcopyÚset_source_expressionsÚget_source_expressionsr4   )r"   r5   r6   r7   rM   r)   r)   r*   Ú	as_sqlite~   s    üÿz#SQLiteDecimalToFloatMixin.as_sqliteN)r,   rB   rC   Ú__doc__rP   r)   r)   r)   r*   rI   x   s   rI   c                   @   s   e Zd ZdZdd„ ZdS )ÚOracleToleranceMixingš™™™™™©?c                 K   sP   t |  | j d| j¡dt¡ƒ}|  ¡ }| g |  ¡ ¢|‘¡ |j	||fi |¤ŽS )NÚ	tolerance)
r   rA   r$   ÚgetrS   ÚNUMERIC_TYPESrM   rN   rO   r4   )r"   r5   r6   r7   rS   Úcloner)   r)   r*   Ú	as_oracleŽ   s    ýÿzOracleToleranceMixin.as_oracleN)r,   rB   rC   rS   rW   r)   r)   r)   r*   rR   ‹   s   rR   c                       s4   e Zd ZdZedd„ ƒZ‡ fdd„Zdd„ Z‡  ZS )ÚArear   c                 C   s
   t | jƒS r+   )r   r0   r-   r)   r)   r*   r   ž   s    zArea.output_fieldc                    s2   |j js| j |¡rtdƒ‚tƒ j||fi |¤ŽS )Nz2Area on geodetic coordinate systems not supported.)ÚfeaturesZsupports_area_geodeticr0   Úgeodeticr	   r   r4   ©r"   r5   r6   r7   r'   r)   r*   r4   ¢   s    ÿÿzArea.as_sqlc                 K   s0   | j  |¡rd|d< d|d< | j||fi |¤ŽS )Nz+%(function)s(%(expressions)s, %(spheroid)d)ÚtemplateTÚspheroid)r0   rZ   r4   r[   r)   r)   r*   rP   «   s    zArea.as_sqlite)	r,   rB   rC   Úarityr   r   r4   rP   rE   r)   r)   r'   r*   rX   ›   s
   
	rX   c                   @   s   e Zd Zeƒ ZdZdZdS )ÚAzimuthé   ©r   r   N©r,   rB   rC   r   r   r^   r   r)   r)   r)   r*   r_   ²   s   r_   c                       s0   e Zd Zeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )Ú	AsGeoJSONFé   c                    sj   |g}|d ur"|  |  |dt¡¡ d}|r4|r4d}n|r>d}n|rFd}|rT|  |¡ tƒ j|i |¤Ž d S )NÚ	precisionr   é   r   r`   ©ÚappendrA   Úintr   r   )r"   Ú
expressionZbboxZcrsre   r$   r#   Úoptionsr'   r)   r*   r   »   s    
zAsGeoJSON.__init__c                    s<   |   ¡ }|  ¡ }| |d d… ¡ tt|ƒj||fi |¤ŽS )Nr   )rO   rM   rN   r   rc   r4   )r"   r5   r6   r7   r   rV   r'   r)   r*   rW   Ê   s    zAsGeoJSON.as_oracle)FFrd   )r,   rB   rC   r   r   r   rW   rE   r)   r)   r'   r*   rc   ¸   s   rc   c                       s4   e Zd ZdZeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )	ÚAsGML)r   r`   rd   c                    s:   ||g}|d ur$|  |  |dt¡¡ tƒ j|i |¤Ž d S ©Nre   rg   )r"   rj   Úversionre   r$   r#   r'   r)   r*   r   Õ   s    zAsGML.__init__c                    sX   |   ¡ }|d }|  ¡ }| |d g¡ |jdkr6dnd|d< tt|ƒj||fi |¤ŽS )Nr   r   rf   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr1   )rO   rM   rN   r   r   rl   r4   )r"   r5   r6   r7   r   rn   rV   r'   r)   r*   rW   Û   s    ÿýzAsGML.as_oracle)r`   rd   )	r,   rB   rC   r   r   r   r   rW   rE   r)   r)   r'   r*   rl   Ñ   s   rl   c                       s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsKMLrd   c                    s8   |g}|d ur"|  |  |dt¡¡ tƒ j|i |¤Ž d S rm   rg   ©r"   rj   re   r$   r#   r'   r)   r*   r   ë   s    zAsKML.__init__)rd   ©r,   rB   rC   r   r   r   rE   r)   r)   r'   r*   ro   è   s   ro   c                       s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsSVGFrd   c                    s@   t |dƒr|nt|ƒ}|||  |dt¡g}tƒ j|i |¤Ž d S )Nr8   re   )r?   ri   rA   r   r   )r"   rj   Úrelativere   r$   r#   r'   r)   r*   r   õ   s    ÿýzAsSVG.__init__)Frd   rq   r)   r)   r'   r*   rr   ò   s   rr   c                   @   s   e Zd Zeƒ ZdZdS )ÚAsWKBr   N)r,   rB   rC   r
   r   r^   r)   r)   r)   r*   rt     s   rt   c                   @   s   e Zd Zeƒ ZdZdS )ÚAsWKTr   N)r,   rB   rC   r   r   r^   r)   r)   r)   r*   ru     s   ru   c                       s*   e Zd Zd‡ fdd„	Z‡ fdd„Z‡  ZS )ÚBoundingCircleé0   c                    s   t ƒ j||fi |¤Ž d S r+   )r   r   )r"   rj   Znum_segr$   r'   r)   r*   r     s    zBoundingCircle.__init__c                    s6   |   ¡ }| |  ¡ d g¡ tt|ƒj||fi |¤ŽS r.   )rM   rN   rO   r   rv   rW   ©r"   r5   r6   r7   rV   r'   r)   r*   rW     s    
ÿÿzBoundingCircle.as_oracle)rw   )r,   rB   rC   r   rW   rE   r)   r)   r'   r*   rv     s   rv   c                   @   s   e Zd ZdZdS )ÚCentroidr   N©r,   rB   rC   r^   r)   r)   r)   r*   ry     s   ry   c                   @   s   e Zd ZdZdZdS )Ú
Differencer`   ra   N©r,   rB   rC   r^   r   r)   r)   r)   r*   r{     s   r{   c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚDistanceResultMixinc                 C   s
   t | jƒS r+   )r   r0   r-   r)   r)   r*   r   !  s    z DistanceResultMixin.output_fieldc                 C   s   | j jo| j jdkS )Niæ  )r0   Ú	geographyr   r-   r)   r)   r*   Úsource_is_geography%  s    z'DistanceResultMixin.source_is_geographyN)r,   rB   rC   r   r   r   r)   r)   r)   r*   r}      s   
r}   c                       s>   e Zd ZdZdZd	‡ fdd„	Z‡ fdd„Z‡ fdd„Z‡  ZS )
ÚDistancera   Nc                    s6   ||g}|d ur |   |dt¡| _tƒ j|i |¤Ž d S )Nr]   )rA   Úboolr]   r   r   )r"   Úexpr1Úexpr2r]   r$   r#   r'   r)   r*   r   -  s    zDistance.__init__c                    sÀ   |   ¡ }d }|jd }|  ¡ }|jj|krZt|tƒr>||j_nt|t|jj	|d�ƒ|jd< |s¢| j
 |¡r¢| jr–|j d¡}|j t| j
 |¡ƒ¡ n|j d¡}tt|ƒj||fd|i|¤ŽS )Nr   )r   r~   ZDistanceSpheroidZDistanceSpherer1   )rM   r   r   r   r~   r   r   r   r   r   r0   rZ   r]   r2   r3   rh   r   r€   r4   )r"   r5   r6   r7   rV   r1   rƒ   r~   r'   r)   r*   Úas_postgresql3  s2    


þ
ÿ
ÿÿÿzDistance.as_postgresqlc                    s<   | j  |¡r&d|d< tt| jƒƒ|d< tƒ j||fi |¤ŽS )Nz8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)r\   r]   )r0   rZ   ri   r�   r]   r   r4   r[   r'   r)   r*   rP   R  s    þÿzDistance.as_sqlite)N)	r,   rB   rC   r   r]   r   r„   rP   rE   r)   r)   r'   r*   r€   )  s
   r€   c                   @   s   e Zd ZdZdS )ÚEnveloper   Nrz   r)   r)   r)   r*   r…   \  s   r…   c                   @   s   e Zd ZdZdS )ÚForcePolygonCWr   Nrz   r)   r)   r)   r*   r†   `  s   r†   c                   @   s   e Zd Zedd�ZdZdZdS )ÚFromWKBr   r   r   r)   N©r,   rB   rC   r   r   r^   r   r)   r)   r)   r*   r‡   d  s   
r‡   c                   @   s   e Zd Zedd�ZdZdZdS )ÚFromWKTr   r   r   r)   Nrˆ   r)   r)   r)   r*   r‰   j  s   
r‰   c                       s,   e Zd Zeƒ Zd‡ fdd„	Zdd„ Z‡  ZS )ÚGeoHashNc                    s8   |g}|d ur"|  |  |dt¡¡ tƒ j|i |¤Ž d S rm   rg   rp   r'   r)   r*   r   s  s    zGeoHash.__init__c                 K   s:   |   ¡ }t|jƒdk r&|j tdƒ¡ |j||fi |¤ŽS )Nr`   éd   )rM   Úlenr   rh   r   r4   rx   r)   r)   r*   Úas_mysqly  s    zGeoHash.as_mysql)N)r,   rB   rC   r   r   r   r�   rE   r)   r)   r'   r*   rŠ   p  s   rŠ   c                   @   s"   e Zd Zeƒ ZdZdZdZdZdS )ÚGeometryDistancer`   r>   z <-> ra   N)	r,   rB   rC   r   r   r^   r1   Z
arg_joinerr   r)   r)   r)   r*   rŽ   �  s
   rŽ   c                   @   s   e Zd ZdZdZdS )ÚIntersectionr`   ra   Nr|   r)   r)   r)   r*   r�   ‰  s   r�   c                   @   s   e Zd ZdZeƒ ZdS )ÚIsEmptyZisemptyN)r,   rB   rC   Úlookup_namer   r   r)   r)   r)   r*   r�   Ž  s   r�   c                       s&   e Zd ZdZeƒ Z‡ fdd„Z‡  ZS )ÚIsValidZisvalidc                    s&   t ƒ j||fi |¤Ž\}}d| |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   rW   )r"   r5   r6   r7   ÚsqlÚparamsr'   r)   r*   rW   ™  s    zIsValid.as_oracle)r,   rB   rC   r‘   r   r   rW   rE   r)   r)   r'   r*   r’   ”  s   r’   c                       sB   e Zd Zd
‡ fdd„	Z‡ fdd„Z‡ fdd„Z‡ fdd	„Z‡  ZS )ÚLengthTc                    s   || _ tƒ j|fi |¤Ž d S r+   )r]   r   r   )r"   r‚   r]   r$   r'   r)   r*   r   Ÿ  s    zLength.__init__c                    s2   | j  |¡r|jjstdƒ‚tƒ j||fi |¤ŽS )Nz6This backend doesn't support Length on geodetic fields)r0   rZ   rY   Zsupports_length_geodeticr	   r   r4   r[   r'   r)   r*   r4   £  s    
ÿþÿzLength.as_sqlc                    sž   |   ¡ }d }|  ¡ r(|j t| jƒ¡ nX| j |¡rZ|j 	d¡}|j t| j |¡ƒ¡ n&t
dd„ |  ¡ D ƒƒ}|dkr€|jj}tt|ƒj||fd|i|¤ŽS )NZLengthSpheroidc                 s   s   | ]}|r|j V  qd S r+   ©Údim©rK   Úfr)   r)   r*   Ú	<genexpr>·  ó    z'Length.as_postgresql.<locals>.<genexpr>r`   r1   )rM   r   r   rh   r   r]   r0   rZ   r2   r3   Úminr9   Zlength3dr   r•   r4   )r"   r5   r6   r7   rV   r1   r—   r'   r)   r*   r„   ­  s"    
ÿÿÿzLength.as_postgresqlc                    s8   d }| j  |¡r| jrdnd}tƒ j||fd|i|¤ŽS )NZGeodesicLengthZGreatCircleLengthr1   )r0   rZ   r]   r   r4   )r"   r5   r6   r7   r1   r'   r)   r*   rP   ¾  s    zLength.as_sqlite)T)r,   rB   rC   r   r4   r„   rP   rE   r)   r)   r'   r*   r•   ž  s   
r•   c                   @   s   e Zd Zeƒ ZdZdZdS )ÚLineLocatePointr`   ra   Nrb   r)   r)   r)   r*   r�   Å  s   r�   c                   @   s   e Zd ZdS )Ú	MakeValidNrG   r)   r)   r)   r*   rž   Ë  s   rž   c                   @   s   e Zd Zeƒ ZdZdS )ÚMemSizer   N©r,   rB   rC   r   r   r^   r)   r)   r)   r*   rŸ   Ï  s   rŸ   c                   @   s   e Zd Zeƒ ZdZdS )ÚNumGeometriesr   Nr    r)   r)   r)   r*   r¡   Ô  s   r¡   c                   @   s   e Zd Zeƒ ZdZdS )Ú	NumPointsr   Nr    r)   r)   r)   r*   r¢   Ù  s   r¢   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )Ú	Perimeterr   c                    s`   d }| j  |¡r |  ¡ s tdƒ‚tdd„ |  ¡ D ƒƒ}|dkrF|jj}tƒ j	||fd|i|¤ŽS )Nz<ST_Perimeter cannot use a non-projected non-geography field.c                 s   s   | ]}|j V  qd S r+   r–   r˜   r)   r)   r*   rš   ç  r›   z*Perimeter.as_postgresql.<locals>.<genexpr>r`   r1   )
r0   rZ   r   r	   rœ   r9   r2   Zperimeter3dr   r4   )r"   r5   r6   r7   r1   r—   r'   r)   r*   r„   á  s    ÿzPerimeter.as_postgresqlc                    s*   | j  |¡rtdƒ‚tƒ j||fi |¤ŽS )Nz+Perimeter cannot use a non-projected field.)r0   rZ   r	   r   r4   r[   r'   r)   r*   rP   ì  s    zPerimeter.as_sqlite)r,   rB   rC   r^   r„   rP   rE   r)   r)   r'   r*   r£   Þ  s   r£   c                   @   s   e Zd ZdZdS )ÚPointOnSurfacer   Nrz   r)   r)   r)   r*   r¤   ò  s   r¤   c                   @   s   e Zd ZdZdS )ÚReverser   Nrz   r)   r)   r)   r*   r¥   ö  s   r¥   c                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚScaleç        c                    sP   ||   |dt¡|   |dt¡g}|dkr:| |   |dt¡¡ tƒ j|i |¤Ž d S )NÚxÚyr§   Úz)rA   rU   rh   r   r   )r"   rj   r¨   r©   rª   r$   r#   r'   r)   r*   r   û  s    ýzScale.__init__)r§   ©r,   rB   rC   r   rE   r)   r)   r'   r*   r¦   ú  s   r¦   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú
SnapToGridc                    s”   t |ƒ}|g}|dv r0| ‡ fdd„|D ƒ¡ nN|dkrv|g ‡ fdd„|dd … D ƒ¢‡ fdd„|d	d… D ƒ¢7 }ntd
ƒ‚tƒ j|i |¤Ž d S )N)r   r`   c                    s   g | ]}ˆ   |d t¡‘qS )r>   ©rA   rU   ©rK   Úargr-   r)   r*   rL     r›   z'SnapToGrid.__init__.<locals>.<listcomp>é   c                 3   s   | ]}ˆ   |d t¡V  qdS ©r>   Nr­   r®   r-   r)   r*   rš     r›   z&SnapToGrid.__init__.<locals>.<genexpr>r`   c                 3   s   | ]}ˆ   |d t¡V  qdS r±   r­   r®   r-   r)   r*   rš     r›   r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)rŒ   Úextendr!   r   r   )r"   rj   r;   r$   Únargsr#   r'   r-   r*   r     s    ÿÿþzSnapToGrid.__init__r«   r)   r)   r'   r*   r¬     s   r¬   c                   @   s   e Zd ZdZdZdS )ÚSymDifferencer`   ra   Nr|   r)   r)   r)   r*   r´     s   r´   c                       s   e Zd Z‡ fdd„Z‡  ZS )r   c                    s>   ||   |dt¡g}d|vr(t|d�|d< tƒ j|i |¤Ž d S )Nr   r   r   )rA   ri   r   r   r   )r"   rj   r   r$   r#   r'   r)   r*   r     s    þzTransform.__init__r«   r)   r)   r'   r*   r     s   r   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú	Translatec                    s@   |   ¡ }t| jƒdk r&|j tdƒ¡ tt|ƒj||fi |¤ŽS )Nr°   r   )rM   rŒ   r   rh   r   r   rµ   rP   rx   r'   r)   r*   rP   *  s    zTranslate.as_sqlite)r,   rB   rC   rP   rE   r)   r)   r'   r*   rµ   )  s   rµ   c                   @   s   e Zd ZdZdZdS )ÚUnionr`   ra   Nr|   r)   r)   r)   r*   r¶   2  s   r¶   N)HÚdecimalr   Z#django.contrib.gis.db.models.fieldsr   r   Z django.contrib.gis.db.models.sqlr   r   Zdjango.contrib.gis.geosr   Zdjango.core.exceptionsr   Z	django.dbr	   Zdjango.db.modelsr
   r   r   r   r   r   r   r   Zdjango.db.models.functionsr   Zdjango.utils.functionalr   ri   rJ   rU   r   rF   rH   rI   rR   rX   r_   rc   rl   ro   rr   rt   ru   rv   ry   r{   r}   r€   r…   r†   r‡   r‰   rŠ   rŽ   r�   Zregister_lookupr�   r’   r•   r�   rž   rŸ   r¡   r¢   r£   r¤   r¥   r¦   r¬   r´   rµ   r¶   r)   r)   r)   r*   Ú<module>   sj   (

V
	3	'	