§
    öÛgT$  ã                   ó‚  — d Z ddlZdj        Zdd                     d„  edd¦  «        D ¦   «         ¦  «        z   Z ej        d¦  «        Z ej        d	 ej	        e¦  «        ›d
�¦  «        Z
 ej        d	 ej	        edz   ¦  «        ›d
�¦  «        Z ej        d	 ej	        edz   ¦  «        ›d
�¦  «        Z ej        d	 ej	        edz   ¦  «        ›d
�¦  «        Z ej        d	 ej	        edz   ¦  «        ›d
�¦  «        Z ej        d	 ej	        edz   ¦  «        ›d
�¦  «        Z ej        d	 ej	        edz   ¦  «        ›d
�¦  «        Z ej        d	 ej	        edz   ¦  «        ›d
�¦  «        Zi Z ed¦  «        D ]Zd                     e¦  «        Zeee<   eee                     ¦   «         <   eeed                              ¦   «         ed         z   <   eeed         ed                              ¦   «         z   <   Œ€dZ[efd„Zd„ ZddddddœZd„ Zefd„Zefd„Zd„ Zefd„Zd„ Z efd „Z!eefd!„Z"d"„ Z#efd#„Z$d$„ Z%d%Z&dS )&až  
Split, unsplit, parse, serialize, construct and structure resource indicators.

Resource indicators take the form::

  [scheme:[//]][user[:pass]@]host[:port][/[path[/path]*][?param-n1=value[&param-n=value-n]*][#fragment]]

It might be an URL, URI, or IRI. It tries not to care.
Notably, it only percent-encodes chr(0-33) as some RIs support character values
greater than 127. Usually, it's best to make a second pass on the string in
order to target a specific format, URI or IRI.

If a specific format is being targeted, URL or URI or URI-represention of an
IRI, a second pass *must* be made on the string.
# Future versions may include subsequent transformation routines for targeting.

Overview
--------

Where ``x`` is a text RI(ie, ``http://foo.com/path``)::

	unsplit(split(x)) == x
	serialize(parse(x)) == x
	parse(x) == structure(split(x))
	construct(parse(x)) == split(x)


Substructure
------------

In some cases, an RI may have additional structure that needs to be extracted.
To do this, the ``fieldproc`` keyword is used on `split_netloc`, `structure`,
and `parse` functions.

The ``fieldproc`` keyword is a callable that takes a single argument and returns
the processed field. By default, ``fieldproc`` is the `unescape` function which
will decode percent escapes. This is not desirable when substructure exists
within an RI's component as it can create ambiguity about a token when a
percent encoded variant is decoded.
é    Nz%%%0.2Xú%Ú c                 ó,   — g | ]}t          |¦  «        ‘ŒS © )Úchr)Ú.0Úxs     úQ/granary/edev/quantum/lib/python3.11/site-packages/postgresql/resolved/riparse.pyú
<listcomp>r   0   s   € Ð8Ð8Ð8 a�3˜q™6œ6Ð8Ð8Ð8ó    é!   z(%[0-9a-fA-F]{2,2})+ú[ú]z:@/?#z@/?#z/?#z&=#z&#é   z%0.2Xé   z-.+0123456789c                 ó¦  —  t          | ¦  «        d¦  «        }t          | t          ¦  «        rt          }d}t	          | ¦  «        }||k    r…|                      d|¦  «        }|dk    r|| |d…         z  }n[|| ||…         z  }t                               | |dz   |dz   …         ¦  «        }|�| ||¦  «        z  }|dz   }n
|dz  }|dz   }||k    °…|S )z2Substitute percent escapes with literal charactersr   r   r   éÿÿÿÿNr   é   )ÚtypeÚ
isinstanceÚstrr   ÚlenÚfindÚpercent_escapesÚget)r	   ÚmkvalÚnstrÚposÚendÚnewposÚvals          r
   Úunescaper"   G   sò   € à�ˆQ‰Œ�‰Œ€Ýˆq•#ÑÔð Ý
