
    z%i             	       
   	 d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ	 d dlm
Z
 d dlmZ  ed      Ze ed      z  Z ed	      Zeez  Ze ed
      z
  Ze ed      z
  Ze ed      z   ed
      z
  Zeez  Ze ed      z  Zeez  Ze ed      z
  Zd Z e j2                  de j4                  e j6                  z        Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$ G d d e      Z% G d! d"e      Z& G d# d$e      Z' G d% d&e'      Z( G d' d(e      Z) G d) d*e      Z* G d+ d,e      Z+ G d- d.e      Z, G d/ d0e      Z- G d1 d2e      Z. G d3 d4e      Z/ G d5 d6e      Z0 G d7 d8e      Z1 G d9 d:e      Z2 G d; d<e      Z3 G d= d>e      Z4 G d? d@e      Z5 G dA dBe      Z6 G dC dDe      Z7 G dE dFe      Z8 G dG dHe      Z9 G dI dJe!      Z: G dK dLe      Z; G dM dNe      Z< G dO dPe      Z= G dQ dRe      Z> G dS dTe>      Z? G dU dVe      Z@ G dW dXe      ZA G dY dZe      ZB G d[ d\e      ZC G d] d^e      ZD G d_ d`eD      ZE G da dbeD      ZF G dc dde      ZG G de dfe      ZH G dg dhe      ZI G di djeI      ZJ G dk dleJ      ZK G dm dne      ZL G do dpeM      ZN G dq dreN      ZO G ds dteN      ZP G du dveO      ZQ G dw dxe
j                        ZS ePd
dy      ZT ePdzd{      ZU ePd|d}      ZV e j2                  d~j                  dj                  e                  j                  ZZ e j2                  dj                   e j                  dj                  e                        j                  Z] e j2                  d      j                  Z_ e j2                  dj                   e j                  dj                  e                        j                  Z` e j2                  dj                   e j                  dj                  e                        j                  Za e j2                  dj                   e j                  dj                  e                        j                  Zbd Zcd Zdd Zed Zfd Zgd Zhd Zid Zjd Zkd Zld Zmd Znd Zod Zpd Zqd Zrd Zsd Ztd Zud Zvd Zwd Zxd Zyd Zzd Z{d Z|d Z}d Z~d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)    N)	hexdigits)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%c                 d    dt        |       j                  dd      j                  dd      z   dz   S )N"\\\z\")strreplacevalues    N/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/email/_header_value_parser.pyquote_stringr   `   s0    s5z!!$/77UCCCGG    z
   =\?            # literal =?
   [^?]*          # charset
   \?             # literal ?
   [qQbB]         # literal 'q' or 'b', case insensitive
   \?             # literal ?
  .*?             # encoded word
  \?=             # literal ?=
c                        e Zd ZdZdZdZ fdZd Z fdZe	d        Z
e	d        Zd Ze	d	        Ze	d
        Zd ZddZddZddZ xZS )	TokenListNTc                 2    t        |   |i | g | _        y N)super__init__defects)selfargskw	__class__s      r   r   zTokenList.__init__y   s    $%"%r   c                 2    dj                  d | D              S )N c              3   2   K   | ]  }t        |        y wr   r   .0xs     r   	<genexpr>z$TokenList.__str__.<locals>.<genexpr>~        ,!s1v,   joinr   s    r   __str__zTokenList.__str__}   s    ww,t,,,r   c                 h    dj                  | j                  j                  t        |                S Nz{}({})formatr    __name__r   __repr__r   r    s    r   r4   zTokenList.__repr__   s+    t~~66"W-/1 	1r   c                 2    dj                  d | D              S )Nr"   c              3   N   K   | ]  }|j                   s|j                     y wr   r   r%   s     r   r(   z"TokenList.value.<locals>.<genexpr>   s     81qww8s   %%r+   r-   s    r   r   zTokenList.value   s    ww8888r   c                 <    t        d | D        | j                        S )Nc              3   4   K   | ]  }|j                     y wr   )all_defectsr%   s     r   r(   z(TokenList.all_defects.<locals>.<genexpr>   s     0aAMM0   )sumr   r-   s    r   r:   zTokenList.all_defects   s    040$,,??r   c                 (    | d   j                         S Nr   )startswith_fwsr-   s    r   r?   zTokenList.startswith_fws   s    Aw%%''r   c                 (    	 t        d | D              S )Nc              3   4   K   | ]  }|j                     y wr   )as_ew_allowed)r&   parts     r   r(   z*TokenList.as_ew_allowed.<locals>.<genexpr>   s     7$4%%7r;   )allr-   s    r   rB   zTokenList.as_ew_allowed   s    O7$777r   c                 N    g }| D ]  }|j                  |j                          |S r   )extendcomments)r   rG   tokens      r   rG   zTokenList.comments   s+     	,EOOENN+	,r   c                    t        | |      S )Npolicy)_refold_parse_treer   rK   s     r   foldzTokenList.fold   s    !$v66r   c                 :    t        | j                  |             y )Nindent)printppstrr   rQ   s     r   pprintzTokenList.pprint   s    djjj'(r   c                 D    dj                  | j                  |            S )N
rP   )r,   _pprT   s     r   rS   zTokenList.ppstr   s    yy011r   c              #   ~  K   dj                  || j                  j                  | j                         | D ]A  }t	        |d      s|dj                  |      z    &|j                  |dz         E d {    C | j                  rdj                  | j                        }nd}dj                  ||       y 7 Ew)Nz{}{}/{}(rX   z*    !! invalid element in token list: {!r}z    z Defects: {}r"   z{}){})r2   r    r3   
token_typehasattrrX   r   )r   rQ   rH   extras       r   rX   zTokenList._pp   s     NN##OO 	  	4E5%( !55;VE]C D !99VF]333	4 <<"))$,,7EEnnVU++ 4s   A3B=5B;6AB=r"   )r3   
__module____qualname__rZ   syntactic_breakew_combine_allowedr   r.   r4   propertyr   r:   r?   rB   rG   rN   rU   rS   rX   __classcell__r    s   @r   r   r   s   s    JO-1 9 9 @ @( 8 8  7)2,r   r   c                   ,    e Zd Zed        Zed        Zy)WhiteSpaceTokenListc                      yN  r-   s    r   r   zWhiteSpaceTokenList.value       r   c                 `    | D cg c]  }|j                   dk(  s|j                    c}S c c}w )Ncomment)rZ   contentr   r'   s     r   rG   zWhiteSpaceTokenList.comments   s%    #'Ca1<<+B		CCC   ++N)r3   r^   r_   rb   r   rG   rj   r   r   rf   rf      s*      D Dr   rf   c                       e Zd ZdZy)UnstructuredTokenListunstructuredNr3   r^   r_   rZ   rj   r   r   rr   rr      s    Jr   rr   c                       e Zd ZdZy)PhrasephraseNrt   rj   r   r   rv   rv          Jr   rv   c                       e Zd ZdZy)WordwordNrt   rj   r   r   rz   rz          Jr   rz   c                       e Zd ZdZy)CFWSListcfwsNrt   rj   r   r   r~   r~      r|   r   r~   c                       e Zd ZdZy)AtomatomNrt   rj   r   r   r   r      r|   r   r   c                       e Zd ZdZdZy)TokenrH   FN)r3   r^   r_   rZ   encode_as_ewrj   r   r   r   r      s    JLr   r   c                       e Zd ZdZdZdZdZy)EncodedWordencoded-wordN)r3   r^   r_   rZ   ctecharsetlangrj   r   r   r   r      s    J
CGDr   r   c                   @    e Zd ZdZed        Zed        Zed        Zy)QuotedStringquoted-stringc                 L    | D ]  }|j                   dk(  s|j                  c S  y Nbare-quoted-stringrZ   r   ro   s     r   rn   zQuotedString.content   s'     	A||33ww	r   c                     g }| D ]G  }|j                   dk(  r|j                  t        |             -|j                  |j                         I dj	                  |      S )Nr   r"   )rZ   appendr   r   r,   )r   resr'   s      r   quoted_valuezQuotedString.quoted_value   sS     	$A||33

3q6"

177#		$
 wws|r   c                 L    | D ]  }|j                   dk(  s|j                  c S  y r   r   r   rH   s     r   stripped_valuezQuotedString.stripped_value   s*     	#E#77{{"	#r   N)r3   r^   r_   rZ   rb   rn   r   r   rj   r   r   r   r      sA     J 
   # #r   r   c                   &    e Zd ZdZd Zed        Zy)BareQuotedStringr   c                 D    t        dj                  d | D                    S )Nr"   c              3   2   K   | ]  }t        |        y wr   r$   r%   s     r   r(   z+BareQuotedString.__str__.<locals>.<genexpr>   s     #9qCF#9r*   )r   r,   r-   s    r   r.   zBareQuotedString.__str__   s    BGG#9D#99::r   c                 2    dj                  d | D              S )Nr"   c              3   2   K   | ]  }t        |        y wr   r$   r%   s     r   r(   z)BareQuotedString.value.<locals>.<genexpr>  r)   r*   r+   r-   s    r   r   zBareQuotedString.value      ww,t,,,r   N)r3   r^   r_   rZ   r.   rb   r   rj   r   r   r   r      s     %J; - -r   r   c                   <    e Zd ZdZd Zd Zed        Zed        Zy)Commentrm   c                     dj                  t        dg| D cg c]  }| j                  |       c}dggg             S c c}w )Nr"   r   ))r,   r<   quotero   s     r   r.   zComment.__str__  sG    wws E489qTZZ]9 E  "	# $ 	$9s   >c                     |j                   dk(  rt        |      S t        |      j                  dd      j                  dd      j                  dd      S )Nrm   r   r   r   z\(r   z\))rZ   r   r   )r   r   s     r   r   zComment.quote  sR    y(u:5z!!$/77"%u..5g"%u/.	.r   c                 2    dj                  d | D              S )Nr"   c              3   2   K   | ]  }t        |        y wr   r$   r%   s     r   r(   z"Comment.content.<locals>.<genexpr>  r)   r*   r+   r-   s    r   rn   zComment.content  r   r   c                     | j                   gS r   )rn   r-   s    r   rG   zComment.comments  s    ~r   N)	r3   r^   r_   rZ   r.   r   rb   rn   rG   rj   r   r   r   r     s9    J$. - -  r   r   c                   @    e Zd ZdZed        Zed        Zed        Zy)AddressListzaddress-listc                 L    | D cg c]  }|j                   dk(  s| c}S c c}w )NaddressrZ   ro   s     r   	addresseszAddressList.addresses%  !    ;a1<<#:;;;   !!c                 (    t        d | D        g       S )Nc              3   R   K   | ]  }|j                   d k(  r|j                   ! ywr   NrZ   	mailboxesr%   s     r   r(   z(AddressList.mailboxes.<locals>.<genexpr>+  s'      >Q\\9%< KK >   %'r<   r-   s    r   r   zAddressList.mailboxes)  !     >!>?AC 	Cr   c                 (    t        d | D        g       S )Nc              3   R   K   | ]  }|j                   d k(  r|j                   ! ywr   rZ   all_mailboxesr%   s     r   r(   z,AddressList.all_mailboxes.<locals>.<genexpr>0  s'      >Q\\9%< OO >r   r   r-   s    r   r   zAddressList.all_mailboxes.  r   r   N)r3   r^   r_   rZ   rb   r   r   r   rj   r   r   r   r   !  sE    J< < C C C Cr   r   c                   @    e Zd ZdZed        Zed        Zed        Zy)Addressr   c                 F    | d   j                   dk(  r| d   j                  S y )Nr   grouprZ   display_namer-   s    r   r   zAddress.display_name8  s)    7(7''' )r   c                 x    | d   j                   dk(  r| d   gS | d   j                   dk(  rg S | d   j                  S Nr   mailboxinvalid-mailboxr   r-   s    r   r   zAddress.mailboxes=  sH    7*G9!W#44IAw   r   c                     | d   j                   dk(  r| d   gS | d   j                   dk(  r| d   gS | d   j                  S r   r   r-   s    r   r   zAddress.all_mailboxesE  sO    7*G9!W#44G9Aw$$$r   N)r3   r^   r_   rZ   rb   r   r   r   rj   r   r   r   r   4  sA    J( ( ! ! % %r   r   c                   0    e Zd ZdZed        Zed        Zy)MailboxListmailbox-listc                 L    | D cg c]  }|j                   dk(  s| c}S c c}w )Nr   r   ro   s     r   r   zMailboxList.mailboxesQ  r   r   c                 H    | D cg c]  }|j                   dv r| c}S c c}w )N)r   r   r   ro   s     r   r   zMailboxList.all_mailboxesU  s.     ?a||==  ? 	? ?s   Nr3   r^   r_   rZ   rb   r   r   rj   r   r   r   r   M  s-    J< < ? ?r   r   c                   0    e Zd ZdZed        Zed        Zy)	GroupList
group-listc                 L    | r| d   j                   dk7  rg S | d   j                  S Nr   r   r   r-   s    r   r   zGroupList.mailboxes_  s+    tAw))^;IAw   r   c                 L    | r| d   j                   dk7  rg S | d   j                  S r   r   r-   s    r   r   zGroupList.all_mailboxese  s+    tAw))^;IAw$$$r   Nr   rj   r   r   r   r   [  s-    J! !
 % %r   r   c                   @    e Zd ZdZed        Zed        Zed        Zy)Groupr   c                 H    | d   j                   dk7  rg S | d   j                  S N   r   r   r-   s    r   r   zGroup.mailboxesp  s)    7-IAw   r   c                 H    | d   j                   dk7  rg S | d   j                  S r   r   r-   s    r   r   zGroup.all_mailboxesv  s)    7-IAw$$$r   c                      | d   j                   S r>   )r   r-   s    r   r   zGroup.display_name|  s    Aw###r   N)r3   r^   r_   rZ   rb   r   r   r   rj   r   r   r   r   l  sA    J! !
 % %
 $ $r   r   c                   `    e Zd ZdZed        Zed        Zed        Zed        Zed        Z	y)NameAddr	name-addrc                 >    t        |       dk(  ry | d   j                  S N   r   )lenr   r-   s    r   r   zNameAddr.display_name  s     t9>Aw###r   c                      | d   j                   S N
