+
    4iÃ1  ã                  ó‚  € R t ^ RIHt ^ RIt^ RIt^ RIHtHtHtH	t	 ^ RI
t
^RIHtHtHtHtHtHtHt  ^ RIt]
P*                  ! RR7       ! R R4      4       tR	 R
 ltR R ltR R ltR R lt]
P*                  ! RR7       ! R R4      4       t]
P*                  ! RR7       ! R R4      4       t]
P*                  ! RR7       ! R R4      4       t]
P*                  ! RR7       ! R R4      4       t]]]]]3,          t ]	 ! R R]4      4       t ]
P*                  ! RRR7       ! R R4      4       t!]
P*                  ! RR7       ! R R 4      4       t"]
P*                  ! RRR7       ! R! R"4      4       t#]
P*                  ! RRR7       ! R# R$4      4       t$R% R& lt%R' R( lt&]'PQ                  R)R*4      t)R#   ] d    Rt EL…i ; i)+z
Common verification code.
)ÚannotationsN)ÚProtocolÚSequenceÚUnionÚruntime_checkable)ÚCertificateErrorÚDNSMismatchÚIPAddressMismatchÚMismatchÚSRVMismatchÚURIMismatchÚVerificationErrorT)Úslotsc                  ót   € ] tR t^t$ Rt]P                  ! 4       tR]R&   ]P                  ! 4       t	R]R&   Rt
R# )ÚServiceMatchz4
A match of a service id and a certificate pattern.
Ú	ServiceIDÚ
service_idÚCertificatePatternÚcert_pattern© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚattrÚibr   Ú__annotations__r   Ú__static_attributes__r   ó    Ú9/usr/lib/python3/dist-packages/service_identity/hazmat.pyr   r      s*   ‡ ñð !ŸGšG›I€J�	Ó%Ø'+§w¢w£y€LÐ$×0r   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )é   Úcert_patternsúSequence[CertificatePattern]Úobligatory_idsúSequence[ServiceID]Úoptional_idsÚreturnúlist[ServiceMatch]r   )Úformats   "r    Ú__annotate__r+   )   s0   € ÷ +ñ +Ø/ð+à'ð+ð &ð+ð ñ	+r   c                óÒ  € V '       g   Rp\        V4      h. p\        W4      \        W4      ,           pV Uu. uF  qfP                  NK  	  ppV F,  pW‡9  g   K  VP                  VP	                  VR7      4       K.  	  V FI  pW‡9  g   K  \        WP                  4      '       g   K(  VP                  VP	                  VR7      4       KK  	  V'       d   \        VR7      hV# u upi )zÐ
Verify whether *cert_patterns* are valid for *obligatory_ids* and
*optional_ids*.

*obligatory_ids* must be both present and match.  *optional_ids* must match
if a pattern of the respective type is present.
z3Certificate does not contain any `subjectAltName`s.)Úmismatched_id)Úerrors)r   Ú_find_matchesr   ÚappendÚerror_on_mismatchÚ_contains_instance_ofÚpattern_classr   )	r#   r%   r'   Úmsgr.   ÚmatchesÚmatchÚmatched_idsÚis	   &&&      r    Úverify_service_identityr9   )   sÝ   € ÷ ØCˆÜ˜sÓ#Ð#à€FÜ˜MÓ:¼]Øó>õ €Gñ 29Ó9±¨×#Ô#±€KÐ9ÛˆØÖØ�M‰MØ×#Ñ#°!Ð#Ó4öñ ó ˆð
 ÖÔ$9ØŸ?™?÷%
ô %
ð �M‰MØ×#Ñ#°!Ð#Ó4öñ ÷ Ü vÔ.Ð.à€Nùò- :s   ·C$c               ó$   € V ^8„  d   QhRRRRRR/# )r"   r#   r$   Úservice_idsr&   r(   r)   r   )r*   s   "r    r+   r+   W   s&   € ÷ ñ Ø/ðà$ðð ñr   c           	     ó–   € . pV F@  pV  F7  pVP                  V4      '       g   K  VP                  \        WCR7      4       K9  	  KB  	  V# )zt
Search for matching certificate patterns and service_ids.