€%Ø€Ý
ˆ1�v„v€Ø
ˆc‚z€zØ�6Š6�#�sÑÔ€&Øˆr‚\€\Øˆ1ˆSˆTˆTŒ7�?€4Øàˆ1ˆS�ˆZŒ=Ñ€4å×Ò˜A˜f Q™h v¨a¡xÐ/Ô0Ñ1Ô1€#Ø€_Øˆ5ˆ5�‰:Œ:Ñ€4Ø	�!‰€3€3àˆ3�;€4Ø	�!‰€3ð ˆc‚z€zð 	€r   c                 ó`   — t          t          |                      d¦  «        ¦  «        ¦  «        S )Nr   )Ú
pct_encodeÚordÚgroup)Úms    r
   Úre_pct_encoder(   _   s    € Ý•3�q—w’w˜q‘z”z‘?”?Ñ#Ô#Ð#r   é   r   é   )ÚschemeÚnetlocÚpathÚqueryÚfragmentc                 ó–  — d}d}d}d}d}t          | ¦  «        }d}|                      d¦  «        }|dk    rA|dz   }| d|…         }|D ]/}	|	t          vr$d|	cxk    rdk    sn d|	cxk    rd	k    sn d}d} nŒ0|}
|                      d
|¦  «        }|dk    rd}n|}
|                      d|¦  «        }|dk    rd}n|�||k     rd}|}
|                      d|¦  «        }|dk    rd}n|�||k     rd}|�
||k     rd}|}
|€|€|}
|
|k    r
| ||
…         }|�| |dz   |p|p|…         }|�| |dz   |p|…         }|�| |dz   |…         }|||||fS )zŒ
	Split an IRI into its base components based on the markers::

		://, /, ?, #

	Return a 5-tuple: (scheme, netloc, path, query, fragment)
	Nr   ú://r   r   ÚAÚZÚaÚzú/ú?ú#r   )r   r   Úscheme_chars)Úsr+   r,   r-   r.   r/   r   r   Ú
scheme_posr	   Úend_of_netlocÚpath_posÚ	query_posÚfragment_poss                 r
   Úsplitr@   j   s	  € ð €Ø
€Ø€Ø	€Ø€å
ˆ1�v„v€Ø€ð �fŠf�U‰mŒm€Ø�"ÒÐØ�Q‰€#Øˆ[ˆjˆ[Œ>€&Øð 
ð 
€aØ•ÐÐØˆqˆˆŠˆ�CŠˆˆˆ #¨ / /¢/ /¨c¢/ / / /Ø
€CØ€FØ	€Eøà€à�FŠF�3˜ÑÔ€Ø�‚N€NØ€(€(à€-à�VŠV�C˜ÑÔ€Ø�‚O€OØ€)€)ØÐ˜) hÒ.Ð.Ø€(Ø€-à—’�s˜CÑ Ô €Ø�BÒÐØ€,€,àÐ˜|¨iÒ7Ð7Ø€9ØÐ˜l¨XÒ5Ð5Ø€8Ø€=ØÐ˜8Ð+Ø€=à�SÒÐØˆS�ÐÔ€&àÐØ	
ˆ8�A‰:�iÐ6 <Ð6°3Ð6Ô	7€$àÐØ
ˆI�a‰K˜Ð+¨Ð+Ô
,€%àÐØˆ|˜A‰~˜cÐ!Ô"€(à	�˜˜u hÐ/Ð/r   c                 óN   ‡— | sdS d                      ˆfd„| D ¦   «         ¦  «        S )z?
	Join a list of paths(strings) on "/" *after* escaping them.
	Nr6   c                 ó<   •— g | ]} ‰j         t          |¦  «        ‘ŒS r   ©Úsubr(   )r   r	   Úres     €r
   r   z unsplit_path.<locals>.<listcomp>¶   s'   ø€ Ð6Ð6Ð6¨q�&�"”&�¨Ñ*Ô*Ð6Ð6Ð6r   ©Újoin)ÚprE   s    `r
   Úunsplit_pathrI   °   s9   ø€ ð 	