local_partr-   s    r   r   zNameAddr.local_part  s    Bx"""r   c                      | d   j                   S r   domainr-   s    r   r   zNameAddr.domain  s    Bxr   c                      | d   j                   S r   )router-   s    r   r   zNameAddr.route  s    Bx~~r   c                      | d   j                   S r   	addr_specr-   s    r   r   zNameAddr.addr_spec  s    Bx!!!r   N
r3   r^   r_   rZ   rb   r   r   r   r   r   rj   r   r   r   r     si    J$ $
 # #     " "r   r   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)	AngleAddrz
angle-addrc                 L    | D ]  }|j                   dk(  s|j                  c S  y N	addr-spec)rZ   r   ro   s     r   r   zAngleAddr.local_part  s'     	$A||{*||#	$r   c                 L    | D ]  }|j                   dk(  s|j                  c S  y r   rZ   r   ro   s     r   r   zAngleAddr.domain  s&     	 A||{*xx	 r   c                 L    | D ]  }|j                   dk(  s|j                  c S  y )N	obs-route)rZ   domainsro   s     r   r   zAngleAddr.route  s'     	!A||{*yy 	!r   c                     | D ]O  }|j                   dk(  s|j                  r|j                  c S t        |j                        |j                  z   c S  y)Nr   z<>)rZ   r   r   r   ro   s     r   r   zAngleAddr.addr_spec  sK     	A||{*<<;;&'5CC	 r   N)	r3   r^   r_   rZ   rb   r   r   r   r   rj   r   r   r   r     sU    J$ $
    
 ! !
  r   r   c                        e Zd ZdZed        Zy)ObsRouter   c                 `    | D cg c]  }|j                   dk(  s|j                    c}S c c}w )Nr   r   ro   s     r   r   zObsRoute.domains  s%    "&CQ!,,(*BCCCrp   N)r3   r^   r_   rZ   rb   r   rj   r   r   r   r     s    JD Dr   r   c                   `    e Zd ZdZed        Zed        Zed        Zed        Zed        Z	y)Mailboxr   c                 F    | d   j                   dk(  r| d   j                  S y Nr   r   r   r-   s    r   r   zMailbox.display_name  s)    7,7''' -r   c                      | d   j                   S r>   r   r-   s    r   r   zMailbox.local_part      Aw!!!r   c                      | d   j                   S r>   r   r-   s    r   r   zMailbox.domain  s    Aw~~r   c                 F    | d   j                   dk(  r| d   j                  S y r  )rZ   r   r-   s    r   r   zMailbox.route  s'    7,7==  -r   c                      | d   j                   S r>   r   r-   s    r   r   zMailbox.addr_spec  s    Aw   r   Nr   rj   r   r   r   r     si    J( ( " "   ! ! ! !r   r   c                   0    e Zd ZdZed        ZexZxZxZZ	y)InvalidMailboxr   c                      y r   rj   r-   s    r   r   zInvalidMailbox.display_name      r   Nr   rj   r   r   r	  r	    s/    "J  /;:J::%)r   r	  c                   0     e Zd ZdZdZe fd       Z xZS )Domainr   Fc                 R    dj                  t        |   j                               S Nr"   r,   r   r   splitr5   s    r   r   zDomain.domain      wwuw}**,--r   )r3   r^   r_   rZ   rB   rb   r   rc   rd   s   @r   r  r    s    JM. .r   r  c                       e Zd ZdZy)DotAtomdot-atomNrt   rj   r   r   r  r    s    Jr   r  c                       e Zd ZdZdZy)DotAtomTextzdot-atom-textTNr3   r^   r_   rZ   rB   rj   r   r   r  r    s     JMr   r  c                       e Zd ZdZdZy)NoFoldLiteralzno-fold-literalFNr  rj   r   r   r  r     s    "JMr   r  c                   T    e Zd ZdZdZed        Zed        Zed        Zed        Z	y)AddrSpecr   Fc                      | d   j                   S r>   r   r-   s    r   r   zAddrSpec.local_part
  r  r   c                 >    t        |       dk  ry | d   j                  S )N   r   )r   r   r-   s    r   r   zAddrSpec.domain  s    t9q=Bxr   c                     t        |       dk  r| d   j                  S | d   j                  j                         | d   j                  z   | d   j                  j                         z   S )Nr  r   r   r   )r   r   rstriplstripr-   s    r   r   zAddrSpec.value  sU    t9q=7== Aw}}##%d1gmm3DGMM4H4H4JJJr   c                     t        | j                        }t        |      t        |t        z
        kD  rt	        | j                        }n| j                  }| j
                  |dz   | j
                  z   S |S )N@)setr   r   DOT_ATOM_ENDSr   r   )r   namesetlps      r   r   zAddrSpec.addr_spec  s_    doo&w<#gm344doo.BB;;"8dkk))	r   N)
r3   r^   r_   rZ   rB   rb   r   r   r   r   rj   r   r   r  r    s\    JM" "  
 K K
  r   r  c                       e Zd ZdZdZy)ObsLocalPartzobs-local-partFNr  rj   r   r   r*  r*  &  s    !JMr   r*  c                   @     e Zd ZdZdZed        Ze fd       Z xZS )DisplayNamezdisplay-nameFc                    t        |       }t        |      dk(  r|j                  S |d   j                  dk(  r|j	                  d       n)|d   d   j                  dk(  rt        |d   dd        |d<   |d   j                  dk(  r|j	                          |j                  S |d   d   j                  dk(  rt        |d   d d       |d<   |j                  S )Nr   r   r   r   )r   r   r   rZ   pop)r   r   s     r   r   zDisplayName.display_name1  s    os8q=99q6&GGAJ1vay##v-"3q6!":.Ar7'GGI yy 2wr{%%/#CGCRL1Byyr   c                 n   d}| j                   rd}n| D ]  }|j                  dk(  sd} t        |       dk7  rs|rqdx}}| d   j                  dk(  s| d   d   j                  dk(  rd}| d   j                  dk(  s| d   d   j                  dk(  rd}|t        | j                        z   |z   S t
        |   S )	NFTr   r   r"   r   ri   r   )r   rZ   r   r   r   r   r   )r   r   r'   prepostr    s        r   r   zDisplayName.valueB  s    <<E !<<?2 E! t9>eOC$Aw!!6)T!WQZ-B-BF-JBx""F*d2hrl.E.Ev.M|D$5$566t;;7= r   )	r3   r^   r_   rZ   ra   rb   r   r   rc   rd   s   @r   r,  r,  ,  s4    J   ! !r   r,  c                   4    e Zd ZdZdZed        Zed        Zy)	LocalPartz
local-partFc                 b    | d   j                   dk(  r| d   j                  S | d   j                  S )Nr   r   )rZ   r   r   r-   s    r   r   zLocalPart.value[  s2    707'''7== r   c                    t         g}t         }d}| d   t         gz   D ]  }|j                  dk(  r|r2|j                  dk(  r#|d   j                  dk(  rt        |d d       |d<   t        |t              }|r?|j                  dk(  r0|d   j                  dk(  r|j	                  t        |dd               n|j	                  |       |d   }|} t        |dd       }|j
                  S )NFr   r   dotr   r   )DOTrZ   r   
isinstancer   r   )r   r   last
last_is_tltokis_tls         r   r   zLocalPart.local_partb  s     e
7cU? 	C~~'s~~6H''61#D"I.BsI.E$//U2F%%/

9SW-.

3r7DJ	 Ab	"yyr   N)r3   r^   r_   rZ   rB   rb   r   r   rj   r   r   r3  r3  V  s2    JM! !  r   r3  c                   @     e Zd ZdZdZe fd       Zed        Z xZS )DomainLiteralzdomain-literalFc                 R    dj                  t        |   j                               S r  r  r5   s    r   r   zDomainLiteral.domain  r  r   c                 L    | D ]  }|j                   dk(  s|j                  c S  y )Nptextr   ro   s     r   ipzDomainLiteral.ip  s&     	A||w&ww	r   )	r3   r^   r_   rZ   rB   rb   r   rB  rc   rd   s   @r   r>  r>  z  s3    !JM. .  r   r>  c                       e Zd ZdZdZdZy)MIMEVersionzmime-versionN)r3   r^   r_   rZ   majorminorrj   r   r   rD  rD    s    JEEr   rD  c                   <    e Zd ZdZdZdZdZed        Zed        Z	y)	Parameter	parameterFus-asciic                 <    | j                   r| d   j                  S dS r   )	sectionednumberr-   s    r   section_numberzParameter.section_number  s     "&tAw~~6Q6r   c                     | D ]n  }|j                   dk(  r|j                  c S |j                   dk(  s0|D ]:  }|j                   dk(  s|D ]#  }|j                   dk(  s|j                  c c c S  < p y)Nr   r   r   r"   )rZ   r   r   s     r   param_valuezParameter.param_value  s      	<E7*+++?2" <E''+??%* <E$//7:',';'; ;<<		< r   N)
r3   r^   r_   rZ   rL  extendedr   rb   rN  rP  rj   r   r   rH  rH    s<    JIHG7 7
  r   rH  c                       e Zd ZdZy)InvalidParameterinvalid-parameterNrt   rj   r   r   rS  rS    s    $Jr   rS  c                        e Zd ZdZed        Zy)	Attribute	attributec                 d    | D ]+  }|j                   j                  d      s|j                  c S  y )Nattrtext)rZ   endswithr   r   s     r   r   zAttribute.stripped_value  s/     	#E((4{{"	#r   Nr3   r^   r_   rZ   rb   r   rj   r   r   rV  rV    s    J# #r   rV  c                       e Zd ZdZdZy)SectionsectionN)r3   r^   r_   rZ   rM  rj   r   r   r]  r]    s    JFr   r]  c                        e Zd ZdZed        Zy)Valuer   c                     | d   }|j                   dk(  r| d   }|j                   j                  d      r|j                  S | j                  S )Nr   r   r   )r   rW  zextended-attribute)rZ   rZ  r   r   r   s     r   r   zValue.stripped_value  sP    Qv%GE$$DF'''zzr   Nr[  rj   r   r   r`  r`    s    J r   r`  c                   *    e Zd ZdZdZed        Zd Zy)MimeParametersmime-parametersFc              #   l  K   i }| D ]w  }|j                   j                  d      s|d   j                   dk7  r2|d   j                  j                         }||vrg ||<   ||   j	                  |j
                  |f       y |j                         D ]  \  }}t        |t        d            }|d   d   }|j                  }|j                  sRt        |      dkD  rD|d   d   dk(  r9|d   d   j                  j	                  t        j                  d             |d d }g }d}|D ]  \  }	}
|	|k7  ri|
j                  s/|
j                  j	                  t        j                  d             G|
j                  j	                  t        j                  d             |dz  }|
j                  }|
j                  rv	 t         j"                  j%                  |      }	 |j'                  |d	      }t-        j.                  |      r.|
j                  j	                  t        j0                                	 |j	                  |        dj5                  |      }||f  y # t(        t*        f$ r |j'                  d
d	      }Y w xY w# t*        $ r$ t         j"                  j3                  |d      }Y w xY ww)NrI  r   rW  )keyr   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingsurrogateescaperJ  zlatin-1)encodingr"   )rZ   rZ  r   stripr   rN  itemssortedr   r   rQ  r   r   r   InvalidHeaderDefectrP  urllibparseunquote_to_bytesdecodeLookupErrorUnicodeEncodeErrorr   _has_surrogatesUndecodableBytesDefectunquoter,   )r   paramsrH   namepartsfirst_paramr   value_partsirN  paramr   s               r   rv  zMimeParameters.params  s      	?E##,,[9Qx""k18>>'')D6!!t4L!5!5u =>	? "<<> 3	KD%5jm4E(1+K!))G ''CJN8A;!#!HQK''..v/I/IH0J K!"1IE KA). !*%!Q& !>>,,V-G-GI.K L ,,V-G-GF.H IQ))>>R & = =e DP$)LL:K$LE !007!MM001N1N1PQ""5)C!*D GGK(E+g3	R !,-?@ P
 %*LL=N$OEP . P !' 4 4UY 4 O	PsI   F6J49JI+A2J4!J>J4 JJ4*J1.J40J11J4c           	          g }| j                   D ]C  \  }}|r+|j                  dj                  |t        |                   3|j                  |       E dj	                  |      }|rd|z   S dS )N{}={}z; ri   r"   )rv  r   r2   r   r,   )r   rv  rw  r   s       r   r.   zMimeParameters.__str__  sj    ;; 	$KD%gnnT<3FGHd#		$
 6"%sV|-2-r   N)r3   r^   r_   rZ   r`   rb   rv  r.   rj   r   r   rc  rc    s&    "JOC CJ.r   rc  c                        e Zd ZdZed        Zy)ParameterizedHeaderValueFc                 `    t        |       D ]  }|j                  dk(  s|j                  c S  i S )Nrd  )reversedrZ   rv  r   s     r   rv  zParameterizedHeaderValue.params-  s5    d^ 	$E#44||#	$ 	r   N)r3   r^   r_   r`   rb   rv  rj   r   r   r  r  '  s     O r   r  c                       e Zd ZdZdZdZdZy)ContentTypezcontent-typeFtextplainN)r3   r^   r_   rZ   rB   maintypesubtyperj   r   r   r  r  5  s    JMHGr   r  c                       e Zd ZdZdZdZy)ContentDispositionzcontent-dispositionFN)r3   r^   r_   rZ   rB   content_dispositionrj   r   r   r  r  <  s    &JMr   r  c                       e Zd ZdZdZdZy)ContentTransferEncodingzcontent-transfer-encodingF7bitN)r3   r^   r_   rZ   rB   r   rj   r   r   r  r  B  s    ,JM
Cr   r  c                       e Zd ZdZdZy)HeaderLabelzheader-labelFNr  rj   r   r   r  r  H  s    JMr   r  c                       e Zd ZdZdZd Zy)MsgIDzmsg-idFc                 2    t        |       |j                  z   S r   )r   lineseprM   s     r   rN   z
MsgID.foldQ  s    4y6>>))r   N)r3   r^   r_   rZ   rB   rN   rj   r   r   r  r  M  s    JM*r   r  c                       e Zd ZdZy)	MessageIDz
message-idNrt   rj   r   r   r  r  V  s    Jr   r  c                       e Zd ZdZy)InvalidMessageIDzinvalid-message-idNrt   rj   r   r   r  r  Z  s    %Jr   r  c                       e Zd ZdZy)HeaderheaderNrt   rj   r   r   r  r  ^  rx   r   r  c                   r     e Zd ZdZdZdZ fdZ fdZd Ze	d        Z
d
 fd	Zd Ze	d        Zd	 Z xZS )TerminalTc                 D    t         |   | |      }||_        g |_        |S r   )r   __new__rZ   r   )clsr   rZ   r   r    s       r   r  zTerminal.__new__l  s&    wsE*$r   c                 h    dj                  | j                  j                  t        |                S r0   r1   r5   s    r   r4   zTerminal.__repr__r  s&    t~~668H8JKKr   c                 b    t        | j                  j                  dz   | j                  z          y )N/)rR   r    r3   rZ   r-   s    r   rU   zTerminal.pprintu  s"    dnn%%+doo=>r   c                 ,    t        | j                        S r   )listr   r-   s    r   r:   zTerminal.all_defectsx  s    DLL!!r   c           	          dj                  || j                  j                  | j                  t        |          | j                  sd      gS dj                  | j                              gS )Nz{}{}/{}({}){}r"   z {})r2   r    r3   rZ   r   r4   r   )r   rQ   r    s     r   rX   zTerminal._pp|  sg    &&NN##OOGllB  	
 ).T\\(B  	r   c                      y r   rj   r-   s    r   pop_trailing_wszTerminal.pop_trailing_ws  r  r   c                     g S r   rj   r-   s    r   rG   zTerminal.comments  s    	r   c                 0    t        |       | j                  fS r   )r   rZ   r-   s    r   __getnewargs__zTerminal.__getnewargs__  s    4y$//**r   r]   )r3   r^   r_   rB   ra   r`   r  r4   rU   rb   r:   rX   r  rG   r  rc   rd   s   @r   r  r  f  sZ    MOL? " "  +r   r  c                   "    e Zd Zed        Zd Zy)WhiteSpaceTerminalc                      yrh   rj   r-   s    r   r   zWhiteSpaceTerminal.value  rk   r   c                      y)NTrj   r-   s    r   r?   z!WhiteSpaceTerminal.startswith_fws  s    r   Nr3   r^   r_   rb   r   r?   rj   r   r   r  r    s     r   r  c                   "    e Zd Zed        Zd Zy)ValueTerminalc                     | S r   rj   r-   s    r   r   zValueTerminal.value  s    r   c                      y)NFrj   r-   s    r   r?   zValueTerminal.startswith_fws  s    r   Nr  rj   r   r   r  r    s     r   r  c                   "    e Zd Zed        Zd Zy)EWWhiteSpaceTerminalc                      yr  rj   r-   s    r   r   zEWWhiteSpaceTerminal.value  s    r   c                      yr  rj   r-   s    r   r.   zEWWhiteSpaceTerminal.__str__  s    r   N)r3   r^   r_   rb   r   r.   rj   r   r   r  r    s     r   r  c                       e Zd Zy)_InvalidEwErrorN)r3   r^   r_   rj   r   r   r  r    s    ;r   r  r6  ,list-separatorr$  zroute-component-markerz([{}]+)r"   z[^{}]+z[\x00-\x20\x7F]c                    	 t        |       }|r.| j                  j                  t        j                  |             t        j                  |       r/| j                  j                  t        j                  d             y y )Nz*Non-ASCII characters found in header token)_non_printable_finderr   r   r   NonPrintableDefectr   rs  rt  )xtextnon_printabless     r   _validate_xtextr    sd    J*51NV66~FGU#V::8: 	; $r   c                 $   	 t        | d      ^}}g }d}d}t        t        |            D ]6  }||   dk(  r
|rd}d}nd}|rd}n	||   |v r n|j                  ||          8 dz   }dj	                  |      dj	                  ||d  g|z         |fS )Nr   Fr   Tr"   )_wsp_splitterranger   r   r,   )r   endcharsfragment	remaindervcharsescapehad_qpposs           r   _get_ptext_to_endcharsr    s     )2HyFFFS]# C=D Fc]h&hsm$ Ag776?BGGXcd^$4y$@A6IIr   c                 t    	 | j                         }t        | d t        |       t        |      z
   d      }||fS )Nfws)r"  r  r   )r   newvaluer  s      r   get_fwsr    s?     ||~H
U#<CJs8}$<=u
EC=r   c                    	 t               }| j                  d      s$t        j                  dj	                  |             | dd  j                  dd      ^}}|| dd  k(  r$t        j                  dj	                  |             dj                  |      }t        |      dkD  rF|d   t        v r;|d   t        v r0|j                  d      dk  r|j                  dd      ^}}|dz   |z   }t        |j                               dkD  r.|j                  j                  t        j                  d	             | |_        dj                  |      } 	 t        j                  d|z   dz         \  }}}}	||_        ||_        |j                  j+                  |	       |ru|d   t,        v r t/        |      \  }
}|j                  |
       -t1        |d      ^}}t3        |d      }t5        |       |j                  |       dj                  |      }|ru| r9| d   t,        vr.|j                  j                  t        j                  d             || fS # t         t"        f$ r% t%        d
j	                  |j                              w xY w)N=?z"expected encoded word but found {}r   z?=r   r"   r   ?zwhitespace inside encoded wordz!encoded word format invalid: '{}'vtextz.missing trailing whitespace after encoded-word)r   
startswithr   HeaderParseErrorr2   r  r,   r   r   countr   r   rl  r   _ewrp  
ValueErrorKeyErrorr  r   r   rF   WSPr  r  r  r  )r   ewr;  r  remstrrestr  r   r   r   rH   charsr  s                r   get_encoded_wordr    se    
BD!%%077>@ 	@ABioodA.OC)
eABi%%077>@ 	@WWYFFaq	Yq	Y		#!<<a0yDj4
399;!


&44,. 	/BFGGIE@'*zz$*t2C'D$gtW BJBGJJg
7c>!$-KE4IIe)$2	eW-
		%wwy!  q$


&44<> 	?u9) ! @/66rvv>@ 	@@s    I 4I?c                     	 t               }| rZ| d   t        v r t        |       \  }} |j                  |       .d}| j	                  d      r	 t        |       \  }} d}t        |      dkD  rB|d   j                  dk7  r0|j                  j                  t        j                  d             d}|r2t        |      dkD  r$|d	   j                  d
k(  rt        |d   d      |d<   |j                  |       t        | d      ^}}|r(t        j!                  |      r| j#                  d      ^}}t%        |d      }t'        |       |j                  |       dj)                  |      } | rZ|S # t        $ r d}Y t        j                  $ r Y w xY w)Nr   Tr  r   r  z&missing whitespace before encoded wordFr   r   r  r"   )rr   r  r  r   r  r  r   rZ   r   r   rl  r  r  r  r  rfc2047_matchersearch	partitionr  r  r,   )r   rs   rH   valid_ewhave_wsr;  r  r  s           r   get_unstructuredr  ?  s   , )*L
8s?"5>LE5&D!/6u |$q(#B'22e;$,,33F4N4ND5F G"'s<014#B'22nD+?(,e,5R(##E*'q1i ..s3#ood3OC)c7+E"	"Q R A # ! **  s   E+ +F8FFc                 Z    	 t        | d      \  }} }t        |d      }t        |       || fS )Nz()rA  )r  r  r  r   rA  _s      r   get_qp_ctextr    s9    
 -UD9OE5!ug.EE%<r   c                 Z    	 t        | d      \  }} }t        |d      }t        |       || fS )Nr   rA  )r  r  r  r  s      r   get_qcontentr    s9     -UC8OE5!%)EE%<r   c                     	 t        |       }|s$t        j                  dj                  |             |j	                         }| t        |      d  } t        |d      }t        |       || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   r  r2   r   r   r  r  )r   mr  s      r   	get_atextr    sp    
 	e$A%%+2259; 	;GGIE#e*+E%)EE%<r   c                 L   	 | d   dk7  r$t        j                  dj                  |             t               }| dd  } | r'| d   dk(  rt	        |       \  }} |j                  |       | r| d   dk7  r| d   t        v rt        |       \  }} n| d d dk(  rd}	 t        |       \  }} |j                  j                  t        j                  d             d	}|rSt        |      dkD  rE|d
   j                  dk(  r3|d   j                  dk(  r!t        |d
   d      |d
<   nt	        |       \  }} |j                  |       | r	| d   dk7  r| s2|j                  j                  t        j                  d             || fS || dd  fS # t         j                  $ r t	        |       \  }} Y w xY w)Nr   r   zexpected '"' but found '{}'r   r   r  Fz!encoded word inside quoted stringTr   r  r  r   z"end of header inside quoted string)r   r  r2   r   r  r   r  r  r  r   rl  r   rZ   r  )r   bare_quoted_stringrH   r  s       r   get_bare_quoted_stringr    s    Qx3%%*11%8: 	:)+!"IEqS#E*u!!%(
E!HO8s?"5>LE52AY$H3/6u"**11&2L2L739 :
 C 23a7&r*55>*2.99^K-A*2..7&r* (.LE5!!%(+ E!HO, ""))&*D*D0+2 	3!5((uQRy((! ** 3+E2u3s   >E? ?!F#"F#c                    	 | r,| d   dk7  r$t        j                  dj                  |             t               }| dd  } | rc| d   dk7  r[| d   t        v rt        |       \  }} n%| d   dk(  rt        |       \  }} nt        |       \  }} |j                  |       | r	| d   dk7  r[| s2|j                  j                  t        j                  d             || fS || dd  fS )Nr   r   zexpected '(' but found '{}'r   r   zend of header inside comment)r   r  r2   r   r  r  get_commentr  r   r   rl  )r   rm   rH   s      r   r  r    s    
 qS%%)0079 	9iG!"IE
E!HO8s?"5>LE51X_&u-LE5'.LE5u E!HO v99* , 	-~E!"Ir   c                     	 t               }| rR| d   t        v rG| d   t        v rt        |       \  }} nt	        |       \  }} |j                  |       | r| d   t        v rG|| fS r>   )r~   CFWS_LEADERr  r  r  r   )r   r   rH   s      r   get_cfwsr    sl     :D
E!H+8s?"5>LE5&u-LE5E E!H+ ;r   c                    	 t               }| r*| d   t        v rt        |       \  }} |j                  |       t	        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS r>   )r   r  r  r   r  )r   quoted_stringrH   s      r   get_quoted_stringr    s     !NMq[(uU#)%0LE5q[(uU#%r   c                     	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r/| d   t        v r$t        j                  dj                  |             | j                  d      r	 t        |       \  }} nt        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS # t
        j                  $ r t        |       \  }} Y dw xY w)Nr   zexpected atom but found '{}'r  )r   r  r  r   	ATOM_ENDSr   r  r2   r  r  r  )r   r   rH   s      r   get_atomr    s     6Dq[(uEqY&%%*11%8: 	:	,+E2LE5 !'uKKq[(uE; && 	, %U+LE5	,s   ;C !C=<C=c                    	 t               }| r| d   t        v r$t        j                  dj	                  |             | r\| d   t        vrQt        |       \  }} |j                  |       | r"| d   dk(  r|j                  t               | dd  } | r| d   t        vrQ|d   t        u r't        j                  dj	                  d| z               || fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r	   r   r   z4expected atom at end of dot-atom-text but found '{}')r  r  r   r  r2   r  r   r7  )r   dot_atom_textrH   s      r   get_dot_atom_textr  0  s      MME!H	)%% '++16%=: 	:
E!HI- 'uU#U1X_  %!"IE E!HI- RC%% '#VCI.0 	0%r   c                    	 t               }| d   t        v rt        |       \  }} |j                  |       | j	                  d      r	 t        |       \  }} nt        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS # t        j                  $ r t        |       \  }} Y dw xY w)Nr   r  )	r  r  r  r   r  r  r   r  r  )r   dot_atomrH   s      r   get_dot_atomr  C  s    
 yHQx;u	4+E2LE5 )/uOOEq[(uU? && 	4 -U3LE5	4s   B& &!C
	C
c                 *   	 | d   t         v rt        |       \  }} nd }| st        j                  d      | d   dk(  rt	        |       \  }} n=| d   t
        v r$t        j                  dj                  |             t        |       \  }} ||g|d d || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r   z1Expected 'atom' or 'quoted-string' but found '{}')r  r  r   r  r  SPECIALSr2   r  )r   leaderrH   s      r   get_wordr  \  s     Qx; %%CE 	EQx}(/u	qX	%% '77=ve}F 	F  uHbq	%<r   c                    	 t               }	 t        |       \  }} |j                  |       | r| d   t        vr| d   dk(  rI|j                  t               |j
                  j                  t        j                  d             | dd  } n 	 t        |       \  }} |j                  |       | r| d   t        vr|| fS # t        j                  $ r1 |j
                  j                  t        j                  d             Y w xY w# t        j                  $ rL | d   t        v r=t        |       \  }} |j
                  j                  t        j                  d             n Y w xY w)Nzphrase does not start with wordr   r	   zperiod in 'phrase'r   zcomment found without atom)rv   r  r   r   r  r   rl  PHRASE_ENDSr7  ObsoleteHeaderDefectr  r  )r   rw   rH   s      r   
get_phraser  ~  sR   
 XF0ue E!HK/8S=MM#NN!!&"="=$#& '!"IE'u MM% ! E!HK/" 5=) "" 0f88-/ 	00 ** 8{*#+E?LE5NN))&*E*E4+6 7 7s%   B< D <AD ?D AE"!E"c                    	 t               }d }| d   t        v rt        |       \  }} | s$t        j                  dj                  |             	 t        |       \  }} ||g|d d |j                  |       | r| d   dk(  s| d   t        vrt        t        |      | z         \  }} |j                  dk(  r/|j                  j                  t        j                  d             n.|j                  j                  t        j                   d             ||d<   	 |j"                  j%                  d       || fS # t        j                  $ rK 	 t        |       \  }} n7# t        j                  $ r! | d   dk7  r| d   t        v r t               }Y nw xY wY 6w xY w# t&        $ r4 |j                  j                  t        j(                  d             Y || fS w xY w)	Nr   z"expected local-part but found '{}'r   invalid-obs-local-partz<local-part is not dot-atom, quoted-string, or obs-local-partz,local-part is not a dot-atom (contains CFWS)asciiz)local-part contains non-ASCII characters))r3  r  r  r   r  r2   r  r  r  r   r   get_obs_local_partr   rZ   r   rl  r  r   encoderr  NonASCIILocalPartDefect)r   r   r  rH   obs_local_parts        r   get_local_partr    s    JFQx; %%077>@ 	@ #E*u Hbq	e%(D.E!HK$? 23z?U3J K$$(@@%%f&@&@N'P Q %%f&A&A>'@ A&
1>( u1 ""  	 #E?LE5&& 	 Qx4E!H$;KE	  *  >!!&"@"@;#= 	>u>sH   D5 F 5F	EF1F	FFFF7GGc                    	 t               }d}| rB| d   dk(  s| d   t        vr.| d   dk(  rM|r.|j                  j                  t	        j
                  d             |j                  t               d}| dd  } l| d   dk(  rT|j                  t        | d   d             | dd  } |j                  j                  t	        j
                  d	             d}|r@|d
   j                  dk7  r.|j                  j                  t	        j
                  d             	 t        |       \  }} d}|j                  |       | r| d   dk(  r!| d   t        vr.|d   j                  dk(  s$|d   j                  dk(  r@|d   j                  dk(  r.|j                  j                  t	        j
                  d             |d
   j                  dk(  s$|d
   j                  dk(  r@|d   j                  dk(  r.|j                  j                  t	        j
                  d             |j                  rd|_        || fS # t        j                  $ r | d   t        vr t        |       \  }} Y 9w xY w)NFr   r   r	   zinvalid repeated '.'Tr   misplaced-specialz/'\' character outside of quoted-string/ccontentr   r6  zmissing '.' between wordsr   z!Invalid leading '.' in local partr  z"Invalid trailing '.' in local partr  )r*  r  r   r   r   rl  r7  r  rZ   r  r  r  r  )r   r  last_non_ws_was_dotrH   s       r   r  r    sk   !^N
U1Xt^uQx{'B8s?"&&--f.H.H*/, -!!#&"&!"IE1Xt^!!-a0C#E F!"IE""))&*D*DB+D E"'nR0;;uD""))&*D*D++- .	+#E?LE5"'
 	e$7 U1Xt^uQx{'B8 	q$$-1((&01((%/%%f&@&@/'1 	2r%%.2))612))50%%f&@&@0'2 	3$<!5  # && 	+Qx{*#E?LE5	+s   H2 2-I#"I#c                     	 t        | d      \  }} }t        |d      }|r.|j                  j                  t	        j
                  d             t        |       || fS )Nz[]rA  z(quoted printable found in domain-literal)r  r  r   r   r   r  r  )r   rA  r  s      r   	get_dtextr    s_    
 2%>E5&%)EV8868 	9E%<r   c                     | ry|j                  t        j                  d             |j                  t        dd             y)NFz"end of input inside domain-literal]domain-literal-endT)r   r   rl  r  )r   domain_literals     r   _check_for_early_dl_endr"    s?    &44,. /--ABCr   c                 p   	 t               }| d   t        v rt        |       \  }} |j                  |       | st	        j
                  d      | d   dk7  r$t	        j
                  dj                  |             | dd  } t        | |      r|| fS |j                  t        dd             | d   t        v rt        |       \  }} |j                  |       t        |       \  }} |j                  |       t        | |      r|| fS | d   t        v rt        |       \  }} |j                  |       t        | |      r|| fS | d   dk7  r$t	        j
                  dj                  |             |j                  t        dd	             | dd  } | r*| d   t        v rt        |       \  }} |j                  |       || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'r   zdomain-literal-startr  z4expected ']' at end of domain-literal but found '{}'r   )r>  r  r  r   r   r  r2   r"  r  r  r  r  )r   r!  rH   s      r   get_domain_literalr%    s    #_NQx;ue$%%&?@@Qx3%% '!!'0 	0!"IEun5u$$--CDEQx3u~ue$U#LE5% un5u$$Qx3u~ue$un5u$$Qx3%% '!!'0 	0--ABC!"IEq[(ue$5  r   c                     	 t               }d }| d   t        v rt        |       \  }} | s$t        j                  dj                  |             | d   dk(  r+t        |       \  }} ||g|d d |j                  |       || fS 	 t        |       \  }} | r| d   dk(  rt        j                  d      ||g|d d |j                  |       | r| d   dk(  r|j                  j                  t        j                  d             |d   j                  dk(  r|d   |d d  | rJ| d   dk(  rB|j                  t               t        | d	d        \  }} |j                  |       | r	| d   dk(  rB|| fS # t        j                  $ r t        |       \  }} Y w xY w)
Nr   zexpected domain but found '{}'r$  r$  zInvalid Domainr	   z(domain is not a dot-atom (contains CFWS)r  r   )r  r  r  r   r  r2   r%  r   r  r  r   r  rZ   r7  )r   r   r  rH   s       r   
get_domainr'  =  s    XFFQx; %%,33E:< 	<Qx3)%0uE"1Ieu}'#E*u qS%%&677Hbq	
MM%qSf9968 	9!9:-q	F1IaCMM##E!"I.LE5MM%  aC 5=! "" 'u's   E) )!FFc                 P   	 t               }t        |       \  }} |j                  |       | r| d   dk7  r2|j                  j                  t	        j
                  d             || fS |j                  t        dd             t        | dd        \  }} |j                  |       || fS )Nr   r$  z#addr-spec local part with no domainaddress-at-symbolr   )r  r  r   r   r   rl  r  r'  )r   r   rH   s      r   get_addr_specr*  c  s     
I!%(LE5UE!HO  !;!;1"3 	4%]3(;<=eABi(LE5Uer   c                    	 t               }| rw| d   dk(  s| d   t        v rd| d   t        v r t        |       \  }} |j                  |       n"| d   dk(  r|j                  t               | dd  } | r| d   dk(  rX| d   t        v rd| r| d   dk7  r$t        j                  dj                  |             |j                  t               t        | dd        \  }} |j                  |       | r| d   dk(  r|j                  t               | dd  } | snt| d   t        v rt        |       \  }} |j                  |       | d   dk(  r7|j                  t               t        | dd        \  }} |j                  |       | r	| d   dk(  r| st        j                  d      | d   dk7  r$t        j                  dj                  |             |j                  t        dd	             || dd  fS )
Nr   r  r   r$  z(expected obs-route domain but found '{}'z%end of header while parsing obs-route:z4expected ':' marking end of obs-route but found '{}'zend-of-obs-route-marker)r   r  r  r   ListSeparatorr   r  r2   RouteComponentMarkerr'  r  )r   	obs_routerH   s      r   get_obs_router0  s  s    
I
U1Xs]eAh+&=8{"#E?LE5U#1X_]+!"IE U1Xs]eAh+&= E!HO%%6==eDF 	F)*eABi(LE5U
E!HcM'ab	8{"#E?LE5U#8s?12%eABi0LE5U# E!HcM %%&MNNQx3%% (''-ve}6 	6]3(ABCeABir   c                 r   	 t               }| d   t        v rt        |       \  }} |j                  |       | r| d   dk7  r$t	        j
                  dj                  |             |j                  t        dd             | dd  } | d   dk(  rR|j                  t        dd             |j                  j                  t	        j                  d             | dd  } || fS 	 t        |       \  }} |j                  |       | r| d   dk(  r| dd  } n.|j                  j                  t	        j                  d             |j                  t        dd             | r*| d   t        v rt        |       \  }} |j                  |       || fS # t        j
                  $ r 	 t        |       \  }} |j                  j                  t	        j                  d	             n;# t        j
                  $ r% t	        j
                  d
j                  |             w xY w|j                  |       t        |       \  }} Y Hw xY w)Nr   <z"expected angle-addr but found '{}'zangle-addr-startr   >zangle-addr-endznull addr-spec in angle-addrz*obsolete route specification in angle-addrz.expected addr-spec or obs-route but found '{}'z"missing trailing '>' on angle-addr)r   r  r  r   r   r  r2   r  r   rl  r*  r0  r  )r   
angle_addrrH   s      r   get_angle_addrr5    s5    JQx;u% E!HO%%077>@ 	@mC);<=!"IE Qx3--=>?!!&"<"<*#, 	-ab	5  ,$U+u eqSab	!!&"<"<0#2 	3mC)9:;q[(u% u) "" 	,	P(/LE5%%f&A&A<'> ?&& 	P))@GGNP P	P 	% $U+u	,s*   F H6<GH68H"H65H6c                     	 t               }t        |       \  }} |j                  |d d         |j                  d d  |_        || fS r   )r,  r  rF   r   )r   r   rH   s      r   get_display_namer7    sL     =Le$LE5a! ==+Lr   c                    	 t               }d }| d   t        v r4t        |       \  }} | s$t        j                  dj                  |            | d   dk7  r| d   t        v r$t        j                  dj                  |             t        |       \  }} | s$t        j                  dj                  |            ||g|d   d d d }|j                  |       t        |       \  }} ||g|d d |j                  |       || fS )Nr   z!expected name-addr but found '{}'r2  )
r   r  r  r   r  r2   r  r7  r   r5  )r   	name_addrr  rH   s       r   get_name_addrr:    s&    
IFQx; ))3::6BD DQx38{"))3::5AC C'.u))3::5AC C"8E!HRaLF!%(LE5Hbq	Uer   c                 n   	 t               }	 t        |       \  }} t        d |j                  D              rd|_        |j                  |       || fS # t        j                  $ rN 	 t	        |       \  }} n;# t        j                  $ r% t        j                  dj                  |             w xY wY w xY w)Nzexpected mailbox but found '{}'c              3   P   K   | ]  }t        |t        j                           y wr   )r8  r   rl  r%   s     r   r(   zget_mailbox.<locals>.<genexpr>  s%      3 a334 3   $&r   )
r   r:  r   r  r*  r2   anyr:   rZ   r   )r   r   rH   s      r   get_mailboxr?    s    
 iGA$U+u  3 % 1 13 3.NN5E> "" A	A(/LE5&& 	A))188?A A	A As)   A B4'A65B468B..B43B4c                     	 t               }| r_| d   |vrX| d   t        v r$|j                  t        | d   d             | dd  } nt	        |       \  }} |j                  |       | r| d   |vrX|| fS )Nr   r  r   )r	  r  r   r  r  )r   r  invalid_mailboxrH   s       r   get_invalid_mailboxrB    s     %&O
E!HH,8{"""=q1D$F G!"IE%e,LE5""5) E!HH, E!!r   c                 ^   	 t               }| r| d   dk7  r	 t        |       \  }} |j                  |       | ra| d   dvrZ|d   }d|_        t        | d      \  }} |j                  |       |j                  j                  t        j                  d             | r"| d   dk(  r|j                  t               | d	d  } | r	| d   dk7  r|| fS # t        j                  $ rL d }| d   t
        v rt        |       \  }} | r| d   dv r@|j                  |       |j                  j                  t        j                  d             nt        | d      \  }} ||g|d d |j                  |       |j                  j                  t        j                  d             n| d   dk(  r/|j                  j                  t        j                  d             nVt        | d      \  }} ||g|d d |j                  |       |j                  j                  t        j                  d             Y w xY w)
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr  r   r   r   )r   r?  r   r   r  r  r  r   r  rB  rl  rZ   rF   r-  )r   mailbox_listrH   r  r   s        r   get_mailbox_listrF    s:   
 =L