Args:
    service_ids: List of service IDs like DNS_ID.
)r   r   )Úverifyr0   r   )r#   r;   r5   ÚsidÚcids   &&   r    r/   r/   W   sE   € ð €GÛˆÛ ˆCØ�z‰z˜#�ŒØ—‘Ü ¨cÔBöó !ñ ð €Nr   c               ó$   € V ^8„  d   QhRRRRRR/# )r"   ÚseqzSequence[object]ÚclÚtyper(   Úboolr   )r*   s   "r    r+   r+   l   s"   € ÷ /ñ /Ð/ð /°Tð /¸dñ /r   c                óx   a€ \         ;QJ d    V3R  lV  4       F  '       g   K   R# 	  R# ! V3R  lV  4       4      # )c              3  ó<   <"  € T F  p\        VS4      x € K  	  R # 5i©N)Ú
isinstance)Ú.0ÚerB   s   & €r    Ú	<genexpr>Ú(_contains_instance_of.<locals>.<genexpr>m   s   øé € Ð.©# QŒz˜!˜R× Ð «#ùs   ƒTF)Úany)rA   rB   s   &fr    r2   r2   l   s,   ø€ ß‹3Ô.©#Ó.�3Œ3Ð.Š3Ð.ˆ3Ô.©#Ó.Ó.Ð.r   c               ó    € V ^8„  d   QhRRRR/# )r"   Úpatternzstr | bytesr(   rD   r   )r*   s   "r    r+   r+   p   s   € ÷ ñ ˜Kð ¨Dñ r   c                ó*  € \        V \        4      '       d    V P                  R4      p  \	        V 4       R#   \         d     R# i ; i  \
         d     Mi ; i \        P                  ! T P                  RR4      4       R#   \
         d     R# i ; i)z®
Check whether *pattern* could be/match an IP address.

Args:
    pattern: A pattern for a host name.

Returns:
    `True` if *pattern* could be an IP address, else `False`.
ÚasciiFTÚ*Ú1)	rH   ÚbytesÚdecodeÚUnicodeErrorÚintÚ
ValueErrorÚ	ipaddressÚ
ip_addressÚreplace©rO   s   &r    Ú_is_ip_addressr]   p   s“   € ô �'œ5×!Ò!ð	Ø—n‘n WÓ-ˆGðÜˆGŒñ øô ô 	Úð	ûô
 ô Ùðúð
Ü×Ò˜WŸ_™_¨S°#Ó6Ô7ñ øô ô Úðús2   ˜7 ªA	 ·AÁAÁ	AÁAÁ&B ÂBÂBc                  ó‚   € ] tR t^�t$ Rt]P                  ! 4       tR]R&   ]	P                  ! R4      t]R R l4       tRtR# )	Ú
DNSPatternz/
A DNS pattern as extracted from certificates.
rT   rO   ó   ^[a-z0-9\-_.]+$c               ó    € V ^8„  d   QhRRRR/# )r"   rO   rT   r(   r_   r   )r*   s   "r    r+   ÚDNSPattern.__annotate__›   s   € ÷ $ñ $ ð $¨:ñ $r   c                	ó*  € \        V\        4      '       g   R p\        V4      hVP                  4       pVR8X  g   \	        V4      '       g   RV9   d   RV: R2p\        V4      hVP                  \        4      pRV9   d   \        V4       V ! VR7      # )z'The DNS pattern must be a bytes string.r   ó    zInvalid DNS pattern Ú.ó   *r\   )	rH   rT   Ú	TypeErrorÚstripr]   r   Ú	translateÚ_TRANS_TO_LOWERÚ_validate_pattern)ÚclsrO   r4   s   && r    Ú
from_bytesÚDNSPattern.from_bytesš   s„   € ä˜'¤5×)Ò)Ø;ˆCÜ˜C“.Ð à—-‘-“/ˆà�cŒ>œ^¨G×4Ò4¸ÀÔ8HØ(¨©°1Ð5ˆCÜ" 3Ó'Ð'à×#Ñ#¤OÓ4ˆØ�7Œ?Ü˜gÔ&á˜7Ô#Ð#r   r   N)r   r   r   r   r   r   r   rO   r   ÚreÚcompileÚ_RE_LEGAL_CHARSÚclassmethodrm   r   r   r   r    r_   r_   �   s:   ‡ ñð
 —W’W“Y€GˆUÓà—j’jÐ!4Ó5€Oàô$ó ô$r   r_   c                  ó^   € ] tR t^­t$ Rt]P                  ! 4       tR]R&   ]	R R l4       t