ð Ø	ˆØ�ŠÐ6Ð6Ð6Ð6°AÐ6Ñ6Ô6Ñ7Ô7Ð7r   c                 óN   ‡— | €g S ˆfd„|                       d¦  «        D ¦   «         S )zŠ
	Return a list of unescaped strings split on "/".

	Set `fieldproc` to `str` if the components' percent escapes should not be
	decoded.
	Nc                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   ©r   r	   Ú	fieldprocs     €r
   r   zsplit_path.<locals>.<listcomp>Á   s!   ø€ Ð,Ð,Ð,˜!ˆˆ�1‰ŒÐ,Ð,Ð,r   r6   )r@   )rH   rM   s    `r
   Ú
split_pathrN   ¸   s3   ø€ ð €IØ	€)Ø,Ð,Ð,Ð,˜qŸwšw s™|œ|Ð,Ñ,Ô,Ð,r   c                 óð   — d}| d         �|| d         z  }|dz  }| d         �|| d         z  }| d         �|dz  }|| d         z  }| d         �|d	z  }|| d         z  }| d
         �|dz  }|| d
         z  }|S )z"Make a RI from a split RI(5-tuple)r   r   Nr1   r   r)   r6   r   r7   r*   r8   r   ©Útr:   s     r
   ÚunsplitrR   Ã   s£   € à€Ø€a„DÐØ€qˆ„t�)€!Ø€u�*€!Ø€a„DÐØ€qˆ„t�)€!Ø€a„DÐØ€s�(€!Ø€qˆ„t�)€!Ø€a„DÐØ€s�(€!Ø€qˆ„t�)€!Ø€a„DÐØ€s�(€!Ø€qˆ„t�)€!Ø	€r   c                 ó  — |                       d¦  «        }|dk    rd}d}d}ng| d|…         }|                     dd¦  «        }t          |¦  «        dk    r|\  }} ||¦  «        } ||¦  «        }n ||d         ¦  «        }d}|dz  }|t          | ¦  «        k    r||ddfS | |         }|dk    rv|                       d	|¦  «        }|dk    rt          | ¦  «        dz
  }| ||dz   …         }	|dz   }|                       d|¦  «        }|dk    rd}
nr || |dz   d…         ¦  «        }
n[|                       d|¦  «        }|dk    r || |d…         ¦  «        }	d}
n) || ||…         ¦  «        }	 || |dz   d…         ¦  «        }
|||	|
fS )
zœ
	Split a net location into a 4-tuple, (user, password, host, port).

	Set `fieldproc` to `str` if the components' percent escapes should not be
	decoded.
	ú@r   r   Nú:r   r)   r   r   )r   r@   r   )r,   rM   r   ÚuserÚpasswordr:   ÚuserpwÚpos_chrÚnext_posÚaddrÚports              r
   Úsplit_netlocr]   Ö   sÜ  € ð ‡{‚{�3ÑÔ€Øˆ2‚I€Ià	€#Ø	€$Ø€(€(àˆTˆcˆT„l€!Ø�7Š7�3˜‰?Œ?€&Ýˆ�[„[�AÒÐØ�>€4ˆØ
ˆ)�D‰/Œ/€4Øˆi˜Ñ!Ô!€8€8à
ˆ)�F˜1”IÑ
Ô
€4Ø€8Øˆ�(€#à�3ˆv‰;Œ;ÒÐØ
�˜$ Ð	%Ð%à�#Œ;€Øˆs‚N€Nà�[Š[˜˜cÑ"Ô"€(Ø�‚^€^å�&‰kŒk˜A‰o€8Ø	��H˜Q‘J�Ô	€$Ø�1‰€#Ø�[Š[˜˜cÑ"Ô"€(Ø�‚^€^Ø
€4€4à
ˆ)�F˜8 A™:˜;˜;Ô'Ñ
(Ô
(€4€4à�[Š[˜˜cÑ"Ô"€(Ø�‚^€^Ø
ˆ)�F˜3˜4˜4”LÑ
!Ô
!€4Ø
€4€4à
ˆ)�F˜3˜x˜<Ô(Ñ
)Ô
)€4Ø
ˆ)�F˜8 A™:˜;˜;Ô'Ñ
(Ô
(€4à	ˆx˜˜tÐ$Ð$r   c                 óÔ  — | d         €
| d         €dS d}| d         �d|t                                t          | d         ¦  «        z  }| d         �.|dz  }|t                               t          | d         ¦  «        z  }|dz  }| d         �_|t                               t          | d         ¦  «        z  }| d         �.|dz  }|t
                               t          | d         ¦  «        z  }|S )	zFCreate a netloc fragment from the given tuple(user,password,host,port)r   Nr)   r   r   rU   rT   r   )Úescape_user_rerD   r(   Úescape_password_reÚescape_host_reÚescape_port_rerP   s     r
   Úunsplit_netlocrc     sÞ   € à€a„D€L�Q�q”T�\Ø	ˆØ€Ø€a„DÐØ…~×Ò�-¨¨1¬Ñ.Ô.Ñ.€!Ø€q„TÐØˆ�8€1ØÕ×Ò�}¨a°¬dÑ3Ô3Ñ3€1Ø€s�(€!à€a„DÐØ…~×Ò�-¨¨1¬Ñ.Ô.Ñ.€!Ø€q„TÐØˆ�8€1Ø�×Ò�=¨!¨A¬$Ñ/Ô/Ñ/€1à	€r   c                 ó^  ‡— i }| d         �| d         |d<   | d         �ct          | d         ‰¬¦  «        }|d         �|d         |d<   |d         �|d         |d<   |d         �|d         |d	<   |d
         �|d
         |d<   | d         �G| d         r:t          t          ‰| d                              d¦  «        ¦  «        ¦  «        |d<   ng |d<   | d
         �8| d
         r+ˆfd„| d
                              d¦  «        D ¦   «         |d<   ng |d<   | d         � ‰| d         ¦  «        |d<   |S )z‡
	Create a dictionary from a split RI(5-tuple).

	Set `fieldproc` to `str` if the components' percent escapes should not be
	decoded.
	r   Nr+   r   ©rM   rV   rW   r)   Úhostr   r\   r6   r-   c                 ó¤   •— g | ]L}t          t          t          ‰|                     d d¦  «        ¦  «        ¦  «        dgz   dd…         ¦  «        ‘ŒMS )ú=r   Nr)   )ÚtupleÚlistÚmapr@   rL   s     €r
   r   zstructure.<locals>.<listcomp>>  sP   ø€ ÐfÐfÐfÐQR•��S ¨A¯GªG°C¸©O¬OÑ<Ô<Ñ=Ô=ÀÀÑFÈÈÈÔKÑLÔLÐfÐfÐfr   ú&r.   r*   r/   )r]   rj   rk   r@   )rQ   rM   ÚdÚuphps    `  r
   Ú	structurero     sa  ø€ ð €à€a„DÐØ�!”€!€H�+à€a„DÐÝ	�a˜”d¨	Ð	2Ñ	2Ô	2€$Ø	ˆ!„WÐØ�AŒw€1€V�9Ø	ˆ!„WÐØ˜”7€1€Z�=Ø	ˆ!„WÐØ�AŒw€1€V�9Ø	ˆ!„WÐØ�AŒw€1€V�9à€a„DÐØ€q„Tð Ý•C˜	 1 Q¤4§:¢:¨c¡?¤?Ñ3Ô3Ñ4Ô4€1€V�9€9à€1€V�9à€a„DÐØ€q„Tð ØfÐfÐfÐfÐVWÐXYÔVZ×V`ÒV`ÐadÑVeÔVeÐfÑfÔf€1€W�:€:ð €1€W�:à€a„DÐØ�)˜A˜aœD‘/”/€!€J�-Ø	€r   c                 óJ   ‡‡— d                      ˆˆfd„| D ¦   «         ¦  «        S )z1Given a sequence of (key, value) pairs, constructrl   c                 óÆ   •— g | ]]\  }}|d ur9‰                      t          |¦  «        ›d‰                      t          |¦  «        ›�p‰                      t          |¦  «        ‘Œ^S )Nrh   rC   )r   ÚkÚvÚkey_reÚvalue_res      €€r
   r   z#construct_query.<locals>.<listcomp>L  s€   ø€ ð ð ð ñ €aˆð ˆ4€-ð à	‡:‚:�m˜QÑÔÐÐØ‡<‚<•˜qÑ!Ô!Ð!ððð
 	‡*‚*�]˜AÑÔðð ð r   rF   )r	   rt   ru   s    ``r
   Úconstruct_queryrv   G  sI   øø€ ð
 	�Šð ð ð ð ð ð ðñ ô ñ 	ô 	ð r   c           	      ó¾  — |                       d¦  «        }|�d                     d„ |D ¦   «         ¦  «        }|                       d¦  «        }|�t          |¦  «        }|                       d¦  «        }|� t                               t
          |¦  «        }|                       d¦  «        }|                       d¦  «        }|                       d	¦  «        }|                       d