E!HO	8&u-LE5&4 U1XT) #2&G!2G.ud;LE5NN5!  ''(B(B1)3 4U1X_.!"IEQ E!HOR K && 	8FQx;& (aD 0 ''/ ((//0K0K719 : $7ud#CLE5)%+Hbq	 ''. ((//0J0J91; <qS$$++F,G,G3-5 6  35$?u%!'E"1I##E*$$++F,F,F5-7 8/	8s   C EH,+H,c                    	 t               }| s2|j                  j                  t        j                  d             || fS d }| r{| d   t
        v rpt        |       \  }} | sC|j                  j                  t        j                  d             |j                  |       || fS | d   dk(  r|j                  |       || fS t        |       \  }} t        |j                        dk(  rV||j                  |       |j                  |       |j                  j                  t        j                  d             || fS ||g|d d |j                  |       || fS )Nzend of header before group-listr   zend of header in group-listrD  zgroup-list with empty entries)r   r   r   r   rl  r  r  rF  r   r   rF   r  )r   
group_listr  rH   s       r   get_group_listrI  W  sf    J!!&"<"<-#/ 	05  Fq[(  %%f&@&@-'/ 0f%u$$8s?f%u$$#E*LE5
5"f%% !!&"="=+#- 	.5  Hbq	eur   c                    	 t               }t        |       \  }} | r| d   dk7  r$t        j                  dj	                  |             |j                  |       |j                  t        dd             | dd  } | r*| d   dk(  r"|j                  t        dd             || dd  fS t        |       \  }} |j                  |       | s/|j                  j                  t        j                  d             n,| d   dk7  r$t        j                  d	j	                  |             |j                  t        dd             | dd  } | r*| d   t        v rt        |       \  }} |j                  |       || fS )
Nr   r,  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   rD  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r7  r   r  r2   r   r  rI  r   rl  r  r  )r   r   rH   s      r   	get_grouprK  |  sf    GE#E*LE5E!HO%% '**0&-9 	9	LL	LLs$CDE!"IEqS]3(:;<eABi!%(LE5	LLV77$& 	'	qS%%7>>uEG 	G	LLs$678!"IEq[(uU%<r   c                 (   	 t               }	 t        |       \  }} |j                  |       || fS # t        j                  $ rN 	 t	        |       \  }} n;# t        j                  $ r% t        j                  dj                  |             w xY wY uw xY w)Nzexpected address but found '{}')r   rK  r   r  r?  r2   r   )r   r   rH   s      r   get_addressrM    s      iGA 'u NN5E> "" A	A&u-LE5&& 	A))188?A A	A As'   0 BAB8BBBc                 l   	 t               }| r	 t        |       \  }} |j                  |       | re| d   dk7  r]|d   d   }d|_        t        | d      \  }} |j                  |       |j                  j                  t        j                  d             | r |j                  t        dd             | d	d  } | r|| fS # t        j                  $ ra d }| d   t
        v rt        |       \  }} | r| d   dk(  r@|j                  |       |j                  j                  t        j                  d             nt        | d      \  }} ||g|d d |j                  t        |g             |j                  j                  t        j                  d             n| d   dk(  r/|j                  j                  t        j                  d             n`t        | d      \  }} ||g|d d |j                  t        |g             |j                  j                  t        j                  d             Y w xY w)
Nr   r  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr   r   r  r   )r   rM  r   r   r  r  r  r   r  rB  r   rl  rZ   rF   r  )r   address_listrH   r  r   s        r   get_address_listrP    s5    =L
	8&u-LE5&4 U1X_ #2&q)G!2G.uc:LE5NN5!  ''(B(B1)3 4c3C DE!"IEQ R K && 	8FQx;& (aC ''/ ((//0K0K<1> ? $7uc#BLE5)%+Hbq	 ''(89 ((//0J0J91; <qS$$++F,G,G3-5 6  35#>u%!'E"1I##GUG$45$$++F,F,F5-7 8/	8s   B> >E1H32H3c                    	 t               }| s$t        j                  dj                  |             | d   dk7  r$t        j                  dj                  |             |j	                  t        dd             | dd  } t        |       \  }} |j	                  |       | r| d   dk7  r$t        j                  dj                  |             |j	                  t        dd	             || dd  fS )
Nz'expected no-fold-literal but found '{}'r   r$  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   r  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r  r   r  r2   r   r  r  )r   no_fold_literalrH   s      r   get_no_fold_literalrS    s    #oO%%5<<UCE 	EQx3%%#VE], 	, =.EFG!"IEU#LE55!E!HO%%#VE], 	, =.CDEE!"I%%r   c                 H   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r| d   dk7  r$t	        j
                  dj                  |             |j                  t        dd             | dd  } 	 t        |       \  }} |j                  |       | r| d   dk7  r\|j                  j                  t	        j                  d	             | r(| d   d
k(  r |j                  t        d
d             | dd  } || fS |j                  t        dd             | dd  } 	 t        |       \  }} |j                  |       | r| d   d
k(  r| dd  } n.|j                  j                  t	        j                  d             |j                  t        d
d             | r*| d   t        v rt        |       \  }} |j                  |       || fS # t        j
                  $ r} 	 t        |       \  }} |j                  j                  t	        j                  d             n;# t        j
                  $ r% t	        j
                  dj                  |             w xY wY w xY w# t        j
                  $ r 	 t        |       \  }} n# t        j
                  $ r| 	 t        |       \  }} |j                  j                  t	        j                  d             n;# t        j
                  $ r% t	        j
                  dj                  |             w xY wY nw xY wY w xY w)Nr   r2  zexpected msg-id but found '{}'zmsg-id-startr   zobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'r$  zmsg-id with no id-rightr3  z
msg-id-endr)  zobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)r  r  r  r   r   r  r2   r  r  r  r   r  rl  rS  r'  )r   msg_idrH   s      r   
get_msg_idrV    s   
 WFq[(ueE!HO%%,33E:< 	<
MM-^45!"IE1(/u MM%E!HOf88%' 	(
 U1X_MM-\:;!"IEu}
MM-%89:!"IE5(/u MM%qSab	f88,. 	/
MM-\23q[(ue5=a "" 	1	1-e4LE5NN!!&"="=,#. /&& 	1))""(&-1 1	1/		14 "" 5
	5.u5LE5&& 	55)%0u%%f&A&A1'3 4** 5--&&,fUm5 554	55sx   G -I( I%)<H&%I%&8II%$I%(L!<J
L!L<KL8LLL!LL! L!c                    	 t               }	 t        |       \  }} |j                  |       | r=|j                  j                  t	        j
                  dj                  |                    |S # t        j                  $ r^}t        |       }t        |      }|j                  j                  t	        j
                  dj                  |                   Y d }~|S d }~ww xY w)NzUnexpected {!r}zInvalid msg-id: {!r})
r  rV  r   r   r   rl  r2   r  r  r  )r   
message_idrH   exs       r   parse_message_idrZ  I  s    J2!%(u%  %%f&@&@!((/'1 2  "" K '%e,
!!&&'='D'DR'HI	K 	K Ks   A- -C ACCc                 l   	 t               }| s0|j                  j                  t        j                  d             |S | d   t
        v rOt        |       \  }} |j                  |       | s.|j                  j                  t        j                  d             d}| r6| d   dk7  r.| d   t
        vr#|| d   z  }| dd  } | r| d   dk7  r| d   t
        vr#|j                         sY|j                  j                  t        j                  dj                  |                   |j                  t        |d             n+t        |      |_        |j                  t        |d	             | r*| d   t
        v rt        |       \  }} |j                  |       | r| d   dk7  rY|j                  .|j                  j                  t        j                  d
             | r|j                  t        | d             |S |j                  t        dd             | dd  } | r*| d   t
        v rt        |       \  }} |j                  |       | s<|j                  .|j                  j                  t        j                  d
             |S d}| r&| d   t
        vr|| d   z  }| dd  } | r| d   t
        vr|j                         sY|j                  j                  t        j                  dj                  |                   |j                  t        |d             n+t        |      |_        |j                  t        |d	             | r*| d   t
        v rt        |       \  }} |j                  |       | rI|j                  j                  t        j                  d             |j                  t        | d             |S )Nz%Missing MIME version number (eg: 1.0)r   z0Expected MIME version number but found only CFWSr"   r	   r   z1Expected MIME major version number but found {!r}r  digitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)rD  r   r   r   HeaderMissingRequiredValuer  r  isdigitrl  r2   r  intrE  rF  )r   mime_versionrH   r\  s       r   parse_mime_versionra  e  su   
 =L##F$E$E3%5 	6Qx;uE"  ''(I(IB)D EF
E!HOa(C%(ab	 E!HOa(C >>##F$>$>?FFvN%P 	QM&':; [M&(;<q[(uE"E!HO)  ''(B(BB)D EeW =>c+>?@!"IEq[(uE")  ''(B(BB)D EF
E!HK/%(ab	 E!HK/ >>##F$>$>?FFvN%P 	QM&':; [M&(;<q[(uE"##F$>$>5%7 	8M%9:r   c                     	 t               }| ra| d   dk7  rY| d   t        v r$|j                  t        | d   d             | dd  } nt	        |       \  }} |j                  |       | r	| d   dk7  rY|| fS )Nr   rD  r  r   )rS  r  r   r  r  )r   invalid_parameterrH   s      r   get_invalid_parameterrd    s     )*
E!HO8{"$$]583F&H I!"IE%e,LE5$$U+ E!HO e##r   c                     	 t        |       }|s$t        j                  dj                  |             |j	                         }| t        |      d  } t        |d      }t        |       || fS )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   r  r2   r   r   r  r  )r   r  rf  s      r   	get_ttextrh    sp     	u%A%%+2259; 	;GGIE#e*+E%)EE%<r   c                 p   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r/| d   t        v r$t        j                  dj                  |             t        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS Nr   zexpected token but found '{}')	r   r  r  r   
TOKEN_ENDSr   r  r2   rh  )r   mtokenrH   s      r   	get_tokenrm    s     WFq[(ueqZ'%%+2259; 	;U#LE5
MM%q[(ue5=r   c                     	 t        |       }|s$t        j                  dj                  |             |j	                         }| t        |      d  } t        |d      }t        |       || fS )Nz expected attrtext but found {!r}rY  )_non_attribute_end_matcherr   r  r2   r   r   r  r  r   r  rY  s      r   get_attrtextrq    sp     	#5)A%%.55e<> 	>wwyH#h-.!EXz2HHU?r   c                 p   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r/| d   t        v r$t        j                  dj                  |             t        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS rj  )	rV  r  r  r   ATTRIBUTE_ENDSr   r  r2   rq  r   rW  rH   s      r   get_attributeru    s     Iq[(uq^+%%+2259; 	;&LE5Uq[(uer   c                     	 t        |       }|s$t        j                  dj                  |             |j	                         }| t        |      d  } t        |d      }t        |       || fS )Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherr   r  r2   r   r   r  r  rp  s      r   get_extended_attrtextry  	  ss     	,E2A%%7>>uEG 	GwwyH#h-.!EX':;HHU?r   c                 p   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r/| d   t        v r$t        j                  dj                  |             t        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS rj  )	rV  r  r  r   EXTENDED_ATTRIBUTE_ENDSr   r  r2   ry  rt  s      r   get_extended_attributer|  !	  s     Iq[(uq44%%+2259; 	;(/LE5Uq[(uer   c                 n   	 t               }| r| d   dk7  r$t        j                  dj                  |             |j	                  t        dd             | dd  } | r| d   j                         s$t        j                  dj                  |             d}| r6| d   j                         r#|| d   z  }| dd  } | r| d   j                         r#|d   dk(  r3|dk7  r.|j                  j	                  t        j                  d	             t        |      |_
        |j	                  t        |d
             || fS )Nr   *zExpected section but found {}zsection-markerr   z$Expected section number but found {}r"   0z'section number has an invalid leading 0r\  )r]  r   r  r2   r   r  r^  r   rl  r_  rM  )r   r^  r\  s      r   get_sectionr  7	  s7    iGE!HO%%&E&L&L(-'/ 0 	0NN=&678!"IEa((*%% '117@ 	@F
E!H$$&%(ab	 E!H$$& ayCFcMv999 ; 	<[GNNN=23E>r   c                 L   	 t               }| st        j                  d      d }| d   t        v rt	        |       \  }} | s$t        j                  dj                  |            | d   dk(  rt        |       \  }} nt        |       \  }} ||g|d d |j                  |       || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	r`  r   r  r  r  r2   r  r|  r   )r   vr  rH   s       r   	get_valuer  U	  s     	A%%&NOOFQx; %% '006v@ 	@Qx3(/u-e4uHbq	HHUOe8Or   c                 
   	 t               }t        |       \  }} |j                  |       | r| d   dk(  rA|j                  j                  t	        j
                  dj                  |                   || fS | d   dk(  rm	 t        |       \  }} d|_        |j                  |       | st	        j                  d      | d   dk(  r'|j                  t        dd             | dd  } d|_        | d   d	k7  rt	        j                  d
      |j                  t        d	d             | dd  } | r*| d   t        v rt        |       \  }} |j                  |       d }|}|j                  r| r| d   dk(  rt        |       \  }}|j                  }d}|j                   dk(  r(|r|d   dk(  rd}n/t#        |      \  }}|r|d   dk(  rd}n	 t%        |      \  }}|sd}	 |ra|j                  j                  t	        j
                  d             |j                  |       |D ]  }	|	j&                  dk(  sg |	d d  |	} n |} n0d }|j                  j                  t	        j
                  d             | r| d   dk(  rd }nt)        |       \  }} |j                  r|j                   dkD  rQ| r| d   dk7  r|j                  |       ||} || fS |j                  j                  t	        j
                  d             | sF|j                  j                  t	        j
                  d             |j                  |       |#|| fS |I|D ]  }	|	j&                  dk(  s n 	j&                  dk(   |j                  |	       |	j*                  |_        | d   dk7  r$t	        j                  dj                  |             |j                  t        dd             | dd  } | rf| d   dk7  r^t#        |       \  }} |j                  |       |j*                  |_        | r| d   dk7  r$t	        j                  dj                  |             |j                  t        dd             | dd  } |et1               }
