+
    üÐjmu  ã                  ó:  € R t ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^RIH	t	 Rt
Rt. RNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3NR4NR5NR6NR7NtR t ! R	 R
]4      t ! R R]4      t ! R R]4      tR# )8z"
Tests for L{twisted.python.url}.
)Úannotations)ÚIterable)ÚProtocol)ÚSynchronousTestCase©ÚURLú*http://www.foo.com/a/nice/path/?zot=23&zutúhttp://a/b/c/d;p?qc                ó2   € R P                  R V  4       4      # )Ú c              3  óF   "  € T F  pR \        V4      ,          x € K  	  R# 5i)z%%%02XN)Úord)Ú.0Úcs   & Ú>/usr/lib/python3/dist-packages/twisted/python/test/test_url.pyÚ	<genexpr>Ú<lambda>.<locals>.<genexpr>L   s   é € Ð=¹1°a ¬3¨q«6× 1Ò 1»1ùs   ‚!)Újoin)Úss   &r   Ú<lambda>r   L   s   € ˜Ÿ™Ñ=¹1Ó=Ô=ó    c                  ó,   € ] tR t^Ot]R R l4       tRtR# )Ú_HasExceptionc               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚBaseException© )Úformats   "r   Ú__annotate__Ú_HasException.__annotate__Q   s   € ÷ ñ ˜=ñ r   c                	ó   € R # )Nr   ©Úselfs   &r   Ú	exceptionÚ_HasException.exceptionP   s   € ár   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úpropertyr$   Ú__static_attributes__r   r   r   r   r   O   s   † Øôó ôr   r   c                  ó.  € ] tR t^UtRtR R ltR\R R lltR R ltR R	 ltR
 R lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR  R! ltR" R# ltR$ R% ltR& R' ltR( R) ltR* R+ ltR, R- ltR. R/ ltR0 R1 ltR2 R3 ltR4 R5 ltR6 R7 ltR8 R9 lt R: R; lt!R< R= lt"R> R? lt#R@ RA lt$RB RC lt%RD RE lt&RF RG lt'RH RI lt(RJ RK lt)RL RM lt*RN RO lt+RP RQ lt,RR RS lt-RT RU lt.RV RW lt/RX RY lt0RZt1R[# )]ÚTestURLz
Tests for L{URL}.
c               ó    € V ^8„  d   QhRRRR/# ©r   Úur   r   ÚNoner   )r   s   "r   r   ÚTestURL.__annotate__Z   s   € ÷ 8ñ 8 ð 8¨ñ 8r   c                ó<  € V P                  VP                  \        \        V4      4       V P                  VP                  \        \        V4      4       VP
                   F#  pV P                  V\        \        V4      4       K%  	  VP                   FZ  w  r4V P                  V\        \        V4      4       T P                  VRJ ;'       g    \        V\        4      \        V4      4       K\  	  V P                  VP                  \        \        V4      4       R# )zT
The given L{URL}'s components should be L{unicode}.

@param u: The L{URL} to test.
N)
ÚassertIsInstanceÚschemeÚstrÚreprÚhostÚpathÚqueryÚ
assertTrueÚ
isinstanceÚfragment)r#   r0   ÚsegÚkÚvs   &&   r   ÚassertUnicodedÚTestURL.assertUnicodedZ   sÃ   € ð 	×Ñ˜aŸh™h¬¬T°!«WÔ5Ø×Ñ˜aŸf™f¤c¬4°«7Ô3Ø—6”6ˆCØ×!Ñ! #¤s¬D°«GÖ4ñ à—G”G‰DˆAØ×!Ñ! !¤S¬$¨q«'Ô2Ø�O‰O˜A ˜I×;Ð;¬°A´sÓ);¼TÀ!»WÖEñ ð 	×Ñ˜aŸj™j¬#¬t°A«wÖ7r   c               ó<   € V ^8„  d   QhRRRRRRRRRR	R
RRRRRRR/	# )r   r0   r   r5   r6   r8   r9   zIterable[str]r:   z Iterable[tuple[str, str | None]]r=   Úportz
int | NoneÚuserinfor   r1   r   )r   s   "r   r   r2   i   sd   € ÷  +ñ  +àð +ð ð +ð ð	 +ð
 ð +ð 0ð +ð ð +ð ð +ð ð +ð 
ñ +r   c	                ó  € VP                   VP                  VP                  VP                  VP                  VP
                  VP                  3p	W#\        V4      \        V4      WgVP                  3p
V P                  Wš4       R# )aZ  
The given L{URL} should have the given components.

@param u: The actual L{URL} to examine.

@param scheme: The expected scheme.

@param host: The expected host.

@param path: The expected path.

@param query: The expected query.

@param fragment: The expected fragment.

@param port: The expected port.

@param userinfo: The expected userinfo.
N)	r5   r8   r9   r:   r=   rD   rE   ÚtupleÚassertEqual)r#   r0   r5   r8   r9   r:   r=   rD   rE   ÚactualÚexpecteds   &&&&&&&&&  r   Ú	assertURLÚTestURL.assertURLi   s^   € ð< —(‘(˜AŸF™F A§F¡F¨A¯G©G°Q·Z±ZÀÇÁÈÏÉÐTˆØ¤%¨£+¬u°U«|¸XÈQÏZÉZÐXˆØ×Ñ˜Ö*r   c               ó   € V ^8„  d   QhRR/# ©r   r   r1   r   )r   s   "r   r   r2   ‹   s   € ÷ +ñ + 4ñ +r   c           	     ó�   a € R V 3R llpV! \        RR4      4       V! \        RR. . 4      4       V! \        RR. . R4      4       R# )z0
L{URL} should have appropriate default values.
c               ó    € V ^8„  d   QhRRRR/# r/   r   )r   s   "r   r   Ú/TestURL.test_initDefaults.<locals>.__annotate__�   s   € ÷ 	>ñ 	>�Sð 	>˜Tñ 	>r   c           
     óZ   <€ SP                  V 4       SP                  V R R. . R^PR4       R# )Úhttpr   N)rA   rK   )r0   r#   s   &€r   ÚcheckÚ(TestURL.test_initDefaults.<locals>.check�   s+   ø€ Ø×Ñ Ô"Ø�N‰N˜1˜f b¨"¨b°"°b¸"Ö=r   rS   r   Nr   )r#   rT   s   f r   Útest_initDefaultsÚTestURL.test_initDefaults‹   sE   ø€ ÷
	>ð 	>ñ 	Œc�&˜"‹oÔÙŒc�&˜"˜b "Ó%Ô&ÙŒc�&˜"˜b " bÓ)Ö*r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ˜   s   € ÷ 