RtR# )ÚIPAddressPatternz7
An IP address pattern as extracted from certificates.
ú-ipaddress.IPv4Address | ipaddress.IPv6AddressrO   c               ó    € V ^8„  d   QhRRRR/# )r"   ÚbsrT   r(   rt   r   )r*   s   "r    r+   ÚIPAddressPattern.__annotate__·   s   € ÷ 2ñ 2˜Eð 2Ð&6ñ 2r   c                	ó‚   €  V ! \         P                  ! V4      R 7      #   \         d    RT: R2p\        T4      Rhi ; i)r\   zInvalid IP address pattern re   N)rY   rZ   rX   r   )rl   rw   r4   s   && r    rm   ÚIPAddressPattern.from_bytes¶   sG   € ð	2Ùœy×3Ò3°BÓ7Ô8Ð8øÜô 	2Ø/°©v°QÐ7ˆCÜ" 3Ó'¨TÐ1ð	2ús   ‚ Ÿ>r   N)r   r   r   r   r   r   r   rO   r   rr   rm   r   r   r   r    rt   rt   ­   s-   ‡ ñð
 >B¿WºW»Y€GÐ:ÓFàô2ó ô2r   rt   c                  óŠ   € ] tR t^¿t$ Rt]P                  ! 4       tR]R&   ]P                  ! 4       t	R]R&   ]
R R l4       tRtR	# )
Ú
URIPatternz0
An URI pattern as extracted from certificates.
rT   Úprotocol_patternr_   Údns_patternc               ó    € V ^8„  d   QhRRRR/# )r"   rO   rT   r(   r|   r   )r*   s   "r    r+   ÚURIPattern.__annotate__Ë   s   € ÷ 
ñ 
 ð 
¨:ñ 
r   c                	óP  € \        V\        4      '       g   R p\        V4      hVP                  4       P	                  \
        4      pRV9  g   RV9   g   \        V4      '       d   RV: R2p\        V4      hVP                  R4      w  r4V ! V\        P                  V4      R7      # )z'The URI pattern must be a bytes string.ó   :rf   zInvalid URI pattern re   )r}   r~   ©rH   rT   rg   rh   ri   rj   r]   r   Úsplitr_   rm   )rl   rO   r4   r}   Úhostnames   &&   r    rm   ÚURIPattern.from_bytesÊ   s•   € ä˜'¤5×)Ò)Ø;ˆCÜ˜C“.Ð à—-‘-“/×+Ñ+¬OÓ<ˆà�wÔ $¨'¤/´^ÀG×5LÒ5LØ(¨©°1Ð5ˆCÜ" 3Ó'Ð'à%,§]¡]°4Ó%8Ñ"ÐáØ-Ü"×-Ñ-¨hÓ7ô
ð 	
r   r   N)r   r   r   r   r   r   r   r}   r   r~   rr   rm   r   r   r   r    r|   r|   ¿   s<   ‡ ñð
 #Ÿgšg›iÐ�eÓ'à"Ÿgšg›i€K�Ó'àô
ó ô
r   r|   c                  óŠ   € ] tR t^Þt$ Rt]P                  ! 4       tR]R&   ]P                  ! 4       t	R]R&   ]
R R l4       tRtR	# )
Ú
SRVPatternz0
An SRV pattern as extracted from certificates.
rT   Úname_patternr_   r~   c               ó    € V ^8„  d   QhRRRR/# )r"   rO   rT   r(   rˆ   r   )r*   s   "r    r+   ÚSRVPattern.__annotate__ê   s   € ÷ 
ñ 
 ð 