| rV| d   t2        v rt5        |       \  }} n(| d   dk(  rt        dd      }| dd  } nt7        |       \  }} |
j                  |       | rV|
}nt)        |       \  }} |j                  |       ||} || fS # t        j                  $ r Y Ww xY w#  Y .xY w)Nr   rD  z)Parameter contains name ({}) but no valuer~  TzIncomplete parameterzextended-parameter-markerr   =zParameter not followed by '='parameter-separatorr   F'z5Quoted string value for extended parameter is invalidr   zZParameter marked as extended but appears to have a quoted string value that is non-encodedzcApparent initial-extended-value but attribute was not marked as extended or was not initial sectionz(Missing required charset/lang delimitersrw  rY  z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}DQUOTE)rH  ru  r   r   r   rl  r2   r  rL  r  r  rQ  r  r  r  r   rN  rq  ry  rZ   r  r   r   r   r`  r  r  r  )r   r|  rH   r  appendtoqstringinner_value
semi_validr  tr  s              r   get_parameterr  k	  s     KE 'LE5	LLE!HOV77 9%%+VE]4 	5e|Qx3	&u-LE5"EOLL ))*@AA8s?LLs,GHI!"IE!ENQx3%%&EFF	LLs$9:;!"IEq[(uUIH~~%E!HO /u5,,
1${1~4!
*;7tDGsN!%J&3K@t !%JMM  !;!;G"I JLL! <<#77AaD H	
  EIMM  !;!;:"; < qS 'u>>U11A5aCOOE"$!%<V77DE 	F V7768 	9%< <<#66 LLJ&OOAGGEM8s?)) +FFLfUmU Uc+>?@ab	U1X_'.LE5OOE"EJE!HO-- /<<BF5MK Kc+>?@ab	GQx3&u~uqS%c84ab	+E2uHHUO   'uOOE%<i && 		Ds   ?&S& T  &S=<S= Tc                    	 t               }| r	 t        |       \  }} |j                  |       | rp| d   dk7  rh|d   }d|_        t        |       \  }} |j                  |       |j                  j                  t        j                  dj                  |                   | r |j                  t        dd             | d	d  } | r|S # t        j                  $ r d }| d   t
        v rt        |       \  }} | s|j                  |       |cY S | d   dk(  rB||j                  |       |j                  j                  t        j                  d             ndt        |       \  }} |r|g|d d |j                  |       |j                  j                  t        j                  dj                  |                   Y w xY w)