ñ 
˜4ñ 
r   c           	     óÐ   € \        RRR.R
R.R4      pV P                  V4       V P                  VRRR.R
R.RR4       V P                  \        RRR.R.R	4      RRR.R.R	^P4       R# )z-
L{URL} should accept L{unicode} parameters.
r   ÚhÚpNÚfrS   ô   Ã ô   Ã©u   âŠ¥©r?   r@   )r?   N)u   Î»u   Ï€©r   rA   rK   ©r#   r0   s   & r   Ú	test_initÚTestURL.test_init˜   sƒ   € ô ��S˜3˜% *¨kÐ!:¸CÓ@ˆØ×Ñ˜AÔØ�‰�q˜#˜s S E¨J¸Ð+DÀcÈ4ÔPà�‰Ü�˜  Ð+?Ð*@À(ÓKØØØˆHØ!Ð"ØØö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ª   s   € ÷ 
ñ 
 $ñ 
r   c           	     ó€   € \        RRR.RR.R4      pV P                  V4       V P                  VRRR.RR.RR4       R# )z>
L{URL} should accept (and not interpret) percent characters.
r   z%68z%70Nz%66)ú%6Bz%76)rf   Nr`   ra   s   & r   Útest_initPercentÚTestURL.test_initPercentª   sM   € ô ��U˜U˜G n°mÐ%DÀeÓLˆØ×Ñ˜AÔØ�‰Øˆs�E˜E˜7 ^°]Ð$CÀUÈDö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ´   s   € ÷ 
ñ 
˜4ñ 
r   c                óŽ   € V P                  \        \        RRR.R	R
.RR7      4      RP                  \        R4      4      4       R# )z™
L{URL.__repr__} will display the canonical form of the URL, wrapped in
a L{URL.fromText} invocation, so that it is C{eval}-able but still easy
to read.
rS   ÚfooÚbarNÚfrob)r5   r8   r9   r:   r=   zURL.from_text({})zhttp://foo/bar?baz&k=v#frob)ÚbazNr_   )rH   r7   r   r   r"   s   &r   Ú	test_reprÚTestURL.test_repr´   sN   € ð 	×ÑÜÜØ!ØØ˜Ø(¨*Ð5Ø#ôóð  ×&Ñ&¤tÐ,IÓ'JÓKö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   Ç   s   € ÷ 3ñ 3˜tñ 3r   c                ó‚   € \         P                  ! \        4      pV P                  \        VP	                  4       4       R# )zJ
Round-tripping L{URL.fromText} with C{str} results in an equivalent
URL.
N)r   ÚfromTextÚtheurlrH   ÚasText©r#   Úurlpaths   & r   Útest_fromTextÚTestURL.test_fromTextÇ   s)   € ô
 —,’,œvÓ&ˆØ×Ñœ §¡Ó!1Ö2r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   Ï   s   € ÷ +ñ + ñ +r   c                ó†   € RpV F8  p\         P                  ! V4      P                  4       pV P                  W#4       K:  	  R# )z.
L{URL.asText} should invert L{URL.fromText}.
N)zhttp://localhostúhttp://localhost/zhttp://localhost/foozhttp://localhost/foo/zhttp://localhost/foo!!bar/zhttp://localhost/foo%20bar/zhttp://localhost/foo%2Fbar/zhttp://localhost/foo?nzhttp://localhost/foo?n=vzhttp://localhost/foo?n=/a/bz%http://example.com/foo!@$bar?b!@z=123z$http://localhost/asd?a=asd%20sdf/345z6http://(%2525)/(%2525)?(%2525)&(%2525)=(%2525)#(%2525)z<http://(%C3%A9)/(%C3%A9)?(%C3%A9)&(%C3%A9)=(%C3%A9)#(%C3%A9))r   rs   ru   rH   )r#   ÚtestsÚtestÚresults   &   r   Útest_roundtripÚTestURL.test_roundtripÏ   s:   € ð
ˆó  ˆDÜ—\’\ $Ó'×.Ñ.Ó0ˆFØ×Ñ˜TÖ*ó r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ç   s   € ÷ 
ñ 
˜tñ 
r   c                óÚ   € \         P                  ! \        4      pV P                  V\         P                  ! \        4      4       V P	                  V\         P                  ! R4      4       R# )z–
Two URLs decoded using L{URL.fromText} will be equal (C{==}) if they
decoded same URL string, and unequal (C{!=}) if they decoded different
strings.
z:ftp://www.anotherinvaliddomain.com/foo/bar/baz/?zot=21&zutN)r   rs   rt   rH   ÚassertNotEqualrv   s   & r   Útest_equalityÚTestURL.test_equalityç   sK   € ô —,’,œvÓ&ˆØ×Ñ˜¤#§,¢,¬vÓ"6Ô7Ø×ÑØÜ�LŠLØOóö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ö   s   € ÷ 
ñ 
 tñ 
r   c                óÂ   € V P                  \        RR7      \        4       4       V P                  \        P                  ! R4      \        P                  ! R4      4       R# )zt
An URL created with the empty string for a fragment compares equal
to an URL created with an unspecified fragment.
r   )r=   zhttp://localhost/#r|   N)rH   r   rs   r"   s   &r   Útest_fragmentEqualityÚTestURL.test_fragmentEqualityö   sB   € ð
 	×Ñœ bÔ)¬3«5Ô1Ø×ÑÜ�LŠLÐ-Ó.´·²Ð=PÓ0Qö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2      s   € ÷ 
ñ 
˜Dñ 
r   c                ó²  € \         P                  ! \        4      pV P                  RVP	                  R4      P                  4       4       V P                  RVP	                  R4      P                  4       4       V P                  RVP	                  R4      P                  4       4       V P                  RVP	                  R4      P                  4       4       R	# )
zU
L{URL.child} appends a new path segment, but does not affect the query
or fragment.
z.http://www.foo.com/a/nice/path/gong?zot=23&zutÚgongz1http://www.foo.com/a/nice/path/gong%2F?zot=23&zutzgong/z7http://www.foo.com/a/nice/path/gong%2Fdouble?zot=23&zutzgong/doublez:http://www.foo.com/a/nice/path/gong%2Fdouble%2F?zot=23&zutzgong/double/N)r   rs   rt   rH   Úchildru   rv   s   & r   Ú
test_childÚTestURL.test_child   s°   € ô
 —,’,œvÓ&ˆØ×ÑØ<Ø�M‰M˜&Ó!×(Ñ(Ó*ô	
ð 	×ÑØ?Ø�M‰M˜'Ó"×)Ñ)Ó+ô	
ð 	×ÑØEØ�M‰M˜-Ó(×/Ñ/Ó1ô	
ð 	×ÑØHØ�M‰M˜.Ó)×0Ñ0Ó2ö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2     s   € ÷ 
ñ 
 ñ 
r   c                ó�   € V P                  \        P                  ! R4      P                  RRR4      P	                  4       R4       R# )zO
L{URL.child} receives multiple segments as C{*args} and appends each in
turn.
zhttp://example.com/a/br   ÚdÚezhttp://example.com/a/b/c/d/eN)rH   r   rs   rŽ   ru   r"   s   &r   Útest_multiChildÚTestURL.test_multiChild  s:   € ð
 	×ÑÜ�LŠLÐ1Ó2×8Ñ8¸¸cÀ3ÓG×NÑNÓPØ*ö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   !  s   € ÷ Dñ D Dñ Dr   c                ó²   € \        RR7      P                  R4      pV P                  VP                  4       V P	                  RVP                  4       4       R# )zW
L{URL.child} of a L{URL} without a path produces a L{URL} with a single
path segment.
úwww.foo.com©r8   r   zhttp://www.foo.com/cN)r   rŽ   r;   ÚrootedrH   ru   )r#   ÚchildURLs   & r   Útest_childInitRootÚTestURL.test_childInitRoot!  sA   € ô
 ˜MÔ*×0Ñ0°Ó5ˆØ�‰˜Ÿ™Ô(Ø×ÑÐ/°·±Ó1BÖCr   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   *  s   € ÷ 
ñ 
˜dñ 
r   c                ó&  € \         P                  ! \        4      pV P                  RVP	                  R4      P                  4       4       Rp\         P                  ! V4      pV P                  RVP	                  R4      P                  4       4       R# )zg
L{URL.sibling} of a L{URL} replaces the last path segment, but does not
affect the query or fragment.
z0http://www.foo.com/a/nice/path/sister?zot=23&zutÚsisterz)http://www.foo.com/a/nice/path?zot=23&zutz+http://www.foo.com/a/nice/sister?zot=23&zutN)r   rs   rt   rH   Úsiblingru   )r#   rw   Útheurl2s   &  r   Útest_siblingÚTestURL.test_sibling*  ss   € ô
 —,’,œvÓ&ˆØ×ÑØ>Ø�O‰O˜HÓ%×,Ñ,Ó.ô	
ð
 >ˆÜ—,’,˜wÓ'ˆØ×ÑØ9Ø�O‰O˜HÓ%×,Ñ,Ó.ö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   <  s   € ÷ &
ñ &
˜Dñ &
r   c                ó$  € \         P                  ! \        4      pV P                  RVP	                  R4      P                  4       4       V P                  RVP	                  R4      P                  4       4       V P                  RVP	                  R4      P                  4       4       V P                  RVP	                  R4      P                  4       4       V P                  R	VP	                  R
4      P                  4       4       \         P                  ! R4      pV P                  RVP	                  R4      P                  4       4       \         P                  ! R4      pV P                  VP	                  R4      P                  4       R4       R# )zŽ
L{URL.click} interprets the given string as a relative URI-reference
and returns a new L{URL} interpreting C{self} as the base absolute URI.
r   r   z$http://www.foo.com/a/nice/path/clickÚclickzhttp://www.foo.com/clickz/clickz$http://www.foo.com/a/nice/path/?burpz?burpz//foobarzhttp://www.foo.com/foobarzhttp://www.foo.com/me/noqueryz!http://www.foo.com/me/17?spam=158z/me/17?spam=158zhttp://localhost/foo?abc=defzhttp://www.python.orgN)r   rs   rt   rH   r¨   ru   ÚassertNotIn)r#   rw   r0   s   &  r   Ú
test_clickÚTestURL.test_click<  s?  € ô
 —,’,œvÓ&ˆà×ÑØ8¸'¿-¹-ÈÓ:K×:RÑ:RÓ:Tô	
ð 	×ÑØ2°G·M±MÀ'Ó4J×4QÑ4QÓ4Sô	
ð 	×ÑÐ3°W·]±]À8Ó5L×5SÑ5SÓ5UÔVà×ÑØ2°G·M±MÀ'Ó4J×4QÑ4QÓ4Sô	
ð
 	×ÑØ˜Ÿ™Ð&AÓB×IÑIÓKô	
ô �LŠLÐ8Ó9ˆØ×ÑØ/°·±Ð9JÓ1K×1RÑ1RÓ1Tô	
ô �LŠLÐ7Ó8ˆØ×ÑØ�G‰GÐ+Ó,×3Ñ3Ó5Ð7Nö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   d  s   € ÷ Añ A 4ñ Ar   c                ó¶   € \         P                  ! \        4      p\         F4  w  r#V P	                  VP                  V4      P                  4       V4       K6  	  R# )zA
L{URL.click} should correctly resolve the examples in RFC 3986.
N)r   rs   ÚrelativeLinkBaseForRFC3986ÚrelativeLinkTestsForRFC3986rH   r¨   ru   )r#   ÚbaseÚrefrJ   s   &   r   Útest_clickRFC3986ÚTestURL.test_clickRFC3986d  s@   € ô �|Š|Ô6Ó7ˆß8‰MˆCØ×Ñ˜TŸZ™Z¨›_×3Ñ3Ó5°xÖ@ó 9r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   l  s   € ÷ Eñ E¨ñ Er   c                ó¾   € \         P                  ! \        4      pV P                  \        VP
                  R4       V P                  \        VP
                  R4       R# )z=
L{URL.click} should not accept schemes with relative paths.
zg:hzhttp:hN)r   rs   r®   ÚassertRaisesÚNotImplementedErrorr¨   )r#   r°   s   & r   Útest_clickSchemeRelPathÚTestURL.test_clickSchemeRelPathl  sA   € ô �|Š|Ô6Ó7ˆØ×ÑÔ-¨t¯z©z¸5ÔAØ×ÑÔ-¨t¯z©z¸8ÖDr   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   t  s   € ÷ 5ñ 5 Tñ 5r   c           
     ó6  € \         P                  ! R4      pV P                  VP                  VP                  VP
                  VP                  VP                  VP                  VP                  4      V4       V P                  VP                  4       V4       R# )zN
Verify that L{URL.replace} doesn't change any of the arguments it
is passed.
zhttps://x:1/y?z=1#AN)
r   rs   rH   Úreplacer5   r8   r9   r:   r=   rD   rv   s   & r   Útest_cloneUnchangedÚTestURL.test_cloneUnchangedt  sw   € ô
 —,’,Ð4Ó5ˆØ×ÑØ�O‰OØ—‘Ø—‘Ø—‘Ø—‘Ø× Ñ Ø—‘óð ô
	
ð 	×Ñ˜Ÿ™Ó*¨GÖ4r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ‡  s   € ÷ ñ  Dñ r   c                ó4  € . RO. RO. RO. RO. RO. R	O. R
O. RO. RO. RO. RO. RO. RO.pV Fh  w  r#p\         P                  ! V4      P                  V4      P                  4       pV P	                  VVRP                  V\        V4      VVR7      4       Kj  	  R# )zL
L{URL.click} collapses C{.} and C{..} according to RFC 3986 section
5.2.4.
z1{start}.click({click}) => {actual} not {expected})Ústartr¨   rI   rJ   N)r|   Ú.r|   )r|   ú..r|   )úhttp://localhost/a/b/crÂ   zhttp://localhost/a/b/)rÄ   rÃ   zhttp://localhost/a/)rÄ   z./d/ezhttp://localhost/a/b/d/e)rÄ   ú../d/eúhttp://localhost/a/d/e)rÄ   z/./d/eúhttp://localhost/d/e)rÄ   z/../d/erÇ   )zhttp://localhost/a/b/c/z
../../d/e/zhttp://localhost/a/d/e/)zhttp://localhost/a/./crÅ   rÇ   )zhttp://localhost/a/./c/rÅ   rÆ   )zhttp://localhost/a/b/c/dz./e/../f/../gzhttp://localhost/a/b/c/g)rÄ   zd//ezhttp://localhost/a/b/d//e)r   rs   r¨   ru   rH   r   r7   )r#   r}   rÁ   r¨   rJ   rI   s   &     r   Útest_clickCollapseÚTestURL.test_clickCollapse‡  s�   € ò <Ú<ÚDÚCÚKÚJÚHÚIÚPÚHÚKÚUÚKð
ˆó ',Ñ"ˆE˜(Ü—\’\ %Ó(×.Ñ.¨uÓ5×<Ñ<Ó>ˆFØ×ÑØØØC×JÑJØÜ˜u›+Ø!Ø%ð	 Kó ö	ó ',r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ¨  s   € ÷ "
ñ "
˜tñ "
r   c                óp  € V P                  R\        P                  ! R4      P                  RR4      P	                  4       4       V P                  R\        RR7      P                  RR4      P	                  4       4       \        P                  ! \
        4      pV P                  RVP                  R	4      P	                  4       4       V P                  R
VP                  R	R4      P	                  4       4       V P                  RVP                  R	R4      P                  R4      P	                  4       4       V P                  RVP                  R4      P                  R	R4      P	                  4       4       V P                  RVP                  R	R4      P                  RR4      P	                  4       4       R# )z#
L{URL.add} adds query parameters.
z'http://www.foo.com/a/nice/path/?foo=barzhttp://www.foo.com/a/nice/path/rk   rl   zhttp://www.foo.com/?foo=barr™   rš   z/http://www.foo.com/a/nice/path/?zot=23&zut&burpÚburpz3http://www.foo.com/a/nice/path/?zot=23&zut&burp=xxxÚxxxz8http://www.foo.com/a/nice/path/?zot=23&zut&burp=xxx&zingÚzingz8http://www.foo.com/a/nice/path/?zot=23&zut&zing&burp=xxxz:http://www.foo.com/a/nice/path/?zot=23&zut&burp=xxx&zot=32ÚzotÚ32N)rH   r   rs   Úaddru   rt   rv   s   & r   Útest_queryAddÚTestURL.test_queryAdd¨  sj  € ð 	×ÑØ5Ü�LŠLÐ:Ó;×?Ñ?ÀÀuÓM×TÑTÓVô	
ð 	×ÑØ)Ü�]Ô#×'Ñ'¨¨uÓ5×<Ñ<Ó>ô	
ô —,’,œvÓ&ˆØ×ÑØ=Ø�K‰K˜Ó×&Ñ&Ó(ô	
ð 	×ÑØAØ�K‰K˜ Ó&×-Ñ-Ó/ô	
ð 	×ÑØFØ�K‰K˜ Ó&×*Ñ*¨6Ó2×9Ñ9Ó;ô	
ð
 	×ÑØFØ�K‰K˜Ó×#Ñ# F¨EÓ2×9Ñ9Ó;ô	
ð
 	×ÑØHØ�K‰K˜ Ó&×*Ñ*¨5°$Ó7×>Ñ>Ó@ö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   Ì  s   € ÷ 
ñ 
˜tñ 
r   c                ó˜  € \         P                  ! \        4      pV P                  RVP	                  RR4      P                  4       4       V P                  RVP	                  R4      P	                  RR4      P                  4       4       V P                  RVP                  RR4      P	                  RR4      P                  4       4       R# )	z/
L{URL.set} replaces query parameters by name.
z*http://www.foo.com/a/nice/path/?zot=32&zutrÏ   rÐ   z0http://www.foo.com/a/nice/path/?zot&zut=itworkedÚzutÚitworkedrÍ   N)r   rs   rt   rH   Úsetru   rÑ   rv   s   & r   Útest_querySetÚTestURL.test_querySetÌ  s¦   € ô —,’,œvÓ&ˆØ×ÑØ8Ø�K‰K˜˜tÓ$×+Ñ+Ó-ô	
ð
 	×ÑØ>Ø�K‰K˜Ó×"Ñ" 5¨*Ó5×<Ñ<Ó>ô	
ð 	×ÑØ8Ø�K‰K˜˜uÓ%×)Ñ)¨%°Ó6×=Ñ=Ó?ö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   á  s   € ÷ 
ñ 
 $ñ 
r   c                óœ   € \         P                  ! R4      pV P                  VP                  R4      \         P                  ! R4      4       R# )z;
L{URL.remove} removes all instances of a query parameter.
z*https://example.com/a/b/?foo=1&bar=2&foo=3rk   zhttps://example.com/a/b/?bar=2N)r   rs   rH   Úremove©r#   Úurls   & r   Útest_queryRemoveÚTestURL.test_queryRemoveá  s9   € ô �lŠlÐGÓHˆØ×ÑØ�J‰J�uÓœsŸ|š|Ð,LÓMö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ê  s   € ÷ -ñ -˜Dñ -r   c                óV   € V P                  \        4       P                  4       R4       R# )z7
An empty L{URL} should serialize as the empty string.
r   N)rH   r   ru   r"   s   &r   Ú
test_emptyÚTestURL.test_emptyê  s   € ð 	×Ñœ›Ÿ™›¨Ö,r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ð  s   € ÷ 5ñ 5 Dñ 5r   c                ó`   € \        R.R7      pV P                  VP                  4       R4       R# )z@
An L{URL} with query text should serialize as just query text.
©r:   z?hello=worldN©ÚhelloÚworld)r   rH   ru   ra   s   & r   Útest_justQueryTextÚTestURL.test_justQueryTextð  s(   € ô Ð)Ð*Ô+ˆØ×Ñ˜Ÿ™› ^Ö4r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ÷  s   € ÷ ñ  Tñ r   c                óT   € \         P                  ! R4      pV P                  W4       R# )z"
L{URL} compares equal to itself.
r|   N©r   rs   rH   ra   s   & r   Útest_identicalEqualÚTestURL.test_identicalEqual÷  s!   € ô �LŠLÐ,Ó-ˆØ×Ñ˜Ör   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   þ  s   € ÷ !ñ ! 4ñ !r   c                ó€   € \         P                  ! R4      p\         P                  ! R4      pV P                  W4       R# )z7
URLs with equivalent components should compare equal.
r|   Nrð   ©r#   Úu1Úu2s   &  r   Útest_similarEqualÚTestURL.test_similarEqualþ  s0   € ô �\Š\Ð-Ó.ˆÜ�\Š\Ð-Ó.ˆØ×Ñ˜Ö r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2     s   € ÷ $ñ $¨ñ $r   c                ó¶   € \         P                  ! R4      p\         P                  ! R4      pV P                  W8H  V: RV: 24       V P                  W4       R# )zd
L{URL}s that refer to different resources are both unequal (C{!=}) and
also not equal (not C{==}).
úhttp://localhost/aúhttp://localhost/bú != N)r   rs   ÚassertFalser„   rõ   s   &  r   Útest_differentNotEqualÚTestURL.test_differentNotEqual  sM   € ô
 �\Š\Ð.Ó/ˆÜ�\Š\Ð.Ó/ˆØ×Ñ˜™ b¡V¨4°©vÐ#6Ô7Ø×Ñ˜BÖ#r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2     s   € ÷ )ñ )¨ñ )r   c                óî   € \         P                  ! R4      pV P                  V^*8H  R4       V P                  V\        4       8H  R4       V P	                  V^*4       V P	                  V\        4       4       R# )z-