¨:ñ 
r   c                	ó|  € \        V\        4      '       g   R p\        V4      hVP                  4       P	                  \
        4      pV^ ,          ^_8w  g    RV9  g   RV9   g   \        V4      '       d   RV: R2p\        V4      hVP                  R^4      w  r4V ! VR,          \        P                  V4      R7      # )z'The SRV pattern must be a bytes string.ó   .rf   zInvalid SRV pattern re   ºé   NN)r‰   r~   rƒ   )rl   rO   r4   Únamer…   s   &&   r    rm   ÚSRVPattern.from_bytesé   s¨   € ä˜'¤5×)Ò)Ø;ˆCÜ˜C“.Ð à—-‘-“/×+Ñ+¬OÓ<ˆð �A�J˜'Ô!Ø˜7Ô"Ø�wŒÜ˜g×&Ò&à(¨©°1Ð5ˆCÜ" 3Ó'Ð'à Ÿ™ t¨QÓ/‰ˆÙØ˜b�¬z×/DÑ/DÀXÓ/Nô
ð 	
r   r   N)r   r   r   r   r   r   r   r‰   r   r~   rr   rm   r   r   r   r    rˆ   rˆ   Þ   s;   ‡ ñð
 Ÿ'š'›)€L�%Ó#à"Ÿgšg›i€K�Ó'àô