Nr   rD  zparameter entry with no contentzinvalid parameter {!r}r   rT  z)parameter with invalid trailing text {!r}r  r   )rc  r  r   r   r  r  r  r   rl  rd  r2   rZ   rF   r  )r   mime_parametersrH   r  r|  s        r   parse_mime_parametersr  	  s    %&O
	=(/LE5""5)( U1X_ $B'E2E07LE5LL##**6+E+E;BB5I,K L""=6K#LM!"IEG H A && 	=FQx;& (&&v.&&Qx3%#**62''..v/I/I507 8  5U;u!'E"1I&&u-''..v/I/I,33E:0< =#	=s   C AF>B.F>=F>c                 B   	 |ra|d   dk7  rY|d   t         v r$| j                  t        |d   d             |dd  }nt        |      \  }}| j                  |       |r	|d   dk7  rY|sy | j                  t        dd             | j                  t	        |dd               y )Nr   rD  r  r   r  )r  r   r  r  r  )	tokenlistr   rH   s      r   _find_mime_parametersr  ,
  s     E!HO8{"]585HIJ!"IE%e,LE5U# E!HO ]3(=>?*5956r   c                 :   	 t               }| s0|j                  j                  t        j                  d             |S 	 t        |       \  }} |j                  |       | r| d   dk7  r>|j                  j                  t        j                  d             | rt        ||        |S |j                  j                         j                         |_        |j                  t        dd             | dd  } 	 t        |       \  }} |j                  |       |j                  j                         j                         |_        | s|S | d   d	k7  rO|j                  j                  t        j                  d
j                  |                    |`|`t        ||        |S |j                  t        d	d             |j                  t!        | dd               |S # t        j                  $ rN |j                  j                  t        j                  dj                  |                    t        ||        |cY S w xY w# t        j                  $ rN |j                  j                  t        j                  dj                  |                    t        ||        |cY S w xY w)Nz"Missing content type specificationz(Expected content maintype but found {!r}r   r  zInvalid content typezcontent-type-separatorr   z'Expected content subtype but found {!r}rD  z<Only parameters are valid after content type, but found {!r}r  )r  r   r   r   r]  rm  r  rl  r2   r  r   ri  lowerr  r  r  r  )r   ctyperH   s      r   parse_content_type_headerr  <
  sM    MEV>>02 	3 'u 
LL E!HOV77"$ 	%!%/[[&&(..0EN	LLs$<=>!"IE 'u 
LLKK%%'--/EMQx3V77( 	) NEMeU+	LLs$9:;	LL&uQRy12LQ "" V776==eDF 	GeU+	& "" V775<<UCE 	FeU+	s%   G 4H9 AH65H69AJJc                     	 t               }| s0|j                  j                  t        j                  d             |S 	 t        |       \  }} |j                  |       |j                  j                         j                         |_        | s|S | d   dk7  rK|j                  j                  t        j                  dj                  |                    t        ||        |S |j                  t        dd             |j                  t        | dd               |S # t        j                  $ rN |j                  j                  t        j                  dj                  |                    t        ||        |cY S w xY w)NzMissing content dispositionz+Expected content disposition but found {!r}r   rD  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r  r   r   r   r]  rm  r  rl  r2   r  r   ri  r  r  r  r  )r   disp_headerrH   s      r    parse_content_disposition_headerr  t
  sb    %&K""6#D#D)$+ 	, 'u u&+kk&7&7&9&?&?&AK#Qx3""6#=#=$( 	) 	k51}S*?@A,U12Y78# "" ""6#=#=9@@G$I 	Jk51	s   D AE=<E=c                    	 t               }| s0|j                  j                  t        j                  d             |S 	 t        |       \  }} |j                  |       |j                  j                         j                         |_	        | s|S | r|j                  j                  t        j                  d             | d   t        v r$|j                  t        | d   d             | dd  } nt        |       \  }} |j                  |       | r|S # t        j                  $ r@ |j                  j                  t        j                  dj                  |                    Y w xY w)Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   r  r   )r  r   r   r   r]  rm  r   ri  r  r   r  rl  r2   r  r  r  )r   
cte_headerrH   s      r   &parse_content_transfer_encoding_headerr  
  sR    )*J!!&"C"C/#1 	25 'u
 	% **,224

!!&"<"<8#: 	;8{"mE!H6IJK!"IE%e,LE5e$  # "" P!!&"<"<?FFuM#O 	PPs   D AE%$E%c                 Z    d}| r&| d   r!| d   d   t         v r| d   d   }| d   d d | d<   |S )Nr"   r   )r  )lineswsps     r   _steal_trailing_WSP_if_existsr  
  sD    
CruRy}3Bim"IcrNb	Jr   c                L   	 |j                   xs t        j                  }|j                  rdnd}dg}d }d}d}t	        dd      }t        |       }	|	rx|	j                  d      }
|
|u r|dz  }t        |
      }|