L{URL} is not equal (C{==}) to other types.
r|   zURL must not equal a number.zURL must not equal an object.N)r   rs   rÿ   Úobjectr„   ra   s   & r   Útest_otherTypesNotEqualÚTestURL.test_otherTypesNotEqual  sa   € ô �LŠLÐ,Ó-ˆØ×Ñ˜˜b™Ð"@ÔAØ×Ñ˜œf›h™Ð(GÔHØ×Ñ˜A˜rÔ"Ø×Ñ˜Aœv›xÖ(r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2     s   € ÷ 5ñ 5¨$ñ 5r   c                óh   € \         P                  ! R4      pV P                  W8g  RV,          4       R# )z:
Identical L{URL}s are not unequal (C{!=}) to each other.
r|   z%r == itselfN©r   rs   rÿ   ra   s   & r   Útest_identicalNotUnequalÚ TestURL.test_identicalNotUnequal  s*   € ô �LŠLÐ,Ó-ˆØ×Ñ˜™ °!Õ!3Ö4r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   !  s   € ÷ 8ñ 8¨ñ 8r   c                ó”   € \         P                  ! R4      p\         P                  ! R4      pV P                  W8g  V: RV: 24       R# )zE
Structurally similar L{URL}s are not unequal (C{!=}) to each other.
r|   ú == Nr	  rõ   s   &  r   Útest_similarNotUnequalÚTestURL.test_similarNotUnequal!  s?   € ô �\Š\Ð-Ó.ˆÜ�\Š\Ð-Ó.ˆØ×Ñ˜™ b¡V¨4°©vÐ#6Ö7r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   )  s   € ÷ 7ñ 7 tñ 7r   c                ó”   € \         P                  ! R4      p\         P                  ! R4      pV P                  W8g  V: RV: 24       R# )zC
Structurally different L{URL}s are unequal (C{!=}) to each other.
rü   rý   r  N)r   rs   r;   rõ   s   &  r   Útest_differentUnequalÚTestURL.test_differentUnequal)  s=   € ô �\Š\Ð.Ó/ˆÜ�\Š\Ð.Ó/ˆØ�‰˜™ R¡F¨$¨r©fÐ"5Ö6r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   1  s   € ÷ Mñ M¨ñ Mr   c                ó–   € \         P                  ! R4      pV P                  V^*8g  R4       V P                  V\        4       8g  R4       R# )z+
L{URL} is unequal (C{!=}) to other types.
r|   zURL must differ from a number.z"URL must be differ from an object.N)r   rs   r;   r  ra   s   & r   Útest_otherTypesUnequalÚTestURL.test_otherTypesUnequal1  s;   € ô �LŠLÐ,Ó-ˆØ�‰˜˜R™Ð!AÔBØ�‰˜œV›X™Ð'KÖLr   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   9  s   € ÷ Vñ V˜Dñ Vr   c                ój  € Rp\         P                  ! V4      pVP                  4       pV P                  VP                  R4       V P                  VP
                  ^ ,          R4       V P                  VP                  4       V4       RpVP                  4       pV P                  WTV: RV: 24       R# )zs