ó ô
r   rˆ   c                  óN   € ] tR tRt]R R l4       t]R R l4       tR R ltRtR	# )
r   i	  c               ó   € V ^8„  d   QhRR/# )r"   r(   ztype[CertificatePattern]r   )r*   s   "r    r+   ÚServiceID.__annotate__  s   € ×<Ñ<Ð7Ñ<r   c                	ó   € R # rG   r   ©Úselfs   &r    r3   ÚServiceID.pattern_class  s   € Ù9<r   c               ó   € V ^8„  d   QhRR/# )r"   r(   ztype[Mismatch]r   )r*   s   "r    r+   r”     s   € ×6Ñ6 >Ñ6r   c                	ó   € R # rG   r   r–   s   &r    r1   ÚServiceID.error_on_mismatch  s   € Ù36r   c               ó    € V ^8„  d   QhRRRR/# ©r"   rO   r   r(   rD   r   )r*   s   "r    r+   r”     s   € ×>Ñ>Ð0Ð>°TÑ>r   c                	ó   € R # rG   r   ©r—   rO   s   &&r    r=   ÚServiceID.verify  s   € ¹3r   r   N)	r   r   r   r   Úpropertyr3   r1   r=   r   r   r   r    r   r   	  s$   † àÜ<ó Ø<àÜ6ó Ø6ç>Ñ>r   r   F)Úinitr   c                  óŒ   € ] tR tRt$ Rt]P                  ! 4       tR]R&   ]	P                  ! R4      t]t]tR R ltR R	 ltR
tR# )ÚDNS_IDi  z!
A DNS service ID, aka hostname.
rT   r…   r`   c               ó   € V ^8„  d   QhRR/# )r"   r…   Ústrr   )r*   s   "r    r+   ÚDNS_ID.__annotate__!  s   € ÷ "ñ " ñ "r   c                	óJ  € \        V\        4      '       g   R p\        V4      hVP                  4       pV'       d   \	        V4      '       d   Rp\        V4      h\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d1   \        '       d   \        P                  ! V4      pMRp\        V4      hVP                  R4      pVP                  \        4      V n        V P                  P                  V P                  4      f   Rp\        V4      hR# )zDNS-ID must be a text string.zInvalid DNS-ID.c              3  ó>   "  € T F  p\        V4      ^8„  x € K  	  R# 5i)é   N)Úord)rI   Úcs   & r    rK   Ú"DNS_ID.__init__.<locals>.<genexpr>+  s   é € Ð.¡X Œs�1‹v˜Ž|£Xùs   ‚TFz+idna library is required for non-ASCII IDs.rQ   N)rH   r¦   rg   rh   r]   rX   rM   ÚidnaÚencodeÚImportErrorri   rj   r…   rq   r6   )r—   r…   r4   Úascii_ids   &&  r    Ú__init__ÚDNS_ID.__init__!  sÙ   € Ü˜(¤C×(Ò(Ø1ˆCÜ˜C“.Ð à—>‘>Ó#ˆßœ>¨(×3Ò3Ø#ˆCÜ˜S“/Ð!ç‹3Ñ.¡XÓ.�3�3Š3Ñ.¡XÓ.×.Ò.ß‹tÜŸ;š; xÓ0‘àC�Ü! #Ó&Ð&à—‘ wÓ/ˆHà ×*Ñ*¬?Ó;ˆŒØ×Ñ×%Ñ% d§m¡mÓ4Ò<Ø#ˆCÜ˜S“/Ð!ñ =r   c               ó    € V ^8„  d   QhRRRR/# r�   r   )r*   s   "r    r+   r§   9  ó   € ÷ ñ Ð0ð °Tñ r   c                ó|   € \        WP                  4      '       d!   \        VP                  V P                  4      # R# )z3
https://tools.ietf.org/search/rfc6125#section-6.4
F)rH   r3   Ú_hostname_matchesrO   r…   rŸ   s   &&r    r=   ÚDNS_ID.verify9  s-   € ô �g×1Ñ1×2Ò2Ü$ W§_¡_°d·m±mÓDÐDár   )r…   N)r   r   r   r   r   r   r   r…   r   ro   rp   rq   r_   r3   r   r1   r²   r=   r   r   r   r    r¤   r¤     sD   ‡ ñð —g’g“i€HˆeÓð —j’jÐ!4Ó5€OØ€MØ#Ðõ"÷0ñ r   r¤   c                  ót   € ] tR tRt$ Rt]P                  ! ]P                  R7      t	R]
R&   ]t]tR R ltRtR	# )
ÚIPAddress_IDiC  z
An IP address service ID.
)Ú	converterru   Úipc               ó    € V ^8„  d   QhRRRR/# r�   r   )r*   s   "r    r+   ÚIPAddress_ID.__annotate__P  rµ   r   c                ón   € \        WP                  4      '       d   V P                  VP                  8H  # R# )z3
https://tools.ietf.org/search/rfc2818#section-3.1
F)rH   r3   r¼   rO   rŸ   s   &&r    r=   ÚIPAddress_ID.verifyP  s+   € ô �g×1Ñ1×2Ò2Ø—7‘7˜gŸo™oÑ-Ð-ár   r   N)r   r   r   r   r   r   r   rY   rZ   r¼   r   rt   r3   r	   r1   r=   r   r   r   r    rº   rº   C  s?   ‡ ñð 9=¿ºØ×&Ñ&ô9€BÐ5ó ð %€MØ)Ð÷ñ r   rº   c                  ó”   € ] tR tRt$ Rt]P                  ! 4       tR]R&   ]P                  ! 4       t	R]R&   ]
t]tR R ltR	 R
 ltRtR# )ÚURI_IDiZ  z
An URI service ID.
rT   Úprotocolr¤   Údns_idc               ó   € V ^8„  d   QhRR/# )r"   Úurir¦   r   )r*   s   "r    r+   ÚURI_ID.__annotate__f  s   € ÷ 2ñ 2˜Cñ 2r   c                	ól  € \        V\        4      '       g   R p\        V4      hVP                  4       pRV9  g   \	        V4      '       d   Rp\        V4      hVP                  R4      w  r4VP                  R4      P                  \        4      V n
        \        VP                  R4      4      V n        R# )zURI-ID must be a text string.Ú:zInvalid URI-ID.rQ   Ú/N)rH   r¦   rg   rh   r]   rX   r„   r¯   ri   rj   rÃ   r¤   rÄ   )r—   rÆ   r4   Úprotr…   s   &&   r    r²   ÚURI_ID.__init__f  sˆ   € Ü˜#œs×#Ò#Ø1ˆCÜ˜C“.Ð à�i‰i‹kˆØ�cŒ>œ^¨C×0Ò0Ø#ˆCÜ˜S“/Ð!àŸ™ 3›‰ˆàŸ™ GÓ,×6Ñ6´ÓGˆŒÜ˜XŸ^™^¨CÓ0Ó1ˆŽr   c               ó    € V ^8„  d   QhRRRR/# r�   r   )r*   s   "r    r+   rÇ   u  s   € ÷ 
ñ 
Ð0ð 
°Tñ 
r   c                óÈ   € \        WP                  4      '       dG   VP                  V P                  8H  ;'       d&    V P                  P                  VP                  4      # R# )z5
https://tools.ietf.org/search/rfc6125#section-6.5.2
F)rH   r3   r}   rÃ   rÄ   r=   r~   rŸ   s   &&r    r=   ÚURI_ID.verifyu  sS   € ô �g×1Ñ1×2Ò2à×(Ñ(¨D¯M©MÑ9÷ <ð <Ø—K‘K×&Ñ& w×':Ñ':Ó;ðñ
 r   )rÄ   rÃ   N)r   r   r   r   r   r   r   rÃ   r   rÄ   r|   r3   r   r1   r²   r=   r   r   r   r    rÂ   rÂ   Z  sC   ‡ ñð —g’g“i€HˆeÓØ—W’W“Y€FˆFÓà€MØ#Ðõ2÷
ñ 
r   rÂ   c                  ó”   € ] tR tRt$ Rt]P                  ! 4       tR]R&   ]P                  ! 4       t	R]R&   ]
t]tR R ltR	 R
 ltRtR# )ÚSRV_IDi‚  z
An SRV service ID.
rT   r�   r¤   rÄ   c               ó   € V ^8„  d   QhRR/# )r"   Úsrvr¦   r   )r*   s   "r    r+   ÚSRV_ID.__annotate__Ž  s   € ÷ 'ñ '˜Cñ 'r   c                	óz  € \        V\        4      '       g   R p\        V4      hVP                  4       pRV9  g    \	        V4      '       g   V^ ,          R8w  d   Rp\        V4      hVP                  R^4      w  r4VR,          P                  R4      P                  \        4      V n
        \        V4      V n        R# )zSRV-ID must be a text string.re   Ú_zInvalid SRV-ID.rŽ   rQ   N)rH   r¦   rg   rh   r]   rX   r„   r¯   ri   rj   r�   r¤   rÄ   )r—   rÓ   r4   r�   r…   s   &&   r    r²   ÚSRV_ID.__init__Ž  s�   € Ü˜#œs×#Ò#Ø1ˆCÜ˜C“.Ð à�i‰i‹kˆØ�cŒ>œ^¨C×0Ò0°C¸µF¸c´MØ#ˆCÜ˜S“/Ð!àŸ™ 3¨Ó*‰ˆà˜•H—O‘O GÓ,×6Ñ6´ÓGˆŒ	Ü˜XÓ&ˆŽr   c               ó    € V ^8„  d   QhRRRR/# r�   r   )r*   s   "r    r+   rÔ   �  s   € ÷ 	ñ 	Ð0ð 	°Tñ 	r   c                óÈ   € \        WP                  4      '       dG   V P                  VP                  8H  ;'       d&    V P                  P                  VP                  4      # R# )z5
https://tools.ietf.org/search/rfc6125#section-6.5.1
F)rH   r3   r�   r‰   rÄ   r=   r~   rŸ   s   &&r    r=   ÚSRV_ID.verify�  sU   € ô �g×1Ñ1×2Ò2Ø—9‘9 × 4Ñ 4Ñ4÷ ð ¸¿¹×9KÑ9KØ×#Ñ#ó:ð ñ r   )rÄ   r�   N)r   r   r   r   r   r   r   r�   r   rÄ   rˆ   r3   r   r1   r²   r=   r   r   r   r    rÑ   rÑ   ‚  sC   ‡ ñð —'’'“)€Dˆ%ÓØ—W’W“Y€FˆFÓà€MØ#Ðõ'÷	ñ 	r   rÑ   c               ó$   € V ^8„  d   QhRRRRRR/# )r"   r   rT   Úactual_hostnamer(   rD   r   )r*   s   "r    r+   r+   ©  s!   € ÷ +ñ + Eð +¸Eð +Àdñ +r   c                ó¸   € RV 9   dQ   V P                  R^4      w  r#VP                  R^4      w  rEW58w  d   R# VP                  R4      '       d   R# VRV39   # W8H  # )zL
:return: `True` if *cert_pattern* matches *actual_hostname*, else `False`.
rf   r�   Fs   xn--)r„   Ú
startswith)r   rÜ   Ú	cert_headÚ	cert_tailÚactual_headÚactual_tails   &&    r    r·   r·   ©  sl   € ð ˆ|ÔØ+×1Ñ1°$¸Ó:Ñˆ	Ø#2×#8Ñ#8¸¸qÓ#AÑ ˆØÔ#Ùà×!Ñ! '×*Ò*Ùà˜T ;Ð/Ñ/Ð/àÑ*Ð*r   c               ó    € V ^8„  d   QhRRRR/# )r"   r   rT   r(   ÚNoner   )r*   s   "r    r+   r+   »  s   € ÷ $ñ $ Eð $¨dñ $r   c                ó˜  € V P                  R4      pV^8”  d   RV : R2p\        V4      hV P                  R4      p\        V4      ^8  d   RV : R2p\        V4      hRV^ ,          9  d   RV : R2p\        V4      h\        ;QJ d    R V 4       F  '       g   K   RM	  R	M! R V 4       4      '       d   RV : R
2p\        V4      hR# )z\
Check whether the usage of wildcards within *cert_pattern* conforms with
our expectations.
rf   zCertificate's DNS-ID z contains too many wildcards.r�   z0 has too few host components for wildcard usage.z+ has a wildcard outside the left-most part.c              3  óB   "  € T F  p\        V4      '       * x € K  	  R # 5irG   )Úlen)rI   Úps   & r    rK   Ú$_validate_pattern.<locals>.<genexpr>Ì  s   é € Ð
%™u˜!Œs�1‹v�:‰:›uùs   ‚TFz contains empty parts.N)Úcountr   r„   rç   rM   )r   Úcntr4   Úpartss   &   r    rk   rk   »  sÔ   € ð
 ×
Ñ
˜TÓ
"€CØ
ˆQ„wØ% lÑ%5Ð5RÐSˆÜ˜sÓ#Ð#Ø×Ñ˜tÓ$€EÜ
ˆ5ƒz�A„~Ø% lÑ%5Ð5eÐfˆÜ˜sÓ#Ð#à�5˜•8ÔØ% lÑ%5Ð5`ÐaˆÜ˜sÓ#Ð#ß
ƒsÑ
%™uÓ
%‡s‡s‚sÑ
%™uÓ
%×%Ò%Ø% lÑ%5Ð5KÐLˆÜ˜sÓ#Ð#ñ &r   s   ABCDEFGHIJKLMNOPQRSTUVWXYZs   abcdefghijklmnopqrstuvwxyz)*r   Ú
__future__r   rY   ro   Útypingr   r   r   r   r   Ú
exceptionsr   r   r	   r
   r   r   r   r®   r°   Úsr   r9   r/   r2   r]   r_   rt   r|   rˆ   r   r   r¤   rº   rÂ   rÑ   r·   rk   rT   Ú	maketransrj   r   r   r    Ú<module>rò      s÷  ðñõ #ã Û 	ç ?Ó ?ã ÷÷ ñ ðÛð
 ‡‚ˆdÔ÷1ð 1ó ð1õ+õ\õ*/õð> ‡‚ˆdÔ÷$ð $ó ð$ð: ‡‚ˆdÔ÷2ð 2ó ð2ð" ‡‚ˆdÔ÷
ð 
ó ð
ð< ‡‚ˆdÔ÷
ð 
ó ð
ðB Ø�
˜JÐ(8Ð8õÐ ðð ô?�ó ?ó ð?ð ‡‚ˆU˜$Ô÷+ð +ó  ð+ð\ ‡‚ˆdÔ÷ð ó ðð, ‡‚ˆU˜$Ô÷$ð $ó  ð$ðN ‡‚ˆU˜$Ô÷#ð #ó  ð#õL+õ$$ð. —/‘/Ø!Ð#@ó‚øðo ô ØƒDðús   ´F1 Æ1	F>Æ=F>