¦  «        }|                       d¦  «        t          |                       d¦  «        |                       d¦  «        |                       d	¦  «        |                       d
¦  «        f¦  «        |||fS )z6Construct a RI tuple(5-tuple) from a dictionary objectr-   Nr6   c                 óN   — g | ]"}t                                t          |¦  «        ‘Œ#S r   )Úescape_path_rerD   r(   )r   Úys     r
   r   zconstruct.<locals>.<listcomp>Z  s(   € Ð@Ð@Ð@¸•×"Ò"¥=°!Ñ4Ô4Ð@Ð@Ð@r   r.   r/   rV   rW   rf   r\   r+   )r   rG   rv   Ú	escape_rerD   r(   rc   )r	   rH   ÚqÚfÚuÚpwÚhr\   s           r
   Ú	constructr�   V  s(  € à‡U‚Uˆ6�]„]€Ø€MØ	‡h‚hÐ@Ð@¸aÐ@Ñ@Ô@ÑAÔA€!Ø‡U‚Uˆ7�^„^€Ø€MÝ�aÑÔ€!Ø‡U‚Uˆ:ÑÔ€Ø€MÝ‡m‚m•M 1Ñ%Ô%€!à‡U‚Uˆ6�]„]€Ø‡e‚eˆJÑÔ€Ø‡U‚Uˆ6�]„]€Ø	�Šˆf‰Œ€ð ‡%‚%ˆ�/„/åØ‡5‚5ˆ�=„=Ø‡5‚5ˆÑÔØ‡5‚5ˆ�=„=Ø‡5‚5ˆ�=„=ð	ñ ô ð €Qˆð
	ð 