L{URL.asURI} produces an URI which converts any URI unicode encoding
into pure US-ASCII and returns a new L{URL}.
õ   http://Ã©.com/eÌ�?aÌ�=iÌ�#uÌ�u   Ã©.comu   eÌ�ú.http://xn--9ca.com/%C3%A9?%C3%A1=%C3%AD#%C3%BArþ   N)r   rs   ÚasURIrH   r8   r9   ru   )r#   ÚunicodeyÚiriÚuriÚexpectedURIÚ	actualURIs   &     r   Ú
test_asURIÚTestURL.test_asURI9  sœ   € ðBð 	ô �lŠl˜8Ó$ˆØ�i‰i‹kˆØ×Ñ˜Ÿ™Ð#LÔMØ×ÑØ�H‰H�Q�KÐMô	
ð 	×Ñ˜Ÿ™› xÔ0ØFˆØ—J‘J“Lˆ	Ø×Ñ˜°I±=ÀÀ[ÁOÐ1TÖUr   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   P  s   € ÷ Vñ V˜Dñ Vr   c                ój  € Rp\         P                  ! V4      pVP                  4       pV P                  VP                  R4       V P                  VP
                  ^ ,          R4       V P                  VP                  4       V4       RpVP                  4       pV P                  WTV: RV: 24       R# )z„
L{URL.asIRI} decodes any percent-encoded text in the URI, making it
more suitable for reading by humans, and returns a new L{URL}.
r  zxn--9ca.comz%C3%A9u   http://Ã©.com/Ã©?Ã¡=Ã­#Ãºrþ   N)r   rs   ÚasIRIrH   r8   r9   ru   )r#   Úasciiishr   r  ÚexpectedIRIÚ	actualIRIs   &     r   Ú
test_asIRIÚTestURL.test_asIRIP  s—   € ð
 DˆÜ�lŠl˜8Ó$ˆØ�i‰i‹kˆØ×Ñ˜Ÿ™ =Ô1Ø×Ñ˜Ÿ™ !� hÔ/Ø×Ñ˜Ÿ™› xÔ0ð3ð 	ð —J‘J“Lˆ	Ø×Ñ˜°I±=ÀÀ[ÁOÐ1TÖUr   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   e  s   € ÷ Vñ V 4ñ Vr   c                ó¬   € Rp\         P                  ! V4      pVP                  4       pRpVP                  4       pV P	                  WTV: RV: 24       R# )z„
Bad UTF-8 in a path segment, query parameter, or fragment results in
that portion of the URI remaining percent-encoded in the IRI.
z http://xn--9ca.com/%00%FF/%C3%A9u   http://Ã©.com/%00%FF/Ã©rþ   N)r   rs   r'  ru   rH   )r#   ÚurlWithBinaryr   r  r)  r*  s   &     r   Útest_badUTF8AsIRIÚTestURL.test_badUTF8AsIRIe  sT   € ð
 ;ˆÜ�lŠl˜=Ó)ˆØ�i‰i‹kˆð2ð 	ð
 —J‘J“Lˆ	Ø×Ñ˜°I±=ÀÀ[ÁOÐ1TÖUr   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   u  s   € ÷ 5ñ 5 dñ 5r   c                ó–   € Rp\         P                  ! V4      pVP                  4       pV P                  VP	                  4       V4       R# )zD
A L{URL} composed of non-ASCII text will result in non-ASCII text.
r  N)r   rs   r'  rH   ru   )r#   r  r  ÚalsoIRIs   &   r   Útest_alreadyIRIAsIRIÚTestURL.test_alreadyIRIAsIRIu  s?   € ð
Bð 	ô �lŠl˜8Ó$ˆØ—)‘)“+ˆØ×Ñ˜Ÿ™Ó)¨8Ö4r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   „  s   € ÷ 1ñ 1 dñ 1r   c                ó”   € Rp\         P                  ! V4      pVP                  4       P                  4       pV P	                  W14       R# )z8
A L{URL} composed of encoded text will remain encoded.
r  N)r   rs   r  ru   rH   )r#   r!  r   r"  s   &   r   Útest_alreadyURIAsURIÚTestURL.test_alreadyURIAsURI„  s:   € ð GˆÜ�lŠl˜;Ó'ˆØ—I‘I“K×&Ñ&Ó(ˆ	Ø×Ñ˜Ö0r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   �  s   € ÷ 
ñ 
˜tñ 
r   c                óÆ  € \         P                  ! R4      pV P                  VP                  R4      R4       V P                  VP                  R4      R4       V P                  VP                  R4       V P                  VP
                  R4       V P                  VP                  4       R4       V P                  VP                  RR	7      P                  4       R
