HEX
Server: Apache
System: Linux bd12.noc223.com 4.18.0-553.121.1.lve.el8.x86_64 #1 SMP Thu Apr 30 16:40:41 UTC 2026 x86_64
User: handcraf (1693)
PHP: 8.1.28
Disabled: NONE
Upload Files
File: //opt/alt/python312/lib64/python3.12/test/__pycache__/test_urlparse.cpython-312.opt-1.pyc
�

~h�e����ddlZddlZddlZddlZdZdZdZdZdgfdgfdgfdd	gfd
dgfdd
gfdd
gfddgfdddgfdddgfdgfdgfdgfddgfddgfddgfd dgfd!d"gfd#d$d%gfd&d'd(gfd)d*gfd+d,gfd-d.gfd/d0gfgZ	difdifdifdddgifd
ddgifdddgifdddgifddd1gifdd2gd3gd�fddd4d5gifdifdifdifdddgifdddgifdddgifd ddgifd!dd6gifd#d7gd8gd"�fd&dd9d:gifd)d;d1gifd+dd<gifd-d=d6gifd/dd>gifgZ
Gd?�d@ej�ZGdA�dBej�Z
GdC�dDej�ZedEk(rej �yy)F�N�http://a/b/c/d;p?q#f�http://a/b/c/d;p?q�http://a/b/c/d��&z&&�=)rrz=a)r�ar	)r	rza=z&a=b�r	�bza=a+b&b=b+c�r	�a b�r�b cza=1&a=2�r	�1�r	�2��&s&&�=)rrs=a)r�ar)rrsa=s&a=b�r�bsa=a+b&b=b+c�r�a b�r�b csa=1&a=2�r�1�r�2�;a=b)�;ar�a=a+b;b=b+c)r	�	a b;b=b c�;a=b)�;ar�a=a+b;b=b+c)r�	a b;b=b crr
rrrrrrrr!r#r%r'r)c�>�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z!d �Z"d!�Z#d"�Z$d#�Z%d$�Z&d%�Z'd&�Z(d'�Z)d(�Z*d)�Z+d*�Z,d+�Z-d,�Z.d-�Z/d.�Z0d/�Z1d0�Z2d1�Z3d2�Z4d3�Z5y4)5�UrlParseTestCasec�
�tjj|�}|j||�|j|j
|j|j|j|jf}|j||�tjj|�}|j||�|j||j��tjj|j��}|j|j�|j��|j||�|j|j|j�|j|j
|j
�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j |j �tjj#|�}|j||�|j|j
|j|j|jf}|j||�tjj%|�}|j||�|j||j��tjj#|j��}|j|j�|j��|j||�|j|j|j�|j|j
|j
�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j |j �y�N)�urllib�parse�urlparse�assertSequenceEqual�scheme�netloc�path�params�query�fragment�
urlunparse�geturl�assertEqual�username�password�hostname�port�urlsplit�
urlunsplit)�self�url�parsed�split�result�t�result2�result3s        �9/opt/alt/python312/lib64/python3.12/test/test_urlparse.py�checkRoundtripsz UrlParseTestCase.checkRoundtripsIs������&�&�s�+��� � ���0�
�]�]�F�M�M�6�;�;�
�]�]�F�L�L�&�/�/�
;��� � ��F�+��,�,�)�)�&�1��� � ��#�.�� � ��&�-�-�/�:��,�,�'�'��
�
��8��������)�6�=�=�?�;�� � ��&�1�������6�=�=�9�������6�=�=�9�������6�;�;�7�������6�=�=�9�������6�<�<�8�����)�)�6�?�?�;�����)�)�6�?�?�;�����)�)�6�?�?�;�����)�)�6�?�?�;�������6�;�;�7����&�&�s�+��� � ���/�
�]�]�F�M�M�6�;�;�
�\�\�6�?�?�
,��� � ��E�*��,�,�)�)�&�1��� � ��#�.�� � ��&�-�-�/�:��,�,�'�'��
�
��8��������)�6�=�=�?�;�� � ��&�1�������6�=�=�9�������6�=�=�9�������6�;�;�7�������6�<�<�8�����)�)�6�?�?�;�����)�)�6�?�?�;�����)�)�6�?�?�;�����)�)�6�?�?�;�������6�;�;�7rc�B�tD]�\}}tjj|d��}|j	||d|z�|D�cgc]}t|d�s�|��}}tjj|d��}|j	||d|z���ycc}w)NT��keep_blank_values�Error parsing %r�F)�parse_qsl_test_casesr.r/�	parse_qslr:�len�rA�orig�expectrE�v�expect_without_blankss      rI�test_qslzUrlParseTestCase.test_qsl|s���0�	7�L�D�&��\�\�+�+�D�D�+�I�F����V�V�-?�$�-F�G�06�$D�1�#�a��d�)�Q�$D�!�$D��\�\�+�+�D�E�+�J�F����V�%:�.��5�
7�	7��%Es�B�Bc�N�tD]�\}}tjj|d��}|j	||d|z�|D�cic]}t||d�r|||��}}tjj|d��}|j	||d|z���ycc}w)NTrLrNrF)�parse_qs_test_casesr.r/�parse_qsr:rRrSs      rI�test_qszUrlParseTestCase.test_qs�s���/�	7�L�D�&��\�\�*�*�4�4�*�H�F����V�V�-?�$�-F�G�.4�%K�)*��F�1�I�a�L�8I�&'��q�	�\�%K�!�%K��\�\�*�*�4�5�*�I�F����V�%:�.��5�
7�
	7��%Ks�B"c��gd�}d�}|D�cgc]
}||���}}||zD]\}}}|j|||��ycc}w)N))zfile:///tmp/junk.txt)�filer�
/tmp/junk.txtrrr)r^rr_rr)zimap://mail.python.org/mbox1)�imap�mail.python.org�/mbox1rrr)r`rarbrr)z1mms://wms.sys.hinet.net/cts/Drama/09006251100.asf)�mms�wms.sys.hinet.net�/cts/Drama/09006251100.asfrrr)rcrdrerr)znfs://server/path/to/file.txt)�nfs�server�/path/to/file.txtrrr)rfrgrhrr)z0svn+ssh://svn.zope.org/repos/main/ZConfig/trunk/)�svn+ssh�svn.zope.org�/repos/main/ZConfig/trunk/rrr)rirjrkrr)z)git+ssh://git@github.com/user/project.git)�git+ssh�git@github.com�/user/project.gitrrr)rlrmrnrr)zEitms-services://?action=download-manifest&url=https://example.com/app)�
itms-servicesrrr�4action=download-manifest&url=https://example.com/appr)rorrrprc�|�|djd�td�|dD��td�|dD��fS)Nr�asciic3�>K�|]}|jd����y�w�rrN��encode��.0�xs  rI�	<genexpr>zDUrlParseTestCase.test_roundtrips.<locals>._encode.<locals>.<genexpr>������:��!�(�(�7�+�:���rOc3�>K�|]}|jd����y�wrtrurws  rIrzzDUrlParseTestCase.test_roundtrips.<locals>._encode.<locals>.<genexpr>�r{r|��rv�tuple�rFs rI�_encodez1UrlParseTestCase.test_roundtrips.<locals>._encode��@���a�D�K�K��(��:�Q�q�T�:�:��:�Q�q�T�:�:�<�
<r�rJ)rA�	str_casesr�ry�bytes_casesrBrCrDs        rI�test_roundtripsz UrlParseTestCase.test_roundtrips�sY���	�>	<�,5�5�a�w�q�z�5��5�"+�k�"9�	5��C���� � ��f�e�4�	5��6s�?c���gd�}d�}|D�cgc]
}||���}}d}d}||f}||f}||fD];\}	}
|	D]1}|
D]*\}}
}||z}|f|
z}
|f|z}|j||
|��,�3�=ycc}w)N))z://www.python.org)�www.python.orgrrrr)r�rrr)z://www.python.org#abc)r�rrr�abc)r�rrr�)z://www.python.org?q=abc)r�rr�q=abcr)r�rr�r)z://www.python.org/#abc)r��/rrr�)r�r�rr�)z://a/b/c/d;p?q#f)r	z/b/c/d�p�q�f)r	z/b/c/d;pr�r�c�|�|djd�td�|dD��td�|dD��fS)Nrrrc3�>K�|]}|jd����y�wrtrurws  rIrzzIUrlParseTestCase.test_http_roundtrips.<locals>._encode.<locals>.<genexpr>�r{r|rOc3�>K�|]}|jd����y�wrtrurws  rIrzzIUrlParseTestCase.test_http_roundtrips.<locals>._encode.<locals>.<genexpr>�r{r|r~rr�s rIr�z6UrlParseTestCase.test_http_roundtrips.<locals>._encode�r�r)�http�https)�http�httpsr�)rAr�r�ryr��str_schemes�
bytes_schemes�	str_tests�bytes_tests�schemes�
test_casesr2rBrCrDs               rI�test_http_roundtripsz%UrlParseTestCase.test_http_roundtrips�s����	�"	<�,5�5�a�w�q�z�5��5�'��+�
���*�	�#�[�0��$-�{�#;�	=��G�Z�!�
=��*4�=�&�C��� �3�,�C�$�Y��/�F�#�I��-�E��(�(��f�e�<�	=�
=�	=��6s�A,c�"�|||f}|jtjj||�|�|D�cgc]}|j	d���c}x}\}}}	|jtjj||�|	�ycc}w)Nrr)r:r.r/�urljoinrv)
rA�base�relurl�expected�str_componentsry�bytes_components�baseb�relurlb�	expectedbs
          rI�	checkJoinzUrlParseTestCase.checkJoin�s������1��������-�-�d�F�;�X�F�7E�8G�23�A�H�H�W�-�8G�	G��4�5�'�9�������-�-�e�W�=�y�I��8Gs�Bc��gd�}|D�cgc]}|jd���}}||zD]�}|jtjj	tjj|��|�|jtjj