j                  dk(  rt        |      t        z  rd	}	 |j                  |       |}|
j                  dk(  rt        |
|||       ~|r|s|
j                   sd}d }|
j"                  r|
j%                  |      d t'        |j(                          }|j(                  |vrHt'        |      |t'        |d         z
  kD  rt+        |      }|j-                  |       |dxx   |z  cc<   t/        |
d      st        |
      |	z   }	nt1        |||||
j2                  |      }d}Vt'        |      |t'        |d         z
  k  r|dxx   |z  cc<   |
j"                  rFt'        |      dz   |k  r5t+        |      }|s|
j5                         r|j-                  ||z          d }t/        |
d      s4t        |
      }|
j                   s|dz  }|j-                  |       ||	z   }	|
j                   r|s|	j7                  d|
       d	}8t+        |      }|s|
j5                         r|j-                  ||z          n|dxx   |z  cc<   |	rx|j(                  j9                  |      |j(                  z   S # t        $ r' t        d
 |
j                  D              rd}nd}d	}Y rw xY w)Nutf-8rJ  r"   r   Fwrap_as_ew_blockedr   rA  Tc              3   P   K   | ]  }t        |t        j                           y wr   )r8  r   rt  r%   s     r   r(   z%_refold_parse_tree.<locals>.<genexpr>
  s%      . a!>!>? .r=  unknown-8bitrd  rJ   r   r  )max_line_lengthsysmaxsizeutf8r  r  r.  r   rZ   r%  r
  r  rr  r>  r:   _fold_mime_parametersrB   r`   rN   r   r  r  r   r[   _fold_as_ewra   r?   insertr,   )
parse_treerK   maxlenrh  r  last_ewr  want_encodingend_ew_not_allowedrx  rC   tstrr   encoded_partnewlinenewpartss                   r   rL   rL   
  s'    ##2s{{F ++w:HDEGM!"&:;E
yy|%%!#4y??g%#d)h*> M	!KK!G ??//!$vx@!3%% %''#'99F9#;<Qc&..>Q=Q#RL~~\9|,vE"I/FF&CE&JG!LL1b	\1	 
 4*T
U* &dE67&*&=&=wH!Mt9U2Y//"II   D	A'3E:G$--/Wt^,tX&DzH%%"a'" 23u$E&8 LLD! M/6d))+LL4( "IIo p >>u%66Y " 	! . ,,. .( " M	!s   K3 3,L#"L#c                 p   	 |*|r(t        t        |d   |d  | z               } |d   d | |d<   | d   t        v rB| d   }| dd  } t        |d         |k(  r|j	                  t        |             |dxx   |z  cc<   d}| d   t        v r
| d   }| d d } |t        |d         n|}|dk(  rdn|}	t        |	      dz   }
|
dz   |k\  rt        j                  d      | r|t        |d         z
  }||
z
  }|dk  r|j	                  d	       /| d | }t        j                  ||	
      }t        |      |z
  }|dkD  r0|d d }t        j                  ||	
      }t        |      |z
  }|dkD  r0|dxx   |z  cc<   | t        |      d  } | r|j	                  d	       t        |d         }| r|dxx   |z  cc<   |r|S d S )Nr   r   r   r"   rJ  r     z3max_line_length is too small to fit an encoded wordri   )r   )
r   r  r  r   r   r  r   r  r  r  )	to_encoder  r  r  ra   r   leading_wsptrailing_wspnew_last_ew	encode_as
chrome_lenremaining_space
text_spaceto_encode_wordencoded_wordexcesss                   r   r  r  /  s   	 1U2Ywx09<=?	"Ihw'b	|s  labM	b	Nf$LL6u=>b	[ 	L} }crN	$+O#eBi.K"j0gI Y!#JQ6!%%AC 	C  3uRy>1$z1
?LL";J/zz.)D\"_4qj ,CR0N::niHL&8F qj 	b	\!	c.123	LLeBi.K+ , 
"II,;6$6r   c           	         	 | j                   D ]  \  }}|d   j                         j                  d      s|dxx   dz  cc<   |}d}	 |j                  |       d}|r6t        j                  j                  |d	|
      }	dj                  |||	      }
ndj                  |t        |            }
t        |d         t        |
      z   dz   |k  r|d   dz   |
z   |d<   t        |
      dz   |k  r|j                  d|
z          d}|dz   }|st        |      t        t        |            z   dz   t        |      z   }||dz   k  rd}||z
  dz
  x}}	 |d | }t        j                  j                  |d	|
      }	t        |	      |k  rn|dz  }<|j                  dj                  ||||	             d	}|dz  }||d  }|r|dxx   dz  cc<   |r y # t        $ r" d}t        j                  |      rd}d}nd}Y w xY w)Nr   rD  strictFTr  rg  r  r"   )safer   z
{}*={}''{}r~  r   ri   r   r   z''r  N   z {}*{}*={}{})rv  r!  rZ  r  rr  r   rs  rm  rn  r   r2   r   r   r   r   )rC   r  r  rh  rw  r   r   error_handlerencoding_requiredencoded_valuer  r^  extra_chromer  
splitpointmaxcharspartials                    r   r  r  p  sK    {{ :!e Ry!**3/"II 		"LL" % "LL..B} / 6M&&tWmDD>>$U(;<DuRy>CI%)F2b	C$.E"IY]f$LLt$ ~TSW%66:S=NNJa'
 $*Z$7!$;;J, & 2 2"] !3 !<}%1a
  LL..g|]< =LqLG*+&Eb	S 	- I:! " 	" $$$U+( 1!	"s   	G'G?>G?)rer  rm  stringr   operatorr   emailr   r  r   r   r%  r  r  r
  r  r&  r  	TSPECIALSrk  	ASPECIALSrs  r{  r   compileVERBOSE	MULTILINEr  r  r   rf   rr   rv   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  r  r  r  r*  r,  r3  r>  rD  rH  rS  rV  r]  r`  rc  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r7  r-  r.  r2   r,   r  r  r  matchr  findallr  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*  r0  r5  r7  r:  r?  rB  rF  rI  rK  rM  rP  rS  rV  rZ  ra  rd  rh  rm  rq  ru  ry  r|  r  r  r  r  r  r  r  r  r  rL   r  r  rj   r   r   <module>r     s  CJ 
 
    '   
%jCHn sN	CH$U#E
"c#h.	_
E
"	S(3s83 H "**  ZZ",, @, @,FD) D I  Y 9 " 9 I 
) #9 #6	-| 	-! 4C) C&%i %2?) ?%	 %"$I $*"y "6	 DDy D!i !6;Y ;.Y .i ) 
I 
y B9 '!& '!T!	 !HI  ) 	 8%y %
#	 #i I S.Y S.ly * 1 i ) 
*I * &y &Y (+s (+V H - <f-- < Cc#34$S*BC . 

:,,RWWS\:;AA"

9#3#3BIIbggi !$# $$)E "

#56>> #I$4$4BIIbggj!"%$ %%*U 'RZZ	(8(8BIIbggn%&)( )). &0bjj1A1ABIIbgg-./21 '227% $;J<
/bAF" ))V2 $6 &2 D$L%N-!^(%!N$L ' R,\<*"$6r#J<:4n&,BJ8BH$$&.&.$,<,KZ2h7 6p<^e7N?7BI!r   