4       R# )zb
L{URL.fromText} will parse the C{userinfo} portion of the URI
separately from the host and port.
z<http://someuser:somepassword@example.com/some-segment@ignoreTz!someuser:somepassword@example.comFzsomeuser:@example.comzsomeuser:somepasswordÚsomeuserz0http://someuser:@example.com/some-segment@ignore)rE   z/http://someuser@example.com/some-segment@ignoreN)r   rs   rH   Ú	authorityrE   Úuserru   r¼   rÞ   s   & r   Útest_userinfoÚTestURL.test_userinfo�  s¸   € ô
 �lŠlØJó
ˆð 	×Ñ˜Ÿ™ tÓ,Ð.QÔRØ×Ñ˜Ÿ™ uÓ-Ð/FÔGØ×Ñ˜Ÿ™Ð'>Ô?Ø×Ñ˜Ÿ™ :Ô.Ø×ÑØ�J‰J‹LÐLô	
ð 	×ÑØ�K‰K ˆKÓ,×3Ñ3Ó5Ø=ö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ¡  s   € ÷ Kñ K˜tñ Kr   c                óª   € \         P                  ! R4      pV P                  VP                  R4       V P                  VP	                  4       R4       R# )z9
L{URL.fromText} parses custom port numbers as integers.
zhttp://www.example.com:8080/i�  N)r   rs   rH   rD   ru   )r#   ÚportURLs   & r   Útest_portTextÚTestURL.test_portText¡  s?   € ô —,’,Ð=Ó>ˆØ×Ñ˜Ÿ™ tÔ,Ø×Ñ˜Ÿ™Ó)Ð+IÖJr   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ©  s   € ÷ 	
ñ 	
˜Tñ 	
r   c                ón   € V P                  \        P                  ! R4      P                  4       R4       R# )zé
Although L{URL} instances are mainly for dealing with HTTP, other
schemes (such as C{mailto:}) should work as well.  For example,
L{URL.fromText}/L{URL.asText} round-trips cleanly for a C{mailto:} URL
representing an email address.
zmailto:user@example.comN)rH   r   rs   ru   r"   s   &r   Útest_mailtoÚTestURL.test_mailto©  s+   € ð 	×ÑÜ�LŠLÐ2Ó3×:Ñ:Ó<Ð>Wö	
r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ´  s   € ÷ :ñ : Dñ :r   c                ó\   € \        RR..R7      pV P                  VP                  R4       R# )zt
When a L{URL} is created with a C{query} argument, the C{query}
argument is converted into an N-tuple of 2-tuples.
ÚalphaÚbetarè   N))rM  rN  )r   rH   r:   rÞ   s   & r   Útest_queryIterableÚTestURL.test_queryIterable´  s+   € ô ˜' 6Ð*Ð+Ô,ˆØ×Ñ˜Ÿ™Ð$8Ö9r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   ½  s   € ÷ 7ñ 7 4ñ 7r   c                óZ   € \        RR.R7      pV P                  VP                  R4       R# )zZ
When a L{URL} is created with a C{path} argument, the C{path} is
converted into a tuple.
rê   rë   ©r9   Nré   )r   rH   r9   rÞ   s   & r   Útest_pathIterableÚTestURL.test_pathIterable½  s(   € ô
 ˜ Ð)Ô*ˆØ×Ñ˜Ÿ™Ð#5Ö6r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2   Å  s   € ÷ OAñ OA tñ OAr   c                óÞ  a aa€  ! R R4      o\         \        J d   RMRpR V 3R lloV3R VVV 3R lllpV! R	4       V! R