tjj|��|���ycc}w)N)�Pythonz./Python�x-newscheme://foo.com/stuffzx://yzx:/yzx:/r�rr)rvr:r.r/r@r?r8r0)rAr�ryr��us     rI�test_unparse_parsez#UrlParseTestCase.test_unparse_parse�s���b�	�2;�<�Q�q�x�x��(�<��<��[�(�	S�A����V�\�\�4�4�V�\�\�5J�5J�1�5M�N�PQ�R����V�\�\�4�4�V�\�\�5J�5J�1�5M�N�PQ�R�	S��=s�Cc��|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtd	d
�|jtdd�|jtd
d�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtd d�|jtd!d"�|jtd#d$�|jtd%d$�|jtd&d�|jtd'd(�|jtd)d*�|jtd+d,�|jtd-d.�|jtd/d0�|jtd1d"�|jtd2d�|jtd3d4�|jtd5d6�y)7N�g:h�g�http://a/b/c/g�./g�g/�http://a/b/c/g/�/g�
http://a/g�//g�http://g�g?y�http://a/b/c/g?y�g?y/./x�http://a/b/c/g?y/./x�#s�http://a/b/c/d;p?q#s�g#s�http://a/b/c/g#s�g#s/./x�http://a/b/c/g#s/./x�g?y#s�http://a/b/c/g?y#s�g;x�http://a/b/c/g;x�g;x?y#s�http://a/b/c/g;x?y#s�.�
http://a/b/c/�./�..�http://a/b/�../�../g�http://a/b/g�../..�	http://a/�../../�../../grr�g.�http://a/b/c/g.�.g�http://a/b/c/.g�g..�http://a/b/c/g..�..g�http://a/b/c/..g�./../g�./g/.�g/./h�http://a/b/c/g/h�g/../h�http://a/b/c/h)r��RFC1808_BASE�rAs rI�test_RFC1808zUrlParseTestCase.test_RFC1808�s�����|�U�E�2����|�S�*:�;����|�U�,<�=����|�T�+<�=����|�T�<�8����|�U�J�7����|�U�,>�?����|�Y�0F�G����|�T�+A�B����|�U�,>�?����|�Y�0F�G����|�W�.B�C����|�U�,>�?����|�Y�0F�G����|�S�/�:����|�T�?�;����|�T�=�9����|�U�M�:����|�V�^�<����|�W�k�:����|�X�{�;����|�Y��=�	
���|�R�)?�@����|�T�+<�=����|�T�+<�=����|�U�,>�?����|�U�,>�?����|�X�~�>����|�W�.?�@����|�W�.@�A����|�X�/?�@rc�b�|jtjjd�d�y)Nzmailto:1337@example.org)�mailtorz1337@example.orgrrr�r:r.r/r0r�s rI�test_RFC2368zUrlParseTestCase.test_RFC2368s&��������.�.�/H�I�>�	@rc�V�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtd	d
�|jtdd�|jtd
d�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd �|jtd!d �|jtd"d�|jtd#t�|jtd$d%�|jtd&d'�|jtd(d)�|jtd*d+�|jtd,d�|jtd-d�|jtd.d/�|jtd0d1�|jtd2d3�|jtd4d5�|jtd6d7�|jtd8d9�|jtd:d;�|jtd<d=�y)>Nr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r��	g;x=1/./y�http://a/b/c/g;x=1/y�
g;x=1/../y�http://a/b/c/yr�r��g?y/../x�http://a/b/c/g?y/../xr�r��g#s/../x�http://a/b/c/g#s/../x)r��RFC2396_BASEr�s rI�test_RFC2396zUrlParseTestCase.test_RFC2396 sJ��	
���|�U�E�2����|�S�*:�;����|�U�,<�=����|�T�+<�=����|�T�<�8����|�U�J�7����|�U�,>�?����|�T�+A�B����|�U�,>�?����|�W�.B�C����|�U�,>�?����|�Y�0F�G����|�S�/�:����|�T�?�;����|�T�=�9����|�U�M�:����|�V�^�<����|�W�k�:����|�X�{�;����|�Y��=����|�R��6����|�T�+<�=����|�T�+<�=����|�U�,>�?����|�U�,>�?����|�X�~�>����|�W�.?�@����|�W�.@�A����|�X�/?�@����|�[�2H�I����|�\�3C�D����|�Y�0F�G����|�Z�1H�I����|�Y�0F�G����|�Z�1H�Irc�@�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtd	d
�|jtdd�|jtd
d�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtd d!�|jtd"d!�|jtd#d$�|jtd%d&�|jtd'd&�|jtd(d�|jtd)d�|jtd)d�|jtd*d�|jtd+d�|jtd,d�|jtd-d.�|jtd/d0�|jtd1d2�|jtd3d4�|jtd5d$�|jtd6d
�|jtd7d8�|jtd9d:�|jtd;d<�|jtd=d>�|jtd?d@�|jtdAdB�|jtdCdD�|jtdEdF�|jtdGd�|jdHdd�y)IN�?yzhttp://a/b/c/d;p?yz;xzhttp://a/b/c/;xr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�r�r�r�r�r�r�r�r�r�r�r�z
../../../gz
../../../../gz/./gz/../gr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��http:gzhttp://a/b/c/de)r��RFC3986_BASEr�s rI�test_RFC3986zUrlParseTestCase.test_RFC3986Ms�����|�T�*>�?����|�T�+<�=����|�U�5�1����|�S�)9�:����|�U�+;�<����|�T�*;�<����|�T�,�7����|�U�:�6����|�T�*>�?����|�U�+=�>����|�T�*@�A����|�U�+=�>����|�W�-A�B����|�T�*;�<����|�U�+=�>����|�Y�/E�F����|�R�(<�=����|�S��9����|�T�/�:����|�T�-�8����|�U�=�9����|�V�N�;����|�W�[�9����|�X�k�:����|�Y�|�<����|�\�<�@�	
���|�\�,�?����|�_�\�B����|�V�L�9����|�W�\�:����|�T�*;�<����|�T�*;�<����|�U�+=�>����|�U�+=�>����|�X�n�=����|�W�->�?����|�W�-?�@����|�X�.>�?����|�[�1G�H����|�\�2B�C����|�Y�/E�F����|�Z�0G�H����|�Y�/E�F����|�Z�0G�H����|�X�.>�?�	
���(�$�/@�Arc�4�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd	�|jtd
d�|jtdd
�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtdd�|jtd d	�|jtd!d"�|jtd#d$�|jtdd�|jtdd�|jtd%d�|jtd&d�|jtd'd�|jd(dd(�|jd)dd�|jd)d*d*�|jd+d,d-�|jd.d,d/�|jd0dd1�|jd2dd3�|jtd4zd5td6z�|jd7d8d9�|jd:d8d;�|jd7d<d=�|jd:d<d=�|jd7d>d?�|jdd8d=�|jd@dAdA�y)BNr�r�r��http:rr�r�r�r�r�r�r�r�r�zhttp://a/b/c/d?yr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�zhttp:?yzhttp:g?yzhttp:g?y/./xzhttp:///rzhttp://a/./gzsvn://pathtorepo/dir1�dir2zsvn://pathtorepo/dir2zsvn+ssh://pathtorepo/dir1zsvn+ssh://pathtorepo/dir2zws://a/bzws://a/gz	wss://a/bz	wss://a/gr��fooz/foozhttp://a/b/c/d/e/z
../../f/g/zhttp://a/b/c/f/g/zhttp://a/b/c/d/ezhttp://a/b/f/g/z/../../f/g/z
http://a/f/g/z	../../f/gzhttp://a/b/c/f/gr	r)r��SIMPLE_BASEr�s rI�
test_urljoinszUrlParseTestCase.test_urljoins�s������{�E�%�0����{�H�-=�>����{�G�,<�=����{�C�(8�9����{�E�*:�;����{�D�):�;����{�D��6����{�E�*�5����{�D�);�<����{�E�*<�=����{�I�.D�E����{�C��8����{�D��9����{�D��7����{�E�-�8����{�F�>�:����{�G�K�8����{�I�l�;����{�H�^�<����{�G�,=�>����{�G�,>�?����{�H�-=�>����{�H�-=�>����{�G�,<�=����{�I�.@�A����{�J�/A�B����{�N�3I�J����z�4�
�3����r�1�2H�I����r�>�>�:����.��8O�P����2�F�<W�X����z�#�j�1����{�3�{�3�	
���{�S�(�%��v�1E�F�	
���*�L�:M�N����)�<�9J�K����*�M�?�K����)�=�/�J����*�K�9K�L����}�l�O�D�	
���s�C��%rc��gd�}d�}|D�cgc]
}||���}}||zD]O\}}}tjj|�}|j|j|j
f||f��Qgd�}|D�cgc]}|j
d���}}||zD]1}	|jttjj|	��3ycc}wcc}w)N))z http://Test.python.org:5432/foo/�test.python.org�8)zhttp://12.34.56.78:5432/foo/�12.34.56.78r)zhttp://[::1]:5432/foo/�::1r)zhttp://[dead:beef::1]:5432/foo/�dead:beef::1r)zhttp://[dead:beef::]:5432/foo/�dead:beef::r)z:http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]:5432/foo/�'dead:beef:cafe:5417:affe:8fa3:deaf:feedr)z http://[::12.34.56.78]:5432/foo/�
::12.34.56.78r)z%http://[::ffff:12.34.56.78]:5432/foo/�::ffff:12.34.56.78r)zhttp://Test.python.org/foo/rN)zhttp://12.34.56.78/foo/rN)zhttp://[::1]/foo/rN)zhttp://[dead:beef::1]/foo/rN)zhttp://[dead:beef::]/foo/rN)z5http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/rN)zhttp://[::12.34.56.78]/foo/rN)z http://[::ffff:12.34.56.78]/foo/r	N)zhttp://Test.python.org:/foo/rN)zhttp://12.34.56.78:/foo/rN)zhttp://[::1]:/foo/rN)zhttp://[dead:beef::1]:/foo/rN)zhttp://[dead:beef::]:/foo/rN)z6http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]:/foo/rN)zhttp://[::12.34.56.78]:/foo/rN)z!http://[::ffff:12.34.56.78]:/foo/r	Nc�Z�|djd�|djd�|dfS)NrrrrOr~rur�s rIr�z.UrlParseTestCase.test_RFC2732.<locals>._encode�s-���Q�4�;�;�w�'��1����W�)=�q��t�C�Cr)zhttp://::12.34.56.78]/zhttp://[::1/foo/zftp://[::1/foo/bad]/badzhttp://[::1/foo/bad]/badzhttp://[::ffff:12.34.56.78rr)	r.r/r0r:r=r>rv�assertRaises�
ValueError)
rAr�r�ryr�rBr=r>�	urlparsed�invalid_urls
          rI�test_RFC2732zUrlParseTestCase.test_RFC2732�s����	�@	D�+4�5�a�w�q�z�5��5�#,�{�#:�	V��C��4����-�-�c�2�I����i�0�0�)�.�.�A�X�t�DT�U�	V�.�	�3<�<�Q�q�x�x��(�<��<�$�{�2�	N�K����j�&�,�,�*?�*?��M�	N��6��=s�C�<Cc��ddddddddtd	d
ftd	dfg
}d�}|D�cgc]
}||���}}||zD]�\}}}tjj	|�}|j|j
�|�|j|||f�|j|j|�|j|j|���ycc}w)
N)zhttp://python.org#frag�http://python.org�frag)rrr)zhttp://python.org/#frag�http://python.org/r)rrr)zhttp://python.org/?q#frag�http://python.org/?qr)rrr)zhttp://python.org/p#fragzhttp://python.org/pr)�http://python.org/p?qrrrr�rc�2�t|�d�|D��S)Nc3�>K�|]}|jd����y�wrtrurws  rIrzzCUrlParseTestCase.test_urldefrag.<locals>._encode.<locals>.<genexpr>�s����8��1�8�8�G�,�8�r|)�typer�s rIr�z0UrlParseTestCase.test_urldefrag.<locals>._encode�s���4��7�8�a�8�8�8r)	r�r�r.r/�	urldefragr:r9rBr7)	rAr�r�ryr�rB�defragrrEs	         rI�test_urldefragzUrlParseTestCase.test_urldefrag�s���C�:�E�<�I�@�G�B�
�/��5�
�/��4�
�	�	9�+4�5�a�w�q�z�5��5�!*�[�!8�	4��C����\�\�+�+�C�0�F����V�]�]�_�c�2����V�f�d�^�4����V�Z�Z��0����V�_�_�d�3�	4��6s�C
c�`�tjjd�}|j|jd�|j|j
d�tjjd�}|j|jd�|j|j
d�y)Nz,http://[FE80::822a:a8ff:fe49:470c%tESt]:1234zfe80::822a:a8ff:fe49:470c%tEStz%[FE80::822a:a8ff:fe49:470c%tESt]:1234s,http://[FE80::822a:a8ff:fe49:470c%tESt]:1234sfe80::822a:a8ff:fe49:470c%tESts%[FE80::822a:a8ff:fe49:470c%tESt]:1234)r.r/r?r:r=r3)rAr�s  rI�test_urlsplit_scoped_IPv6z*UrlParseTestCase.test_urlsplit_scoped_IPv6s����L�L�!�!�"P�Q��������%E�F�������#J�K��L�L�!�!�"Q�R��������%F�G�������#K�Lrc��d}tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|j�dd|dd�d	}tjj|�}|j|jd�|j|j
d
�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd
�|j|jd�|j|jd�|j|j�|�d}tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd
�|j|jd�|j|jd�|j|j�|�d}tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|j�dd|dd�d}tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|j�|�d}tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|jd �|j|jd�|j|jd�|j|jd�|j|j�|�d!}tjj|�}|jtd"�5|jddd�y#1swYyxYw)#NzHTTP://WWW.PYTHON.ORG/doc/#fragr�zWWW.PYTHON.ORG�/doc/rrr���7http://User:Pass@www.python.org:080/doc/?query=yes#frag�User:Pass@www.python.org:080�	query=yes�User�Pass�PzChttp://User@example.com:Pass@www.python.org:080/doc/?query=yes#frag�(User@example.com:Pass@www.python.org:080zUser@example.comsHTTP://WWW.PYTHON.ORG/doc/#fragr�sWWW.PYTHON.ORG�/doc/r�frag�www.python.orgs7http://User:Pass@www.python.org:080/doc/?query=yes#frag�User:Pass@www.python.org:080�	query=yes�User�PasssChttp://User@example.com:Pass@www.python.org:080/doc/?query=yes#frags(User@example.com:Pass@www.python.org:080sUser@example.coms%HTTP://WWW.PYTHON.ORG:65536/doc/#fragzout of range)r.r/r?r:r2r3r4r6r7r;r<r=r>r9�assertRaisesRegexr)rArBr�s   rI�test_urlsplit_attributesz)UrlParseTestCase.test_urlsplit_attributess���/���L�L�!�!�#�&��������6�*�������#3�4��������)�������"�%�������V�,�������T�*�������T�*�������%5�6��������&�	
�������A�B���Q�R��1�G���L�L�!�!�#�&��������6�*�������#A�B��������)�������+�.�������V�,�������V�,�������V�,�������%5�6��������$��������S�)�T���L�L�!�!�#�&��������6�*�������#M�N��������)�������+�.�������V�,�������%7�8�������V�,�������%5�6��������$��������S�)�1���L�L�!�!�#�&��������7�+�������#4�5��������*�������#�&�������W�-�������T�*�������T�*�������%6�7��������&��������A�B���Q�R��1�H���L�L�!�!�#�&��������7�+�������#B�C��������*�������,�/�������W�-�������W�-�������W�-�������%6�7��������$��������S�)�T���L�L�!�!�#�&��������7�+�������#N�O��������*�������,�/�������W�-�������%8�9�������W�-�������%6�7��������$��������S�)�7���L�L�!�!�#�&��
�
#�
#�J��
?�	�
�F�F�	�	�	�s�2
_�_c���d}tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|jd�|j|j�d�d}tjj|�}|j|jd	�|j|j
d
�|j|jd�|j|jd�|j|jd
�|j|jd�|j|jd�|j|jd
�|j|jd�|j|j�d�d}d}td�D]_}tjj||��}|j|jd�|j|j�d��ay)NzQhttp	://www.python
.org	/java
script:	alert('msg
')/?query
=	something#frag
mentr�r�z/javascript:alert('msg')/zquery=somethingr7zGhttp://www.python.org/javascript:alert('msg')/?query=something#fragmentsQhttp	://www.python
.org	/java
script:	alert('msg
')/?query
=	something#frag
mentr�r*s/javascript:alert('msg')/squery=something�fragmentsGhttp://www.python.org/javascript:alert('msg')/?query=something#fragmentzNhttp://www.python.org/java
script:	alert('msg
')/?query
=	something#frag
mentzht
tpr~�r2)r.r/r?r:r2r3r4r6r7r;r<r=r>r9�range)rArBr�r2�_s     rI�!test_urlsplit_remove_unsafe_bytesz2UrlParseTestCase.test_urlsplit_remove_unsafe_bytesls;��k���L�L�!�!�#�&��������6�*�������#3�4�������!<�=�������"3�4�������Z�0�������T�*�������T�*�������%5�6��������&��������%n�o�m���L�L�!�!�#�&��������7�+�������#4�5�������!=�>�������"4�5�������[�1�������T�*�������T�*�������%6�7��������&��������%o�p�f�����q��	t�A����%�%�c�&�%�9�A����Q�X�X�v�.����Q�X�X�Z�)r�s�	trc�	�ttdd��}d}|jd�|z}tjj|�}|j
|jd�|j
|jd�|j
|jd�|j
|jd�|j
|jd	�|j
|jd
�|j
|jd�|j
|jd�|j
|jd
�|j
|j!�|�||j#d�z}tjj|�}|j
|jd�|j
|jd�|j
|jd�|j
|jd�|j
|jd�|j
|jd�|j
|jd�|j
|jd�|j
|jd
�|j
|j!�|j#d��d}tjj|jd�|z�}|j
|jd�|j
|jd�|j
|jd�|j
|jd�|j
|jd�|j
|j!�|�tjjd�}|j
tjj%|�d�d}|jd�dz|jd�z}td�D]_}tjj||��}|j
|jd�|j
|j!�d��ay) Nr�!r!�utf-8r�r"rr#rr$r%r�r&r�r+r(r,r)r-r.r*z)https://www.python.org:88/doc/?query=    r�zwww.python.org:88z
query=    �Xz
www.pypi.org z//www.python.org/r~r3zhttps://www.python.org/)�bytesr4�decoder.r/r?r:r2r3r4r6r7r;r<r=r>r9rvr@)rA�noise�base_urlrBr��query_spaces_urlr2r5s        rI�test_urlsplit_strip_urlz(UrlParseTestCase.test_urlsplit_strip_url�se���e�A�x�(�)��L���l�l�7�#�h�.���L�L�!�!�#�&��������6�*�������#A�B��������)�������+�.�������V�,�������V�,�������V�,�������%5�6��������$��������X�.��h�o�o�g�.�.���L�L�!�!�#�&��������7�+�������#B�C��������*�������,�/�������W�-�������W�-�������W�-�������%6�7��������$��������X�_�_�W�%=�>�G���L�L�!�!�%�,�,�w�"7�:J�"J�K��������7�+�������#6�7��������)�������,�/��������$��������%5�6��L�L�!�!�/�2��	
������0�0��3�_�E�"�����g�&��0�5�<�<��3H�H���q��	D�A����%�%�c�&�%�9�A����Q�X�X�w�/����Q�X�X�Z�)B�C�	Drc
�T�dD�]
}tjjtjjfD]�}dD]�}|j	|||��5d|z}d|zdz}|rM|j�r3|j�r#|j
d�}|j
d�}n
	ddd��t||�}|j|j|�|jt�5|jddd�ddd�������
y#1swY�xYw#1swY��xYw)	z Check handling of invalid ports.�FT)	r�z1.5z-1�0x10z-0�1_1z 1z1 u६)r;r/r>zwww.example.net:zhttp://r�rrN)r.r/r?r0�subTest�isasciirvr:r3rrr>)rAr;r/r>r3rBr�s       rI�test_attributes_bad_portz)UrlParseTestCase.test_attributes_bad_port�s��"�	#�E� �,�,�/�/����1F�1F�G�
#��X�
#�D����E��T��J�#�!3�d�!:��'�&�0�3�6�� �%�~�~�/�D�L�L�N�)/���w�)?��&)�j�j��&9�� (�#�#�"�#�J���(�(����6�:�!�.�.�z�:�#��F�F�#�#�#�
#�
#�	#�#�#��#�#�s+�AD	�49D	�-
D�:D	�D�D	�D'
c	���dD]�}tjjtjjfD]�}dD]�}|j	|||��5|dz}|r,|j�r|j
d�}n
	ddd��K||�}|r|j|jd�n|j|jd�ddd�������y#1swY��xYw)	z"Check handling of invalid schemes.rB)r��+�-�0zhttp&u६http)r;r/r2z://www.example.netrrNrr)	r.r/r?r0rErFrvr:r2)rAr;r/r2rBr�s      rI�test_attributes_bad_schemez+UrlParseTestCase.test_attributes_bad_scheme�s���"�	;�E� �,�,�/�/����1F�1F�G�

;��F�;�F����E��v��N�;�$�';�;�� �"�{�{�}�&)�j�j��&9�� (�
;�;�"�#�J�� � �,�,�Q�X�X�s�;� �,�,�Q�X�X�r�:�;�;�;�

;�	;�;�;�s�+C	�
AC	�C%
c�d�d}tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|j�|�tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|j�|�d}tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|j�|�tjj|�}|j|jd�|j|j
d�|j|jd�|j|jd�|j|jd�|j|j�|�y)Nz0sip:alice@atlanta.com;maddr=239.255.255.1;ttl=15rs0sip:alice@atlanta.com;maddr=239.255.255.1;ttl=15r)r.r/r?r:r3r;r<r=r>r9r0)rA�urir�s   rI�test_attributes_without_netlocz/UrlParseTestCase.test_attributes_without_netloc�sJ��A���L�L�!�!�#�&��������2�&�������T�*�������T�*�������T�*��������&��������S�)��L�L�!�!�#�&��������2�&�������T�*�������T�*�������T�*��������&��������S�)�B���L�L�!�!�#�&��������3�'�������T�*�������T�*�������T�*��������&��������S�)��L�L�!�!�#�&��������3�'�������T�*�������T�*�������T�*��������&��������S�)rc��|jtjjd�d�|jtjjd�d�y)Nz http://example.com?blahblah=/foo)r�zexample.comrrz
blahblah=/foors http://example.com?blahblah=/foo)r�sexample.comrrs
blahblah=/foorr�r�s rI�test_noslashzUrlParseTestCase.test_noslashsJ��������.�.�/Q�R�M�	O�������.�.�/R�S�S�	Urc�8�|jtjjd�d�|jtjjd�d�|jtjjd�d�|jtjjd�d�|jtjjd	�d
�|jtjjd�d�y)
Nr4)rrr4rrrz//www.python.org:80)r�www.python.org:80rrrr�http://www.python.org:80�r�rSrrrr�path)rrrVrrrs//www.python.org:80)r�www.python.org:80rrrr�http://www.python.org:80�r�rWrrrrr�r�s rI�test_withoutschemez#UrlParseTestCase.test_withoutscheme!s���
	
������.�.�v�6�'�	)�������.�.�/D�E�4�	6�������.�.�/I�J�8�	:�	
������.�.�w�7�-�	/�������.�.�/E�F�:�	<�������.�.�/J�K�>�	@rc�l�|jtjjd�d�|jtjjd�d�|jtjjd�d�|jtjjd�d�|jtjjd	�d
�|jtjjd�d�|jtjjd
�d�|jtjjd�d�|jtjjd�d�|jtjjd�d�|jtjjd�d�|jtjjd�d�y)Nzhttp:80)r�r�80rrrzhttps:80)r�rr\rrrzpath:80)r4rr\rrrr�)r�rrrrrzhttps:)r�rrrrrrTrUshttp:80)r�r�80rrrshttps:80)r�rr]rrrspath:80)rVrr]rrrshttp:)r�rrrrrshttps:)r�rrrrrrXrYr�r�s rI�test_portseparatorz#UrlParseTestCase.test_portseparator4s���������.�.�y�9�;T�U�������.�.�z�:�<V�W�������.�.�y�9�;T�U�������.�.�w�7�8O�P�������.�.�x�8�9Q�R�������.�.�/I�J�8�	:�	
������.�.�z�:�<[�\�������.�.�{�;�=]�^�������.�.�z�:�<[�\�������.�.�x�8�9V�W�������.�.�y�9�:X�Y�������.�.�/J�K�>�	@rc�b�|jttjjd�y)Nr�)r�	TypeErrorr.r/�	urlencoder�s rI�
test_usingsyszUrlParseTestCase.test_usingsysFs�����)�V�\�\�%;�%;�U�Crc���|jtjjd�d�|jtjjd�d�|jtjjd�d�|jtjjd�d�|jtjjd	�d
�|jtjjd�d�|jtjjd
�d�|jtjjd�d�y)Nzs3://foo.com/stuff)�s3�foo.com�/stuffrrrr�)�x-newschemererfrrrz*x-newscheme://foo.com/stuff?query#fragment)rgrerfrr6r7z!x-newscheme://foo.com/stuff?query)rgrerfrr6rss3://foo.com/stuff)ss3�foo.com�/stuffrrrsx-newscheme://foo.com/stuff)�x-newschemerhrirrrs*x-newscheme://foo.com/stuff?query#fragment)rjrhrir�queryr2s!x-newscheme://foo.com/stuff?query)rjrhrirrkrr�r�s rI�test_anyschemezUrlParseTestCase.test_anyschemeJs$��������.�.�/C�D�@�	B�������.�.�/L�M�I�	K�������.�.�/[�\�V�	X�������.�.�/R�S�N�	P�	
������.�.�/D�E�F�	H�������.�.�/M�N�O�	Q�������.�.�/\�]�\�	^�������.�.�/S�T�T�	Vrc��tjjtjjfD�]:}|j	|��5|dd�}|j|jd�|dd�}|j|jd�|j|dd�jd�|j|dd�	�jd�|j|d
d�	�jd�|j|d�jd�|j|d
�jd�|j|d
d�jd�ddd���=y#1swY��IxYw)
N)�functionzhttp://example.net/�ftpr�shttp://example.net/sftpr�r4r3rVrr)r.r/r0r?rEr:r2)rA�funcrEs   rI�test_default_schemez$UrlParseTestCase.test_default_scheme_sC���\�\�*�*�F�L�L�,A�,A�B�	@�D����t��,�

@��3�U�;��� � �����7��4�f�=��� � �����8�� � ��f�e�!4�!;�!;�U�C�� � ��f�U�!;�!B�!B�E�J�� � ��g�f�!=�!D�!D�f�M�� � ��f��!4�!4�b�9�� � ��g��!5�!5�s�;�� � ��g�r�!2�!9�!9�3�?�

@�

@�	@�

@�

@�s
�DE4�4E>	c
�J�d}|D�]�\}}}tjjtjjfD�]O}|dk(r|tjjurd}|j	||��5||d��}|j|jd�|jt||�jd|z��|j||dd�jd�||d	��}|j|j|�|jt||�j|��|j||dd	�j|�|j||�j|�ddd���R���y#1swY��axYw)
N)
)z
http:#fragr4r)z//example.net#fragr4r)zindex.html#fragr4r)z	;a=b#fragr5r)z	?a=b#fragr6r)z#fragr4r)z	abc#@fragr4�@frag)z//abc#@fragr4rs)z//abc:80#@fragr4rs)z//abc#@frag:80r4z@frag:80r5r4)rBrnF)�allow_fragmentsr�#T)r.r/r0r?rEr:r7�
assertTrue�getattr�endswith�assertFalse)rA�testsrB�attr�
expected_fragrprEs       rI�test_parse_fragmentsz%UrlParseTestCase.test_parse_fragmentsns���
��).�	H�$�C��}����.�.����0E�0E�F�
H���8�#�����0E�0E�(E�!�D��\�\�c�D�\�9�
H�!�#�u�=�F��$�$�V�_�_�b�9��O�O�#�F�D�1�:�:�3��;N�O�Q��$�$�T�#�r�5�%9�%B�%B�B�G�!�#�t�<�F��$�$�V�_�_�m�D��$�$�#�F�D�1�:�:�=�I�K��$�$�T�#�r�4�%8�%A�%A�%2�4��$�$�T�#�Y�%7�%7��G�
H�
H�
H�	H�
H�
H�s
�;DF�F"c���|jtd�5tjj	dd�ddd�|jtd�5tjj	dd�ddd�|jtd�5tjjdd�ddd�|jtd�5tjjdd�ddd�|jtd�5tjj
d�ddd�|jtd�5tjj
d�ddd�|jtd�5tjjd�ddd�|jtd�5tjjd	�ddd�|jtd�5tjjd
d�ddd�|jtd�5tjjdd
�ddd�y#1swY��>xYw#1swY��xYw#1swY���xYw#1swY���xYw#1swY��wxYw#1swY��FxYw#1swY��xYw#1swY��xYw#1swY��xYw#1swYyxYw)NzCannot mix strr�r�r*r�)r�r�rrrr)r�r*rrrr)r�r�rrr)r�r*rrrrshttp://python.org)	r/r`r.r/r0r?r8r@r�r�s rI�test_mixed_types_rejectedz*UrlParseTestCase.test_mixed_types_rejected�sj���
#�
#�I�/?�
@�	=��L�L�!�!�"2�G�<�	=�
�
#�
#�I�/?�
@�	=��L�L�!�!�"3�V�<�	=�
�
#�
#�I�/?�
@�	=��L�L�!�!�"2�G�<�	=�
�
#�
#�I�/?�
@�	=��L�L�!�!�"3�V�<�	=�
�
#�
#�I�/?�
@�	N��L�L�#�#�$L�M�	N�
�
#�
#�I�/?�
@�	M��L�L�#�#�$K�L�	M�
�
#�
#�I�/?�
@�	J��L�L�#�#�$H�I�	J�
�
#�
#�I�/?�
@�	J��L�L�#�#�$H�I�	J�
�
#�
#�I�/?�
@�	L��L�L� � �!4�6J�K�	L�
�
#�
#�I�/?�
@�	L��L�L� � �!5�7J�K�	L�	L�%	=�	=��	=�	=��	=�	=��	=�	=��	N�	N��	M�	M��	J�	J��	J�	J��	L�	L��	L�	L�sw�!I4�!J�!J�!J� J(� J5� K�
 K�!K�
!K'�4I>�J�J�J%�(J2�5J?�K�K�K$�'K0c��t|j�}|j}|j|j|�d|z}d|z}||�}||�}d}d}	|j||�|j|j
�|�|j|j
�|�|j|j
|�|�|j|j
|�|�|j|j
||	�|�|j|j
||	�|�|j||�|j|j�|�|j|j�|�|j|j|�|�|j|j|�|�|j|j||	�|�|j|j||	�|�y)N)r)rrr�strict)rR�_fields�_encoded_counterpart�assertIs�_decoded_counterpartr:r<rv)
rA�str_type�num_args�
bytes_type�str_args�
bytes_args�
str_result�bytes_result�encoding�errorss
          rI�_check_result_typez#UrlParseTestCase._check_result_type�s����x�'�'�(���2�2�
��
�
�j�5�5�x�@��8�#���h�&�
��x�(�
�!�:�.����������X�.�����,�,�.��9�����,�,�.�
�;�����,�,�X�6��A�����,�,�X�6�
�C�����,�,�X�v�>��I�����,�,�X�v�>�
�K�����z�2�����*�*�,�j�9�����*�*�,�l�;�����*�*�8�4�j�A�����*�*�8�4�l�C�����*�*�8�V�<�j�I�����*�*�8�V�<�l�Krc���tjjtjjtjjg}|D]}|j|��yr-)r.r/�DefragResult�SplitResult�ParseResultr�)rA�result_types�result_types   rI�test_result_pairsz"UrlParseTestCase.test_result_pairs�sQ���,�,�
#�
#�
�,�,�
"�
"�
�,�,�
"�
"�
��
(�	1�K��#�#�K�0�	1rc�"�tjjdd��}|j|ddgi�tjjdd��}|j|ddgi�tjjdd��}|j|dd	gi�tjjd
d��}|j|ddgi�tjjd
dd�
�}|j|ddgi�y)N�	key=Ł%E9�latin-1�r��key�Łé�key=Ł%C3%A9r9rr�Ł���
key=Ł%E9-�Ł�-�ignore�r�r��Ł-)r.r/r[r:�rArEs  rI�test_parse_qs_encodingz'UrlParseTestCase.test_parse_qs_encoding�s�����&�&���&�K������%�,��!8�9����&�&�'9�G�&�L������%�,��!8�9����&�&�'9�G�&�L������%�*>�)?�!@�A����&�&�'7�'�&�J������%�/�):�!;�<����&�&�'7�'�AI�'�K������%�)��!5�6rc��tjjdd��}|j|dg�tjjdd��}|j|dg�tjjdd��}|j|dg�tjjd	d��}|j|d
g�tjjd	dd��}|j|d
g�y)Nr�r�r�)r�r�r�r9rr)r�r�r�)r�r�r�r�)r�r�)r.r/rQr:r�s  rI�test_parse_qsl_encodingz(UrlParseTestCase.test_parse_qsl_encoding�s������'�'��)�'�L������"7�!8�9����'�'�(:�W�'�M������"7�!8�9����'�'�(:�W�'�M������"?�!@�A����'�'�(8�7�'�K������":�!;�<����'�'�(8�7�AI�(�K������"4�!5�6rc�(�|jt�5tjj	djdgdz�d��ddd�tjj	djdgdz�d��y#1swY�>xYw)Nrza=a��
)�max_num_fields)rrr.r/r[�joinr�s rI�test_parse_qsl_max_num_fieldsz.UrlParseTestCase.test_parse_qsl_max_num_fields�su��
�
�
�z�
*�	K��L�L�!�!�#�(�(�E�7�2�:�"6�r�!�J�	K������c�h�h��w�r�z�2�2��F�	K�	K�s�5B�Bc
��difdifdddgifddgdgd	�fd
dddgifd
ifdifdddgifddgdgd�fddddgifg
}|D]�\}}|jd|�d|���5tjj|d��}|j	||d|z�tjj|d
��}|j	||d|z�ddd���y#1swY��xYw)N�;�;;r"r	rr$r
rr
�a=1;a=2rr�;�;;r&rrr(rrr�a=1;a=2rr!�
Original: �, Expected: ��	separatorrN)rEr.r/r[r:)rA�parse_qs_semicolon_casesrTrUrE�result_bytess      rI�test_parse_qs_separatorz(UrlParseTestCase.test_parse_qs_separator�s7��
�"�I�
�2�J�
�c�C�5�\�"�
�5�'���8�9�
��s�C�j�)�*�
�2�J�
�B�K�
�t�d�V�n�%�
�V�H�V�H�=�>�
�$��t��-�.�$
� �5�	R�L�D�&����
�4�(�,�v�j�I�J�
R����.�.�t�s�.�C��� � ���1C�d�1J�K�%�|�|�4�4�T�T�4�J��� � ��v�7I�D�7P�Q�	
R�
R�	R�
R�
R�s
�A/C�C	c��dgfdgfddgfdddgfdd	d
gfdgfdgfd
dgfdddgfdddgfg
}|D]�\}}|jd|�d|���5tjj|d��}|j	||d|z�tjj|d��}|j	||d|z�ddd���y#1swY��xYw)Nr�r�r"r
r$rrr�rrr�r�r&rr(rrr�rr r�r�r�rN)rEr.r/rQr:)rA�parse_qsl_semicolon_casesrTrUrEr�s      rI�test_parse_qsl_separatorz)UrlParseTestCase.test_parse_qsl_separator�s��
�"�I�
�2�J�
�j�\�"�
�\�<�8�9�
��Z�0�1�
�2�J�
�B�K�
�|�n�%�
�n�n�=�>�
�,��5�6�%
�!�6�	R�L�D�&����
�4�(�,�v�j�I�J�
R����/�/���/�D��� � ���1C�d�1J�K�%�|�|�5�5�d�d�5�K��� � ��v�7I�D�7P�Q�	
R�
R�	R�
R�
R�s
�
A/C�C
	c���tjjddgdd�d�}Gd�d�}tjjd|�id�}|j|d	�y)