r   c                 ó>   — t          t          | ¦  «        |¬¦  «        S )z¤
	Parse an RI into a dictionary object. Synonym for ``structure(split(x))``.

	Set `fieldproc` to `str` if the components' percent escapes should not be
	decoded.
	re   )ro   r@   )r:   rM   s     r
   Úparserƒ   s  s   € õ 	•%˜‘(”(¨	Ð2Ñ2Ô2Ð2r   c                 ó:   — t          t          | ¦  «        ¦  «        S )zLReturn an RI from a dictionary object. Synonym for ``unsplit(construct(x))``)rR   r�   )r	   s    r
   Ú	serializer…   |  s   € å•	˜!‘”ÑÔÐr   ÚreStructuredText)'Ú__doc__rE   Ú__mod__r$   rG   ÚrangeÚ	unescapedÚcompileÚpercent_escapes_reÚescaper{   r_   r`   ra   rb   ry   Úescape_query_key_reÚescape_query_value_rer   r	   rr   Úlowerr9   r   r"   r(   Úindexesr@   rI   rN   rR   r]   rc   ro   rv   r�   rƒ   r…   Ú__docformat__r   r   r
   ú<module>r“      s•  ðð
'ð 'ðP 
€	€	€	àÔ€
Ø�"—'’'Ð8Ð8¨5¨5°°B©<¬<Ð8Ñ8Ô8Ñ9Ô9Ñ9€	à�R”ZÐ 6Ñ7Ô7Ð ØˆBŒJˆJ 	 ¤	¨)Ñ 4Ô 4Ð 4Ð 4Ð6Ñ7Ô7€	Ø�”� Y R¤Y¨y¸7Ñ/BÑ%CÔ%CÐ%CÐ%CÐEÑFÔF€Ø�R”Z�Z¨¨¬°9¸vÑ3EÑ)FÔ)FÐ)FÐ)FÐ HÑIÔIÐ Ø�”� Y R¤Y¨y¸5Ñ/@Ñ%AÔ%AÐ%AÐ%AÐCÑDÔD€Ø�”� Y R¤Y¨y¸5Ñ/@Ñ%AÔ%AÐ%AÐ%AÐCÑDÔD€Ø�”� Y R¤Y¨y¸5Ñ/@Ñ%AÔ%AÐ%AÐ%AÐCÑDÔD€Ø �b”j�j¨)¨"¬)°IÀÑ4EÑ*FÔ*FÐ*FÐ*FÐ!HÑIÔIÐ Ø"˜œ
˜
¨I¨B¬I°iÀ$Ñ6FÑ,GÔ,GÐ,GÐ,GÐ#IÑJÔJÐ à€Ø	ˆˆs‰Œð *ð *€AØ‡_‚_�QÑÔ€Ø€�ÑØ€�—’‘”ÑØ()€��1”—’‘”  !¤Ñ$Ñ%Ø()€��1”˜˜!œŸ
š
™œÑ$Ñ%Ð%à€Øàð ð ð ð ð0$ð $ð $ð ØØ
ØØðð €ðD0ð D0ð D0ðL (ð 8ð 8ð 8ð 8ð 'ð 	-ð 	-ð 	-ð 	-ð
ð 
ð 
ð& &.ð 3%ð 3%ð 3%ð 3%ðj
ð 
ð 
ð( &ð &
ð &
ð &
ð &
ðR Ø!ðð ð ð ðð ð ð: "ð 3ð 3ð 3ð 3ðð ð ð #€€€r   