4       V! R4       V! RR4       V! R4       V! RR4       S P                  \        4      ;_uu_ 4       p\	        S! 4       .R7       RRR4       S! XVR4       S P                  \        4      ;_uu_ 4       p\	        RS! 4       3.R7       RRR4       S! W1R,           R4       S P                  \        4      ;_uu_ 4       p\	        S! 4       R3.R7       RRR4       S! W1R4       S P                  \        4      ;_uu_ 4        \	        S! 4       .R7       RRR4       S P                  \
        4      ;_uu_ 4        \	        R.R7       RRR4       S P                  \
        4      ;_uu_ 4        \	        R.R7       RRR4       \        P                  ! R4      pS P                  \        4      ;_uu_ 4       pVP                  S! 4       4       RRR4       S! W1R4       S P                  \        4      ;_uu_ 4       pVP                  S! 4       4       RRR4       S! W1R4       S P                  \        4      ;_uu_ 4       pVP                  S! 4       4       RRR4       S! W1R4       R#   + '       g   i     EL-; i  + '       g   i     ELý; i  + '       g   i     ELÇ; i  + '       g   i     ELš; i  + '       g   i     EL{; i  + '       g   i     EL\; i  + '       g   i     EL; i  + '       g   i     Lì; i  + '       g   i     Lº; i)al  