NrOr~)�r �r
Tc��eZdZd�Zy)�:UrlParseTestCase.test_urlencode_sequences.<locals>.Trivialc��y)N�trivial�r�s rI�__str__zBUrlParseTestCase.test_urlencode_sequences.<locals>.Trivial.__str__s�� rN)�__name__�
__module__�__qualname__r�r�rrI�Trivialr�s��
!rr�r	z	a=trivial)r.r/rar:)rArEr�s   rI�test_urlencode_sequencesz)UrlParseTestCase.test_urlencode_sequencess\�����'�'�q�!�f�9�(E�t�L��	!�	!����'�'��g�i�(8�$�?�������-rc��tjjddi�}|j|d�tjjdditjj��}|j|d�tjjddidtjj��}|j|d	�y)
Nr	z
some valueza=some+valuezsome value/another)�	quote_viaza=some%20value%2Fanotherr�)�safer�za=some%20value/another)r.r/rar:�quoter�s  rI�test_urlencode_quote_viaz)UrlParseTestCase.test_urlencode_quote_via!s������'�'��l�(;�<�������0����'�'��.B�(C�28�,�,�2D�2D�(�F������!;�<����'�'��.B�(C�-0�F�L�L�<N�<N�(�P������!9�:rc��|jttjjd�tjj	d�}|j|d�tjj	d�}|j|d�tjj	ddz�}|j|ddz�tjj	d	d
z�}|j|dd
z�y)Nr�sarchaeological arcanazarchaeological%20arcanarr�Ai'�Asz/ i��zz%01/%20)rr`r.r/�quote_from_bytesr:r�s  rI�test_quote_from_bytesz&UrlParseTestCase.test_quote_from_bytes+s������)�V�\�\�%B�%B�E�J����.�.�/G�H������!:�;����.�.�s�3�������$����.�.�t�F�{�;�������V��,����.�.�z�'�/A�B�������G�!3�4rc���tjjd�}|j|d�tjjd�}|j|d�y)Nz	abc%20defsabc defrr)r.r/�unquote_to_bytesr:r�s  rI�test_unquote_to_bytesz&UrlParseTestCase.test_unquote_to_bytes6sJ�����.�.�{�;�������,����.�.�r�2�������%rc���|jttjjdd��|jttjjdd��y)Nsfoor9r�r�)r�)rr`r.r/r�r�s rI�test_quote_errorsz"UrlParseTestCase.test_quote_errors<sI�����)�V�\�\�%7�%7��#*�	�	,����)�V�\�\�%7�%7����Qrc��tjjd�}|j|jd�|j|j
d�tjjd�}|j|jd�|j|j
d�tjj
d�}|j|jd�|j|j
d�tjj
d�}|j|jd�|j|j
d�y)Nztel:+31-641044153�telz
+31-641044153ztel:+31641044153z+31641044153)r.r/r?r:r2r4r0)rA�p1�p2s   rI�test_issue14072z UrlParseTestCase.test_issue14072As���
�\�\�
"�
"�#6�
7��������E�*�������/�2�
�\�\�
"�
"�#5�
6��������E�*�������.�1�
�\�\�
"�
"�#6�
7��������E�*�������/�2�
�\�\�
"�
"�#5�
6��������E�*�������.�1rc��|jttjjd�|jttjjd�|jttjjd�|jttjjd�|jttjjd�|jttjjd�|jttjjd�|jttjjd�|jttjjd	�|jttjjd
�y)Nz&Scheme://user@[192.0.2.146]/Path?Queryz-Scheme://user@[important.com:8000]/Path?Queryz#Scheme://user@[v123r.IP]/Path?Queryz Scheme://user@[v12ae]/Path?QueryzScheme://user@[v.IP]/Path?Queryz Scheme://user@[v123.]/Path?QueryzScheme://user@[v]/Path?Queryz5Scheme://user@[0439:23af::2309::fae7:1234]/Path?QueryzJScheme://user@[0439:23af:2309::fae7:1234:2342:438e:192.0.2.146]/Path?QueryzScheme://user@]v6a.ip[/Path)rrr.r/r?r�s rI�test_invalid_bracketed_hostsz-UrlParseTestCase.test_invalid_bracketed_hostsPs*�����*�f�l�l�&;�&;�=e�f����*�f�l�l�&;�&;�=l�m����*�f�l�l�&;�&;�=b�c����*�f�l�l�&;�&;�=_�`����*�f�l�l�&;�&;�=^�_����*�f�l�l�&;�&;�=_�`����*�f�l�l�&;�&;�=[�\����*�f�l�l�&;�&;�=t�u����*�f�l�l�&;�&;�>J�	K����*�f�l�l�&;�&;�=Z�[rc��tjjd�}|j|jd�|j|j
d�|j|jd�tjjd�}|j|jd�|j|j
d�|j|jd�tjjd�}|j|jd�|j|j
d�|j|jd�y)	Nz!scheme://user@[v6a.ip]/path?queryzv6a.ip�user�/pathz4scheme://user@[0439:23af:2309::fae7%test]/path?queryz0439:23af:2309::fae7%testzEscheme://user@[0439:23af:2309::fae7:1234:192.0.2.146%test]/path?queryz*0439:23af:2309::fae7:1234:192.0.2.146%test)r.r/r?r:r=r;r4)rAr�r��p3s    rI�test_splitting_bracketed_hostsz/UrlParseTestCase.test_splitting_bracketed_hosts\s���
�\�\�
"�
"�#F�
G��������h�/�������f�-�������'�*�
�\�\�
"�
"�#Y�
Z��������&A�B�������f�-�������'�*�
�\�\�
"�
"�#j�
k��������&R�S�������f�-�������'�*rc�`�d}tjjd�}|jt|�5|j
ddd�tjj
d�}|jt|�5|j
ddd�y#1swY�TxYw#1swYyxYw)Nz3Port could not be cast to integer value as 'oracle'z%http://Server=sde; Service=sde:oracle)r.r/r0r/rr>r?)rA�messager�r�s    rI�!test_port_casting_failure_messagez2UrlParseTestCase.test_port_casting_failure_messagejs���G��
�\�\�
"�
"�#J�
K��
�
#�
#�J��
8�	��G�G�	��\�\�
"�
"�#J�
K��
�
#�
#�J��
8�	��G�G�	�	�		�	��	�	�s�
B�
B$�B!�$B-c��tjjd�}|j|jd�|j|j
d�|j|jd�tjjd�}|j|jd�|j|j
d�|j|jd�tjjd�}|j|jd�|j|j
d	�|j|jd
�tjjd�}|j|jd�|j|j
d�|j|jd
�y)Nz"tel:123-4;phone-context=+1-650-516r�z123-4zphone-context=+1-650-516ztel:+1-201-555-0123z+1-201-555-0123rz"tel:7042;phone-context=example.com�7042zphone-context=example.comz%tel:863-1234;phone-context=+1-914-555z863-1234zphone-context=+1-914-555)r.r/r0r:r2r4r5)rAr�s  rI�test_telurl_paramsz#UrlParseTestCase.test_telurl_paramstsJ��
�\�\�
"�
"�#G�
H��������E�*�������'�*�������$>�?�
�\�\�
"�
"�#8�
9��������E�*�������"3�4�������B�'�
�\�\�
"�
"�#G�
H��������E�*�������&�)�������$?�@�
�\�\�
"�
"�#J�
K��������E�*�������*�-�������$>�?rc��tjjtjj�}|j	dt|��y)N�Quoter)r.r/�_Quoter�_ALWAYS_SAFE�assertIn�repr)rA�quoters  rI�test_Quoter_reprz!UrlParseTestCase.test_Quoter_repr�s2�����%�%�f�l�l�&?�&?�@���
�
�h��V��-rc�@�tjj�yr-)r.r/�clear_cacher�s rI�"test_clear_cache_for_code_coveragez3UrlParseTestCase.test_clear_cache_for_code_coverage�s����� � �"rc��|jt�5tjj}ddd�y#1swYyxYw)z5Test that urllib.parse.__getattr__() fails correctly.N)r�AttributeErrorr.r/�this_does_not_exist)rA�unuseds  rI�!test_urllib_parse_getattr_failurez2UrlParseTestCase.test_urllib_parse_getattr_failure�s4��
�
�
�~�
.�	6��\�\�5�5�F�	6�	6�	6�s	�:�Ac�D�g}hd�}ttj�D]T}|jd�s||vr�t	tj|�}t	|dd�dk(s�D|j|��V|j
tjj|�y)N>�unwrap�splittag�to_bytes�	splitattr�	splithost�	splitport�	splittype�	splituser�
ResultBase�
splitnport�
splitquery�
splitvaluer��splitpasswdr5r�zurllib.parse)�dirr.r/�
startswithrw�append�assertCountEqual�__all__)rAr��undocumented�name�objects     rI�test_allzUrlParseTestCase.test_all�s�����
������%�	&�D����s�#�t�|�';���V�\�\�4�0�F��v�|�T�2�n�D�����%�	&�	
���f�l�l�2�2�H�=rc��d}|D�chc]}djt|����}}ttt	dt
j��D�cgc]L}tj|�r5|ttj|�j��zr||vr|��N}}|jd|�|jd|�tjjd�|jt �5tjjd�ddd�dD]�}d	D]�}|D]�}d
j||j|��}|j#|djt|����5|jt �5tjj|�ddd�ddd�������ycc}wcc}w#1swY��xYw#1swY�.xYw#1swY��xYw)Nz/:#?@z{:04X}�u℀u#uhttp://プ:80uhttp://プ︓80)r�r�ro)znetloc{}false.netloczn{}user@netlocz{}://{}/path)rB�char)�format�ord�map�chrr4�sys�
maxunicode�unicodedata�
decomposition�setrDr�r.r/r?rrrE)rA�
illegal_chars�c�	hex_chars�denorm_charsr2r3rBs        rI�test_urlsplit_normalizationz,UrlParseTestCase.test_urlsplit_normalization�s��� �
�6C�D��X�_�_�S��V�,�D�	�D��3��c�3�>�>� :�;�
���(�(��+��S��!:�!:�1�!=�!C�!C�!E�F�F���&�
�
��
�	
�
�
�h��-��
�
�h��-�	�����6�7�
�
�
�z�
*�	A��L�L�!�!�"?�@�	A�/�	7�F�D�
7��%�7�A�(�/�/���
�
�a�8H�I�C����#�H�O�O�C��F�4K��L�7�!�.�.�z�:�7�"�L�L�1�1�#�6�7�7�7�7�
7�	7��#E��
�	A�	A��7�7��7�7�s<�!G�AG�? G�G1	� G%�8G1	�G"�%G.�*G1	�1G:
N)6r�r�r�rJrXr\r�r�r�r�r�r�r�r�r�rrrr0r6r@rGrLrOrQrZr^rbrlrqr}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr%r�rrIr+r+Gs(��18�f7�7�&5�P$=�LJ�S�"A�`@�
%J�Z7B�r5&�n0N�d4�.M�[�z#t�J9D�v#�&;�$'*�RU�@�&@�$D�V�*
@�H�BL�0L�21�7�7�G�
R�*R�*.�;�	5�&�R�

2�
\�+��@�*.�#�6�
>� 7rr+c�X�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zy)�
Utility_Testsz=Testcase to test the various utility functions in the urllib.c�(�tjj}|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d	�d
�y)Nztype:opaquestring)r�opaquestringr))Nr)�
:opaquestring)Nr*ztype:)rrztype:opaque:string)rz
opaque:string)r.r/�
_splittyper:)rArs  rI�test_splittypezUtility_Tests.test_splittype�s����L�L�+�+�	�����#6�7�9Q�R�����>�2�4J�K�����?�3�5L�M�����7�+�\�:�����#7�8�:S�Trc��tjj}|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d	�d
�|j|d�d�|j|d
�d�|j|d�d�|j|d�d�|j|d�d�y)Nz%//www.example.org:80/foo/bar/baz.html)�www.example.org:80�/foo/bar/baz.htmlz//www.example.org:80)r.rr/)Nr/z//127.0.0.1#@host.com)�	127.0.0.1�/#@host.comz//127.0.0.1#@host.com:80)r0z/#@host.com:80z//127.0.0.1:80#@host.com)z127.0.0.1:80r1z///file)rz/filez//example.net/file;)�example.netz/file;z//example.net/file?)r2z/file?z//example.net/file#)r2z/file#)r.r/�
_splithostr:)rArs  rI�test_splithostzUtility_Tests.test_splithost�s���L�L�+�+�	�����#J�K�D�	F�����#9�:�3�	5�����#6�7�4�	6�	
����#:�;�5�	7�����#=�>�8�	:�����#=�>�8�	:�	
����9�-�&�	(�	
����#8�9�2�	4�����#8�9�2�	4�����#8�9�2�	4rc�(�tjj}|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d	�d
�y)Nr")�	User:Pass�www.python.org:080z@www.python.org:080)rr7r7)Nr7z
User:Pass@)r6rr')zUser@example.com:Passr7)r.r/�
_splituserr:)rArs  rI�test_splituserzUtility_Tests.test_splituser�s����L�L�+�+�	�����#A�B�<�	>�����#8�9�3�	5�����#7�8�5�	7�����<�0�*�	,�����#M�N�H�	Jrc��tjj}|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d	�d
�|j|d�d�|j|d
�d�|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d�d�y)Nzuser:ab)r��abzuser:a
b)r�za
bzuser:a	b)r�za	bzuser:a
b)r�za
bzuser:ab)r�zabzuser:ab)r�zabzuser:a:b)r�za:bzuser:a b)r�r
z	user 2:ab)zuser 2r;z
user+1:a+b)zuser+1za+bzuser:)r�rr�)r�Nz:ab)rr;)r.r/�_splitpasswdr:)rArs  rI�test_splitpasswdzUtility_Tests.test_splitpasswd�s+���l�l�/�/������Y�/��@�����[�1�3C�D�����[�1�3C�D�����[�1�3C�D�����[�1�3C�D�����[�1�3C�D�����Z�0�/�B�����Z�0�/�B�����[�1�3C�D�����\�2�4E�F�����W�-�|�<�����V�,�n�=�����U�+�Z�8rc��tjj}|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d�d	�|j|d
�d�|j|d�d
�|j|d�d�y)N�	parrot:88)�parrot�88r@�r@N�parrot:r0)r0N�
parrot:cheese)rDNz[::1]:88)�[::1]rArE)rENz:88)rrA)r.r/�
_splitportr:)rArs  rI�test_splitportzUtility_Tests.test_splitports����L�L�+�+�	�����;�/�1A�B�����8�,�.>�?�����9�-�/?�@�����;�/�1D�E�����?�3�5L�M�����:�.��@�����7�+�_�=�����5�)�:�6rc� �tjj}|j|d�d�|j|d�d�|j|dd�d�|j|d�d�|j|dd�d�|j|d�d	�|j|dd�d
�|j|d�d�|j|dd�d�|j|d
�d�y)Nr?)r@r:r@)r@����7)r@rJrCr0)r0rI)r0rJrDrBz
parrot: +1_0 )r.r/�_splitnportr:)rArs  rI�test_splitnportzUtility_Tests.test_splitnports����\�\�-�-�
�����K�0�.�A�����H�-�~�>�����H�b�1�>�B�����I�.��?�����I�r�2�N�C�����K�0�2C�D�����K��4�6G�H�����O�4�6F�G�����O�R�8�:J�K�����O�4�6F�Grc��tjj}|j|d�d�|j|d�d�|j|d�d�|j|d�d�y)	N�http://python.org/fake?foo=bar)�http://python.org/fake�foo=barzhttp://python.org/fake?foo=bar?)rNrrO)rONz?foo=bar)rrP)r.r/�_splitqueryr:)rAr	s  rI�test_splitqueryzUtility_Tests.test_splitquery#su���\�\�-�-�
�����$D�E�>�	@�����$E�F�?�	A�����$<�=�9�	;�����J�/��Arc�(�tjj}|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d	�d
�y)N�http://example.com?foo=bar#baz)�http://example.com?foo=bar�bazzhttp://example.com?foo=bar#)rUrz#baz)rrVrU)rUNz"http://example.com?foo=bar#baz#boo)rT�boo)r.r/�	_splittagr:)rArs  rI�
test_splittagzUtility_Tests.test_splittag/s����<�<�)�)������"B�C�>�	@�����"?�@�;�	=�����&�)�;�7�����">�?�=�	?�����"F�G�B�	Drc��tjj}|j|d�dddgf�|j|d�ddgf�|j|d�dddgf�|j|d�dgf�y)Nz/path;attr1=value1;attr2=value2r�zattr1=value1zattr2=value2z/path;rz;attr1=value1;attr2=value2)r.r/�
_splitattrr:)rArs  rI�test_splitattrzUtility_Tests.test_splitattr;s����L�L�+�+�	�����#D�E�!�N�N�#C�D�	F�����8�,�w���o�>�����#?�@��~�~�>�?�	A�����7�+�g�r�]�;rc�(�tjj}|j|d�d�|j|d�d�|j|d�d�|j|d�d�|j|d	�d
�y)NrP)r��barzfoo=)r�rz=bar)rr^�foobar)r_Nzfoo=bar=baz)r�zbar=baz)r.r/�_splitvaluer:)rAr
s  rI�test_splitvaluezUtility_Tests.test_splitvalueDs~���\�\�-�-�
�����I�.��?�����F�+�[�9�����F�+�[�9�����H�-�/?�@�����M�2�4F�Grc���tjjd�}|j|d�|j	t
tjjd�y)Nzhttp://www.python.orguhttp://www.python.org/mediæval)r.r/�	_to_bytesr:r�UnicodeErrorr�s  rI�
test_to_byteszUtility_Tests.test_to_bytesNsH�����'�'�(?�@������!8�9����,����(>�(>�?�	Arc�t�dD]3}tjj|�}|j|d��5y)N)z<URL:scheme://host/path>z<scheme://host/path>zURL:scheme://host/path�scheme://host/pathrg)r.r/r�r:)rA�wrapped_urlrBs   rI�test_unwrapzUtility_Tests.test_unwrapTs9��L�	8�K��,�,�%�%�k�2�C����S�"6�7�	8rN)r�r�r��__doc__r,r4r9r=rGrLrRrYr\rarerir�rrIr'r'�sH��G�U�4�:J�9�$	7�H�
B�
D�<�H�A�8rr'c�T�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zy
)�DeprecationTestc�*�|jt�5}tjj}|j|tjj�ddd�|jdtj��y#1swY�/xYw)NzQuoter will be removed)
�assertWarns�DeprecationWarningr.r/r�r�r�r��str�warning)rA�cm�	old_classs   rI�test_Quoter_deprecationz'DeprecationTest.test_Quoter_deprecation]sh��
�
�
�0�
1�	;�R����+�+�I��M�M�)�V�\�\�%9�%9�:�	;�	
�
�
�.��B�J�J��@�	;�	;�s�AB	�	Bc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzUurllib.parse.splittype() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/rr:rprq�rArrs  rI�test_splittype_deprecationz*DeprecationTest.test_splittype_deprecationc�X��
�
�
�0�
1�	'�R��L�L�"�"�2�&�	'�����R�Z�Z��?�	@�	'�	'��� A$�$A-c���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzUurllib.parse.splithost() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/rr:rprqrvs  rI�test_splithost_deprecationz*DeprecationTest.test_splithost_deprecationjrxryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzUurllib.parse.splituser() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/rr:rprqrvs  rI�test_splituser_deprecationz*DeprecationTest.test_splituser_deprecationqrxryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzWurllib.parse.splitpasswd() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/rr:rprqrvs  rI�test_splitpasswd_deprecationz,DeprecationTest.test_splitpasswd_deprecationxsX��
�
�
�0�
1�	)�R��L�L�$�$�R�(�	)�����R�Z�Z��?�	@�	)�	)�ryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzUurllib.parse.splitport() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/rr:rprqrvs  rI�test_splitport_deprecationz*DeprecationTest.test_splitport_deprecationrxryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzVurllib.parse.splitnport() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/rr:rprqrvs  rI�test_splitnport_deprecationz+DeprecationTest.test_splitnport_deprecation��X��
�
�
�0�
1�	(�R��L�L�#�#�B�'�	(�����R�Z�Z��?�	@�	(�	(�ryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzVurllib.parse.splitquery() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/r	r:rprqrvs  rI�test_splitquery_deprecationz+DeprecationTest.test_splitquery_deprecation�r�ryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzTurllib.parse.splittag() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/rr:rprqrvs  rI�test_splittag_deprecationz)DeprecationTest.test_splittag_deprecation�sX��
�
�
�0�
1�	&�R��L�L�!�!�"�%�	&�����R�Z�Z��?�	@�	&�	&�ryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzUurllib.parse.splitattr() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rnror.r/rr:rprqrvs  rI�test_splitattr_deprecationz*DeprecationTest.test_splitattr_deprecation�rxryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)NrzWurllib.parse.splitvalue() is deprecated as of 3.8, use urllib.parse.parse_qsl() instead)rnror.r/r
r:rprqrvs  rI�test_splitvalue_deprecationz+DeprecationTest.test_splitvalue_deprecation�sY��
�
�
�0�
1�	(�R��L�L�#�#�B�'�	(�����R�Z�Z��@�	A�	(�	(�ryc���|jt�5}tjj	d�ddd�|jt
j�d�y#1swY�/xYw)Nrz/urllib.parse.to_bytes() is deprecated as of 3.8)rnror.r/rr:rprqrvs  rI�test_to_bytes_deprecationz)DeprecationTest.test_to_bytes_deprecation�sV��
�
�
�0�
1�	&�R��L�L�!�!�"�%�	&�����R�Z�Z��J�	L�	&�	&�ryN)r�r�r�rtrwr{r}rr�r�r�r�r�r�r�r�rrIrlrl[sJ��A�@�@�@�@�@�@�@�@�@�A�Lrrl�__main__)rr�unittest�urllib.parser.r�r�r�r�rPrZ�TestCaser+r'rlr��mainr�rrI�<module>r�s���
����%��#��#������H��"�I�	�2�J��8�*��	�I�;���9�+��	�I�;���j�\���\�<�0�1���Z�(�)��"�I�	�2�J�
�B�K�	�J�<��
�[�M��	�K�=��
�[�M���|�n���n�n�5�6��,��-�.��k�]���'�(�)��}�o���*�+�,�1��>��H��"�I�	�2�J��2��t�*��	�B���;���3���+��	�C�"��;���c�C�5�\���5�'���0�1���s�C�j�!�"��"�I�	�2�J�
�B�K�	�C�#��<��
�S�4�&�M��	�D�3�%�=��
�T�C�5�M���t�d�V�n���V�H�V�H�5�6��$��t��%�&��d�S�E�]���S�;�-�(�)��u�t�f�o���d�\�?�+�,�1��6z7�x�(�(�z7�x#U8�H�%�%�U8�pRL�h�'�'�RL�j�z���H�M�M�O�r