Passing an argument of the wrong type to any of the constructor
arguments of L{URL} will raise a descriptive L{TypeError}.

L{URL} typechecks very aggressively to ensure that its constitutent
parts are all properly immutable and to prevent confusing errors when
bad data crops up in a method call long after the code that called the
constructor is off the stack.
c                  ó.   € ] tR tRtR R ltR R ltRtR# )Ú1TestURL.test_invalidArguments.<locals>.UnexpectediÐ  c               ó   € V ^8„  d   QhRR/# ©r   r   r6   r   )r   s   "r   r   Ú>TestURL.test_invalidArguments.<locals>.Unexpected.__annotate__Ñ  s   € ÷ ñ  ñ r   c                	ó   € R # )Úwrongr   r"   s   &r   Ú__str__Ú9TestURL.test_invalidArguments.<locals>.Unexpected.__str__Ñ  s   € Ùr   c               ó   € V ^8„  d   QhRR/# r[  r   )r   s   "r   r   r\  Ô  s   € ÷ &ñ & #ñ &r   c                	ó   € R # )ú<unexpected>r   r"   s   &r   Ú__repr__Ú:TestURL.test_invalidArguments.<locals>.Unexpected.__repr__Ô  s   € Ù%r   r   N)r&   r'   r(   r)   r_  rd  r+   r   r   r   Ú
UnexpectedrY  Ð  s   † õ÷&ñ &r   rf  Úunicoder6   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úraisedr   Úexpectationr6   Únamer   r1   r   )r   s   "r   r   Ú3TestURL.test_invalidArguments.<locals>.__annotate__Ù  s)   € ÷ 	ñ 	 ð 	¸Sð 	Èð 	ÐPTñ 	r   c                ór   <€ SP                  \        V P                  4      R P                  WR4      4       R# )zexpected {} for {}, got {}rc  N)rH   r6   r$   r   )ri  rj  rk  r#   s   &&&€r   ÚassertRaisedÚ3TestURL.test_invalidArguments.<locals>.assertRaisedÙ  s/   ø€ Ø×ÑÜ�F×$Ñ$Ó%Ø,×3Ñ3°KÀ~ÓVör   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úparamr6   rj  r   r1   r   )r   s   "r   r   rl  ß  s!   € ÷ 	5ñ 	5˜ð 	5¨3ð 	5Èñ 	5r   c           	     ó°   <€ SP                  \        4      ;_uu_ 4       p\        R/ V S! 4       /B  R R R 4       S! XW4       R #   + '       g   i     L; i)Nr   )r¶   Ú	TypeErrorr   )rq  rj  ri  rf  rn  r#   s   && €€€r   rT   Ú,TestURL.test_invalidArguments.<locals>.checkß  s@   ø€ Ø×"Ñ"¤9×-Ô-°ÜÑ,�u™j›lÐ+Ò,÷ .á˜ Ö4÷ .×-ús   ŸAÁA	r5   r8   r=   r›   ÚboolrE   rD   zint or NoneTyperS  Nzpath segmentrk  rè   z or NoneTypezquery parameter valueÚvaluezquery parameter namezhttps://valid.example.com/zrelative URL)r?   r@   Úvv)r?   )
Úbytesr6   r¶   rs  r   Ú
ValueErrorrs   rŽ   r¢   r¨   )r#   ÚdefaultExpectationrT   ri  rß   rf  rn  s   f    @@r   Útest_invalidArgumentsÚTestURL.test_invalidArgumentsÅ  s‘  ú€ ÷	&ñ 	&ô +0´3«,™Y¸EÐ÷	ð 	ð 2D÷ 	5ô 	5ñ
 	ˆhŒÙˆfŒÙˆjÔÙˆh˜ÔÙˆjÔÙˆfÐ'Ô(à×Ñœy×)Ô)¨VÜá“Lðõ÷ *ñ 	�VÐ/°Ô@Ø×Ñœy×)Ô)¨VÜà™Z›\Ð*ðõ÷ *ñ 	Ø¨Õ7Ð9Pô	
ð ×Ñœy×)Ô)¨VÜá“\ 7Ð+ðõ÷ *ñ 	�VÐ1GÔHð ×Ñœy×)Õ)Ü‘z“|�nÕ%÷ *à×Ñœz×*Õ*ÜÐ'Ð(Õ)÷ +à×Ñœz×*Õ*Ü�v�hÕ÷ +ô �lŠlÐ7Ó8ˆØ×Ñœy×)Ô)¨VØ�I‰I‘j“lÔ#÷ *á�V°Ô@Ø×Ñœy×)Ô)¨VØ�K‰K™
›Ô%÷ *á�V°Ô@Ø×Ñœy×)Ô)¨VØ�I‰I‘j“lÔ#÷ *á�V°Ö@÷S *×)Ð)ú÷ *×)Ð)ú÷ *×)Ð)ú÷ *×)Ð)úç*×*Ð*úç*×*Ð*ú÷ *×)Ð)ú÷ *×)ú÷ *×)úsl   ÂJ=ÃKÄK%ÅK9ÆLÇ L!È	L5ÉM	ÊMÊ=K	ËK"	Ë%K6	Ë9L
	ÌL	Ì!L2	Ì5M	Í	M	ÍM,	c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r2     s   € ÷ 
ñ 
°4ñ 
r   c                ó
  € V P                  \        4      ;_uu_ 4       p\        RR7       RRR4       V P                  \	        XP
                  4      RP                  \        R4      4      4       R#   + '       g   i     LO; i)z—
Technically, L{str} (or L{unicode}, as appropriate) is iterable, but
C{URL(path="foo")} resulting in C{URL.fromText("f/o/o")} is never what
you want.
rk   rS  Nz+expected iterable of text for path, not: {})r¶   rs  r   rH   r6   r$   r   r7   )r#   ri  s   & r   Ú!test_technicallyTextIsIterableButÚ)TestURL.test_technicallyTextIsIterableBut  sZ   € ð ×Ñœy×)Ô)¨VÜ�U�O÷ *à×ÑÜ�× Ñ Ó!Ø9×@Ñ@ÄÀeÃÓMö	
÷ *×)ús   žA2Á2B	r   N)r   )2r&   r'   r(   r)   Ú__doc__rA   rK   rV   rb   rg   ro   rx   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+  r0  r5  r9  r@  rE  rI  rO  rT  r{  r  r+   r   r   r   r-   r-   U   s÷   † ñõ8÷ +õD+õ
õ$
õ
õ&3õ+õ0
õ
õ
õ.
õDõ
õ$&
õPAõEõ5õ&õB"
õH
õ*
õ-õ5õõ!õ$õ)õ5õ8õ7õMõVõ.Võ*Võ 5õ1õ
õ(Kõ	
õ:õ7õOA÷b
ñ 
r   r-   c                  ó&   € ] tR tRtRtR R ltRtR# )ÚURLDeprecationTestsi$  z&
L{twisted.python.url} is deprecated.
c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   Ú URLDeprecationTests.__annotate__)  s   € ÷ 
ñ 
 Tñ 
r   c                óÄ   € ^ RI Hp V V P                  V P                  .4      pV P	                  ^\        V4      4       V P	                  RV^ ,          R,          4       R# )z;
L{twisted.python.url} is deprecated since Twisted 17.5.0.
)rß   z\twisted.python.url was deprecated in Twisted 17.5.0: Please use hyperlink from PyPI instead.ÚmessageN)Útwisted.pythonrß   ÚflushWarningsÚtest_urlDeprecationrH   Úlen)r#   rß   ÚwarningsShowns   &  r   rŠ  Ú'URLDeprecationTests.test_urlDeprecation)  sZ   € õ 	'áà×*Ñ*¨D×,DÑ,DÐ+EÓFˆØ×Ñ˜œC Ó.Ô/Ø×Ñð;ð ˜!Õ˜YÕ'ö	
r   r   N)r&   r'   r(   r)   r�  rŠ  r+   r   r   r   rƒ  rƒ  $  s   † ñ÷
ñ 
r   rƒ  N)Úgúhttp://a/b/c/g)z./gr�  )zg/úhttp://a/b/c/g/)z/gú
http://a/g)z//gzhttp://g)z?yzhttp://a/b/c/d;p?y)zg?yzhttp://a/b/c/g?y)z#szhttp://a/b/c/d;p?q#s)zg#szhttp://a/b/c/g#s)zg?y#szhttp://a/b/c/g?y#s)z;xzhttp://a/b/c/;x)zg;xzhttp://a/b/c/g;x)zg;x?y#szhttp://a/b/c/g;x?y#s)r   r	   )rÂ   úhttp://a/b/c/)z./r’  )rÃ   úhttp://a/b/)z../r“  )z../gúhttp://a/b/g)z../..ú	http://a/)z../../r•  )z../../gr‘  )z
../../../gr‘  )z../../../../gr‘  )z/./gr‘  )z/../gr‘  )zg.zhttp://a/b/c/g.)z.gzhttp://a/b/c/.g)zg..zhttp://a/b/c/g..)z..gzhttp://a/b/c/..g)z./../gr”  )z./g/.r�  )zg/./hzhttp://a/b/c/g/h)zg/../hzhttp://a/b/c/h)z	g;x=1/./yzhttp://a/b/c/g;x=1/y)z
g;x=1/../yzhttp://a/b/c/y)zg?y/./xzhttp://a/b/c/g?y/./x)zg?y/../xzhttp://a/b/c/g?y/../x)zg#s/./xzhttp://a/b/c/g#s/./x)zg#s/../xzhttp://a/b/c/g#s/../x)r�  Ú
__future__r   Útypingr   r   Útwisted.trial.unittestr   rß   r   rt   r®   r¯   Ú_percentencr   r-   rƒ  r   r   r   Ú<module>rš     s  ðñ
õ #å å å 6Ý à	5€ð 2Ð ð4ð ð4ð ð	4ð
 ð4ð ð4ð ð4ð !ð4ð  ð4ð #ð4ð  ð4ð $ð4ð ð4ð  ð4ð (ð4ð  ð!4ð" ð#4ð$ ð%4ð& ð'4ð( ð)4ð* ð+4ð, ð-4ð. ð/4ð0 ð14ð6 !ð74ð8 $ð94ð> ð?4ð@ ðA4ðB ðC4ðD ðE4ðF  ðG4ðH  ðI4ðL ðM4ðN !ðO4ðP "ðQ4ðR !ðS4ðT *ðU4ðV %ðW4ðZ (ð[4ð\ *ð]4ð^ (ð_4ð` *ða4Ð ñn >€ô�Hô ôL
Ð!ô L
ô^
Ð-ö 
r   