a
    ze                 	   @   s  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B Zed	ZeeB Zeed
 Zeed ZeedB ed
 ZeeB ZeedB ZeeB Zeed Zdd Ze de je jB ZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$G d d! d!eZ%G d"d# d#eZ&G d$d% d%eZ'G d&d' d'e'Z(G d(d) d)eZ)G d*d+ d+eZ*G d,d- d-eZ+G d.d/ d/eZ,G d0d1 d1eZ-G d2d3 d3eZ.G d4d5 d5eZ/G d6d7 d7eZ0G d8d9 d9eZ1G d:d; d;eZ2G d<d= d=eZ3G d>d? d?eZ4G d@dA dAeZ5G dBdC dCeZ6G dDdE dEeZ7G dFdG dGeZ8G dHdI dIeZ9G dJdK dKe!Z:G dLdM dMeZ;G dNdO dOeZ<G dPdQ dQeZ=G dRdS dSeZ>G dTdU dUe>Z?G dVdW dWeZ@G dXdY dYeZAG dZd[ d[eZBG d\d] d]eZCG d^d_ d_eZDG d`da daeDZEG dbdc dceDZFG ddde deeZGG dfdg dgeZHG dhdi dieZIG djdk dkeIZJG dldm dmeJZKG dndo doeZLG dpdq dqeMZNG drds dseNZOG dtdu dueNZPG dvdw dweOZQG dxdy dye
jRZSePd
dzZTePd{d|ZUePd}d~ZVe dWdXejYZZe dWe [dXej\Z]e dj^Z_e dWe [dXej\Z`e dWe [dXej\Zae dWe [dXej\Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd ZddĄ ZddƄ ZddȄ Zddʄ Zdd̄ Zdd΄ ZddЄ Zdd҄ ZddԄ Zddք Zdd؄ Zddڄ Zdd܄ Zddބ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N)	hexdigits)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%c                 C   s    dt | dddd d S )N"\\\z\")strreplacevalue r   0/usr/lib/python3.9/email/_header_value_parser.pyquote_string`   s    r   z
   =\?            # literal =?
   [^?]*          # charset
   \?             # literal ?
   [qQbB]         # literal 'q' or 'b', case insensitive
   \?             # literal ?
  .*?             # encoded word
  \?=             # literal ?=
c                       s   e Zd ZdZdZdZ fddZdd Z fddZe	d	d
 Z
e	dd Zdd Ze	dd Ze	dd Zdd ZdddZdddZdddZ  ZS )	TokenListNTc                    s   t  j|i | g | _d S N)super__init__defects)selfargskw	__class__r   r   r   y   s    zTokenList.__init__c                 C   s   d dd | D S )N c                 s   s   | ]}t |V  qd S r   r   .0xr   r   r   	<genexpr>~       z$TokenList.__str__.<locals>.<genexpr>joinr   r   r   r   __str__}   s    zTokenList.__str__c                    s   d | jjt  S Nz{}({})formatr   __name__r   __repr__r'   r   r   r   r-      s    
zTokenList.__repr__c                 C   s   d dd | D S )Nr   c                 s   s   | ]}|j r|j V  qd S r   r   r    r   r   r   r#      r$   z"TokenList.value.<locals>.<genexpr>r%   r'   r   r   r   r      s    zTokenList.valuec                 C   s   t dd | D | jS )Nc                 s   s   | ]}|j V  qd S r   )all_defectsr    r   r   r   r#      r$   z(TokenList.all_defects.<locals>.<genexpr>)sumr   r'   r   r   r   r.      s    zTokenList.all_defectsc                 C   s   | d   S Nr   )startswith_fwsr'   r   r   r   r1      s    zTokenList.startswith_fwsc                 C   s   t dd | D S )Nc                 s   s   | ]}|j V  qd S r   )as_ew_allowed)r!   partr   r   r   r#      r$   z*TokenList.as_ew_allowed.<locals>.<genexpr>)allr'   r   r   r   r2      s    zTokenList.as_ew_allowedc                 C   s   g }| D ]}| |j q|S r   )extendcomments)r   r6   tokenr   r   r   r6      s    zTokenList.commentsc                C   s   t | |dS )Npolicy)_refold_parse_treer   r9   r   r   r   fold   s    zTokenList.foldr   c                 C   s   t | j|d d S )Nindent)printppstrr   r>   r   r   r   pprint   s    zTokenList.pprintc                 C   s   d | j|dS )N
r=   )r&   _pprA   r   r   r   r@      s    zTokenList.ppstrc                 c   sz   d || jj| jV  | D ]4}t|ds:|d | V  q||d E d H  q| jrdd | j}nd}d ||V  d S )Nz{}{}/{}(rD   z*    !! invalid element in token list: {!r}z    z Defects: {}r   z{}){})r+   r   r,   
token_typehasattrrD   r   )r   r>   r7   extrar   r   r   rD      s    

zTokenList._pp)r   )r   )r   )r,   
__module____qualname__rE   syntactic_breakew_combine_allowedr   r(   r-   propertyr   r.   r1   r2   r6   r<   rB   r@   rD   __classcell__r   r   r   r   r   s   s&   





r   c                   @   s$   e Zd Zedd Zedd ZdS )WhiteSpaceTokenListc                 C   s   dS N r   r'   r   r   r   r      s    zWhiteSpaceTokenList.valuec                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|jqS )comment)rE   contentr    r   r   r   
<listcomp>   r$   z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   r'   r   r   r   r6      s    zWhiteSpaceTokenList.commentsN)r,   rH   rI   rL   r   r6   r   r   r   r   rN      s   
rN   c                   @   s   e Zd ZdZdS )UnstructuredTokenListunstructuredNr,   rH   rI   rE   r   r   r   r   rT      s   rT   c                   @   s   e Zd ZdZdS )PhrasephraseNrV   r   r   r   r   rW      s   rW   c                   @   s   e Zd ZdZdS )WordZwordNrV   r   r   r   r   rY      s   rY   c                   @   s   e Zd ZdZdS )CFWSListcfwsNrV   r   r   r   r   rZ      s   rZ   c                   @   s   e Zd ZdZdS )AtomatomNrV   r   r   r   r   r\      s   r\   c                   @   s   e Zd ZdZdZdS )Tokenr7   FN)r,   rH   rI   rE   Zencode_as_ewr   r   r   r   r^      s   r^   c                   @   s   e Zd ZdZdZdZdZdS )EncodedWordencoded-wordN)r,   rH   rI   rE   ctecharsetlangr   r   r   r   r_      s   r_   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	QuotedStringquoted-stringc                 C   s"   | D ]}|j dkr|j  S qd S Nbare-quoted-stringrE   r   r   r"   r   r   r   rR      s    
zQuotedString.contentc                 C   s>   g }| D ]*}|j dkr&|t| q||j qd|S )Nrg   r   )rE   appendr   r   r&   )r   resr"   r   r   r   quoted_value   s    
zQuotedString.quoted_valuec                 C   s"   | D ]}|j dkr|j  S qd S rf   rh   r   r7   r   r   r   stripped_value   s    
zQuotedString.stripped_valueN)r,   rH   rI   rE   rL   rR   rl   rn   r   r   r   r   rd      s   

	rd   c                   @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringrg   c                 C   s   t ddd | D S )Nr   c                 s   s   | ]}t |V  qd S r   r   r    r   r   r   r#      r$   z+BareQuotedString.__str__.<locals>.<genexpr>)r   r&   r'   r   r   r   r(      s    zBareQuotedString.__str__c                 C   s   d dd | D S )Nr   c                 s   s   | ]}t |V  qd S r   r   r    r   r   r   r#     r$   z)BareQuotedString.value.<locals>.<genexpr>r%   r'   r   r   r   r     s    zBareQuotedString.valueN)r,   rH   rI   rE   r(   rL   r   r   r   r   r   ro      s   ro   c                   @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )CommentrQ   c                    s(   d tdg fdd D dggg S )Nr   r   c                    s   g | ]}  |qS r   )quoter    r'   r   r   rS     r$   z#Comment.__str__.<locals>.<listcomp>))r&   r/   r'   r   r'   r   r(     s    zComment.__str__c                 C   s2   |j dkrt|S t|ddddddS )NrQ   r   r   r   z\(rr   z\))rE   r   r   )r   r   r   r   r   rq     s    
zComment.quotec                 C   s   d dd | D S )Nr   c                 s   s   | ]}t |V  qd S r   r   r    r   r   r   r#     r$   z"Comment.content.<locals>.<genexpr>r%   r'   r   r   r   rR     s    zComment.contentc                 C   s   | j gS r   )rR   r'   r   r   r   r6     s    zComment.commentsN)	r,   rH   rI   rE   r(   rq   rL   rR   r6   r   r   r   r   rp     s   
rp   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	AddressListzaddress-listc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|qS )addressrE   r    r   r   r   rS   '  r$   z)AddressList.addresses.<locals>.<listcomp>r   r'   r   r   r   	addresses%  s    zAddressList.addressesc                 C   s   t dd | D g S )Nc                 s   s   | ]}|j d kr|jV  qdS rt   NrE   	mailboxesr    r   r   r   r#   +  s   z(AddressList.mailboxes.<locals>.<genexpr>r/   r'   r   r   r   ry   )  s
    zAddressList.mailboxesc                 C   s   t dd | D g S )Nc                 s   s   | ]}|j d kr|jV  qdS rw   rE   all_mailboxesr    r   r   r   r#   0  s   z,AddressList.all_mailboxes.<locals>.<genexpr>rz   r'   r   r   r   r|   .  s
    zAddressList.all_mailboxesN)r,   rH   rI   rE   rL   rv   ry   r|   r   r   r   r   rs   !  s   

rs   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Addressrt   c                 C   s   | d j dkr| d jS d S )Nr   grouprE   display_namer'   r   r   r   r   8  s    zAddress.display_namec                 C   s4   | d j dkr| d gS | d j dkr*g S | d jS Nr   mailboxinvalid-mailboxrx   r'   r   r   r   ry   =  s
    
zAddress.mailboxesc                 C   s:   | d j dkr| d gS | d j dkr0| d gS | d jS r   r{   r'   r   r   r   r|   E  s
    

zAddress.all_mailboxesN)r,   rH   rI   rE   rL   r   ry   r|   r   r   r   r   r}   4  s   

r}   c                   @   s(   e Zd ZdZedd Zedd ZdS )MailboxListmailbox-listc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|qS )r   ru   r    r   r   r   rS   S  r$   z)MailboxList.mailboxes.<locals>.<listcomp>r   r'   r   r   r   ry   Q  s    zMailboxList.mailboxesc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d v r|qS ))r   r   ru   r    r   r   r   rS   W  s   
z-MailboxList.all_mailboxes.<locals>.<listcomp>r   r'   r   r   r   r|   U  s    zMailboxList.all_mailboxesNr,   rH   rI   rE   rL   ry   r|   r   r   r   r   r   M  s
   
r   c                   @   s(   e Zd ZdZedd Zedd ZdS )	GroupList
group-listc                 C   s    | r| d j dkrg S | d jS Nr   r   rx   r'   r   r   r   ry   _  s    zGroupList.mailboxesc                 C   s    | r| d j dkrg S | d jS r   r{   r'   r   r   r   r|   e  s    zGroupList.all_mailboxesNr   r   r   r   r   r   [  s
   
r   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Groupr~   c                 C   s   | d j dkrg S | d jS N   r   rx   r'   r   r   r   ry   p  s    zGroup.mailboxesc                 C   s   | d j dkrg S | d jS r   r{   r'   r   r   r   r|   v  s    zGroup.all_mailboxesc                 C   s
   | d j S r0   )r   r'   r   r   r   r   |  s    zGroup.display_nameN)r,   rH   rI   rE   rL   ry   r|   r   r   r   r   r   r   l  s   

r   c                   @   sL   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	dS )NameAddr	name-addrc                 C   s   t | dkrd S | d jS N   r   )lenr   r'   r   r   r   r     s    zNameAddr.display_namec                 C   s
   | d j S N
local_partr'   r   r   r   r     s    zNameAddr.local_partc                 C   s
   | d j S r   domainr'   r   r   r   r     s    zNameAddr.domainc                 C   s
   | d j S r   )router'   r   r   r   r     s    zNameAddr.routec                 C   s
   | d j S r   	addr_specr'   r   r   r   r     s    zNameAddr.addr_specN
r,   rH   rI   rE   rL   r   r   r   r   r   r   r   r   r   r     s   



r   c                   @   s@   e Zd ZdZedd Zedd Zedd Zedd	 Zd
S )	AngleAddrz
angle-addrc                 C   s"   | D ]}|j dkr|j  S qd S N	addr-spec)rE   r   ri   r   r   r   r     s    
zAngleAddr.local_partc                 C   s"   | D ]}|j dkr|j  S qd S r   rE   r   ri   r   r   r   r     s    
zAngleAddr.domainc                 C   s"   | D ]}|j dkr|j  S qd S )N	obs-route)rE   domainsri   r   r   r   r     s    
zAngleAddr.routec                 C   s<   | D ]2}|j dkr|jr"|j  S t|j|j   S qdS )Nr   z<>)rE   r   r   r   ri   r   r   r   r     s    

zAngleAddr.addr_specN)	r,   rH   rI   rE   rL   r   r   r   r   r   r   r   r   r     s   


r   c                   @   s   e Zd ZdZedd ZdS )ObsRouter   c                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|jqS r   r   r    r   r   r   rS     r$   z$ObsRoute.domains.<locals>.<listcomp>r   r'   r   r   r   r     s    zObsRoute.domainsN)r,   rH   rI   rE   rL   r   r   r   r   r   r     s   r   c                   @   sL   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	dS )Mailboxr   c                 C   s   | d j dkr| d jS d S Nr   r   r   r'   r   r   r   r     s    zMailbox.display_namec                 C   s
   | d j S r0   r   r'   r   r   r   r     s    zMailbox.local_partc                 C   s
   | d j S r0   r   r'   r   r   r   r     s    zMailbox.domainc                 C   s   | d j dkr| d jS d S r   )rE   r   r'   r   r   r   r     s    zMailbox.routec                 C   s
   | d j S r0   r   r'   r   r   r   r     s    zMailbox.addr_specNr   r   r   r   r   r     s   



r   c                   @   s,   e Zd ZdZedd Ze Z Z ZZ	dS )InvalidMailboxr   c                 C   s   d S r   r   r'   r   r   r   r     s    zInvalidMailbox.display_nameNr   r   r   r   r   r     s   
r   c                       s(   e Zd ZdZdZe fddZ  ZS )Domainr   Fc                    s   d t j S Nr   r&   r   r   splitr'   r   r   r   r     s    zDomain.domain)r,   rH   rI   rE   r2   rL   r   rM   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )DotAtomdot-atomNrV   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )DotAtomTextzdot-atom-textTNr,   rH   rI   rE   r2   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )NoFoldLiteralzno-fold-literalFNr   r   r   r   r   r      s   r   c                   @   sD   e Zd ZdZdZedd Zedd Zedd Zed	d
 Z	dS )AddrSpecr   Fc                 C   s
   | d j S r0   r   r'   r   r   r   r   
  s    zAddrSpec.local_partc                 C   s   t | dk rd S | d jS )N   r   )r   r   r'   r   r   r   r     s    zAddrSpec.domainc                 C   s<   t | dk r| d jS | d j | d j | d j  S )Nr   r   r   r   )r   r   rstriplstripr'   r   r   r   r     s    
zAddrSpec.valuec                 C   sL   t | j}t|t|t kr*t| j}n| j}| jd urH|d | j S |S )N@)setr   r   DOT_ATOM_ENDSr   r   )r   ZnamesetZlpr   r   r   r     s    

zAddrSpec.addr_specN)
r,   rH   rI   rE   r2   rL   r   r   r   r   r   r   r   r   r     s   


r   c                   @   s   e Zd ZdZdZdS )ObsLocalPartzobs-local-partFNr   r   r   r   r   r   &  s   r   c                       s4   e Zd ZdZdZedd Ze fddZ  ZS )DisplayNamezdisplay-nameFc                 C   s   t | }t|dkr|jS |d jdkr4|d n*|d d jdkr^t |d dd  |d< |d jdkrv|  n*|d d jdkrt |d d d |d< |jS )Nr   r[   r   r   )r   r   r   rE   pop)r   rk   r   r   r   r   1  s    
zDisplayName.display_namec                    s   d}| j rd}n| D ]}|jdkrd}qt| dkr|rd }}| d jdks`| d d jdkrdd}| d jdks| d d jdkrd}|t| j | S t jS d S )	NFTre   r   r   r[   rP   r   )r   rE   r   r   r   r   r   )r   rq   r"   preZpostr   r   r   r   B  s    
  zDisplayName.value)	r,   rH   rI   rE   rK   rL   r   r   rM   r   r   r   r   r   ,  s   
r   c                   @   s,   e Zd ZdZdZedd Zedd ZdS )	LocalPartz
local-partFc                 C   s&   | d j dkr| d jS | d jS d S )Nr   re   )rE   rl   r   r'   r   r   r   r   [  s    
zLocalPart.valuec                 C   s   t g}t }d}| d t g D ]}|jdkr,q|r\|jdkr\|d jdkr\t|d d |d< t|t}|r|jdkr|d jdkr|t|dd   n
|| |d }|}qt|dd }|jS )NFr   r[   dotr   r   )DOTrE   r   
isinstancerj   r   )r   rk   ZlastZ
last_is_tltokZis_tlr   r   r   r   b  s(    


zLocalPart.local_partN)r,   rH   rI   rE   r2   rL   r   r   r   r   r   r   r   V  s   
r   c                       s4   e Zd ZdZdZe fddZedd Z  ZS )DomainLiteralzdomain-literalFc                    s   d t j S r   r   r'   r   r   r   r     s    zDomainLiteral.domainc                 C   s"   | D ]}|j dkr|j  S qd S )Nptextrh   ri   r   r   r   ip  s    
zDomainLiteral.ip)	r,   rH   rI   rE   r2   rL   r   r   rM   r   r   r   r   r   z  s   r   c                   @   s   e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r,   rH   rI   rE   majorminorr   r   r   r   r     s   r   c                   @   s4   e Zd ZdZdZdZdZedd Zedd Z	dS )		Parameter	parameterFus-asciic                 C   s   | j r| d jS dS r   )	sectionednumberr'   r   r   r   section_number  s    zParameter.section_numberc                 C   sf   | D ]\}|j dkr|j  S |j dkr|D ]4}|j dkr*|D ] }|j dkr<|j      S q<q*qdS )Nr   re   rg   r   )rE   rn   rm   r   r   r   param_value  s    




zParameter.param_valueN)
r,   rH   rI   rE   r   extendedrb   rL   r   r   r   r   r   r   r     s   
r   c                   @   s   e Zd ZdZdS )InvalidParameterinvalid-parameterNrV   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZedd ZdS )	Attribute	attributec                 C   s$   | D ]}|j dr|j  S qd S )Nattrtext)rE   endswithr   rm   r   r   r   rn     s    zAttribute.stripped_valueNr,   rH   rI   rE   rL   rn   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )SectionsectionN)r,   rH   rI   rE   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZedd ZdS )Valuer   c                 C   s2   | d }|j dkr| d }|j dr,|jS | jS )Nr   r[   r   )re   r   zextended-attribute)rE   r   rn   r   rm   r   r   r   rn     s    
zValue.stripped_valueNr   r   r   r   r   r     s   r   c                   @   s(   e Zd ZdZdZedd Zdd ZdS )MimeParametersmime-parametersFc                 c   s  i }| D ]T}|j dsq|d j dkr*q|d j }||vrHg ||< || |j|f q| D ]~\}}t|tdd}|d d }|j	}|j
st|dkr|d d dkr|d d jtd |d d }g }d}|D ]\}	}
|	|kr(|
j
s|
jtd qn|
jtd |d7 }|
j}|
j
rztj|}W n$ tyr   tjj|d	d
}Y nT0 z||d}W n$ ttfy   |dd}Y n0 t|r|
jt  || qd|}||fV  qfd S )Nr   r   r   )keyr   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingzlatin-1)encodingsurrogateescaper   r   )rE   r   r   striprj   r   itemssortedr   rb   r   r   r   r   InvalidHeaderDefectr   urllibparseunquote_to_bytesUnicodeEncodeErrorunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr&   )r   paramsr7   namepartsZfirst_paramrb   Zvalue_partsir   paramr   r   r   r   r     s`    



zMimeParameters.paramsc                 C   sT   g }| j D ].\}}|r.|d|t| q
|| q
d|}|rPd| S dS )N{}={}z; rP   r   )r   rj   r+   r   r&   )r   r   r   r   r   r   r   r(     s    
zMimeParameters.__str__N)r,   rH   rI   rE   rJ   rL   r   r(   r   r   r   r   r     s
   
Er   c                   @   s   e Zd ZdZedd ZdS )ParameterizedHeaderValueFc                 C   s&   t | D ]}|jdkr|j  S qi S )Nr   )reversedrE   r   rm   r   r   r   r   -  s    
zParameterizedHeaderValue.paramsN)r,   rH   rI   rJ   rL   r   r   r   r   r   r   '  s   r   c                   @   s   e Zd ZdZdZdZdZdS )ContentTypezcontent-typeFtextZplainN)r,   rH   rI   rE   r2   maintypesubtyper   r   r   r   r   5  s   r   c                   @   s   e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r,   rH   rI   rE   r2   content_dispositionr   r   r   r   r   <  s   r   c                   @   s   e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r,   rH   rI   rE   r2   ra   r   r   r   r   r   B  s   r   c                   @   s   e Zd ZdZdZdS )HeaderLabelzheader-labelFNr   r   r   r   r   r   H  s   r   c                   @   s   e Zd ZdZdZdd ZdS )MsgIDzmsg-idFc                 C   s   t | |j S r   )r   linesepr;   r   r   r   r<   Q  s    z
MsgID.foldN)r,   rH   rI   rE   r2   r<   r   r   r   r   r   M  s   r   c                   @   s   e Zd ZdZdS )	MessageIDz
message-idNrV   r   r   r   r   r   V  s   r   c                   @   s   e Zd ZdZdS )InvalidMessageIDzinvalid-message-idNrV   r   r   r   r   r   Z  s   r   c                   @   s   e Zd ZdZdS )HeaderheaderNrV   r   r   r   r   r   ^  s   r   c                       sr   e Zd ZdZdZdZ fddZ fddZdd Ze	dd	 Z
d fdd	Zdd Ze	dd Zdd Z  ZS )TerminalTc                    s   t  | |}||_g |_|S r   )r   __new__rE   r   )clsr   rE   r   r   r   r   r   l  s    zTerminal.__new__c                    s   d | jjt  S r)   r*   r'   r   r   r   r-   r  s    zTerminal.__repr__c                 C   s   t | jjd | j  d S )N/)r?   r   r,   rE   r'   r   r   r   rB   u  s    zTerminal.pprintc                 C   s
   t | jS r   )listr   r'   r   r   r   r.   x  s    zTerminal.all_defectsr   c              	      s2   d || jj| jt  | js"dn
d | jgS )Nz{}{}/{}({}){}r   z {})r+   r   r,   rE   r   r-   r   rA   r   r   r   rD   |  s    zTerminal._ppc                 C   s   d S r   r   r'   r   r   r   pop_trailing_ws  s    zTerminal.pop_trailing_wsc                 C   s   g S r   r   r'   r   r   r   r6     s    zTerminal.commentsc                 C   s   t | | jfS r   )r   rE   r'   r   r   r   __getnewargs__  s    zTerminal.__getnewargs__)r   )r,   rH   rI   r2   rK   rJ   r   r-   rB   rL   r.   rD   r  r6   r  rM   r   r   r   r   r   f  s   
	
r   c                   @   s    e Zd Zedd Zdd ZdS )WhiteSpaceTerminalc                 C   s   dS rO   r   r'   r   r   r   r     s    zWhiteSpaceTerminal.valuec                 C   s   dS )NTr   r'   r   r   r   r1     s    z!WhiteSpaceTerminal.startswith_fwsNr,   rH   rI   rL   r   r1   r   r   r   r   r    s   
r  c                   @   s    e Zd Zedd Zdd ZdS )ValueTerminalc                 C   s   | S r   r   r'   r   r   r   r     s    zValueTerminal.valuec                 C   s   dS )NFr   r'   r   r   r   r1     s    zValueTerminal.startswith_fwsNr  r   r   r   r   r    s   
r  c                   @   s    e Zd Zedd Zdd ZdS )EWWhiteSpaceTerminalc                 C   s   dS r   r   r'   r   r   r   r     s    zEWWhiteSpaceTerminal.valuec                 C   s   dS r   r   r'   r   r   r   r(     s    zEWWhiteSpaceTerminal.__str__N)r,   rH   rI   rL   r   r(   r   r   r   r   r	    s   
r	  c                   @   s   e Zd ZdS )_InvalidEwErrorN)r,   rH   rI   r   r   r   r   r
    s   r
  r   ,list-separatorr   zroute-component-markerz([{}]+)r   z[^{}]+z[\x00-\x20\x7F]c                 C   s>   t | }|r| jt| t| r:| jtd d S )Nz*Non-ASCII characters found in header token)_non_printable_finderr   rj   r   ZNonPrintableDefectr   r   r   )xtextZnon_printablesr   r   r   _validate_xtext  s    

r  c                 C   s   t | d^}}g }d}d}tt|D ]L}|| dkrJ|rDd}d}nd}q&|rTd}n|| |v rd q||||  q&|d }d|d||d  g| |fS )Nr   Fr   Tr   )_wsp_splitterranger   rj   r&   )r   endcharsfragment	remainderZvcharsescapehad_qpposr   r   r   _get_ptext_to_endchars  s$    	r  c                 C   s.   |   }t| d t| t|  d}||fS )Nfws)r   r  r   )r   Znewvaluer  r   r   r   get_fws  s    r  c              	   C   s  t  }| ds td| | dd  dd^}}|| dd  krXtd| d|}t|dkr|d tv r|d tv r|	ddk r|dd^}}|d | }t| dkr|j
td	 | |_d|} ztd| d \}}}}	W n( ttfy(   td
|jY n0 ||_||_|j
|	 |r|d tv rpt|\}
}||
 qBt|d^}}t|d}t| || d|}qB| r| d tvr|j
td || fS )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   HeaderParseErrorr+   r   r&   r   r   countr   rj   r   ra   _ewr   
ValueErrorKeyErrorr
  rb   rc   r5   WSPr  r  r  r  )r   Zewr   r  Zremstrrestr   rb   rc   r   r7   charsr  r   r   r   get_encoded_word  sd    











r'  c                 C   sB  t  }| r>| d tv r0t| \}} || qd}| drzt| \}} W n( tyd   d}Y n tjyv   Y nr0 d}t	|dkr|d j
dkr|jtd d}|rt	|dkr|d	 j
d
krt|d d|d< || qt| d^}}|rt|r| d^}}t|d}t| || d|} q|S )Nr   Tr  Fr   r  z&missing whitespace before encoded wordr   r`   r  r   )rT   r$  r  rj   r  r'  r
  r   r  r   rE   r   r   r	  r  rfc2047_matchersearch	partitionr  r  r&   )r   rU   r7   valid_ewZhave_wsr   r  r  r   r   r   get_unstructured?  sH    





r-  c                 C   s*   t | d\}} }t|d}t| || fS )Nz()r   )r  r  r  r   r   _r   r   r   get_qp_ctext  s    
r0  c                 C   s*   t | d\}} }t|d}t| || fS )Nr
   r   )r  r  r  r.  r   r   r   get_qcontent  s    

r1  c                 C   sN   t | }|std| | }| t|d  } t|d}t| || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   r  r+   r~   r   r  r  )r   mr2  r   r   r   	get_atext  s    
r5  c                 C   sp  | d dkrt d| t }| dd  } | rT| d dkrTt| \}} || | r@| d dkr@| d tv rt| \}} n| d d dkr(d}z&t| \}} |j	t 
d d	}W n  t jy   t| \}} Y n0 |r4t|dkr4|d
 jdkr4|d jdkr4t|d
 d|d
< nt| \}} || qT| s`|j	t 
d || fS || dd  fS )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  r+   ro   r1  rj   r$  r  r'  r   r   r   rE   r	  )r   Zbare_quoted_stringr7   r,  r   r   r   get_bare_quoted_string  sJ    



r6  c                 C   s   | r | d dkr t d| t }| dd  } | r| d dkr| d tv r\t| \}} n&| d dkrvt| \}} nt| \}} || q2| s|j	t 
d || fS || dd  fS )Nr   r   zexpected '(' but found '{}'r   rr   zend of header inside comment)r   r  r+   rp   r$  r  get_commentr0  rj   r   r   )r   rQ   r7   r   r   r   r7    s&    
r7  c                 C   sP   t  }| rH| d tv rH| d tv r0t| \}} nt| \}} || q|| fS r0   )rZ   CFWS_LEADERr$  r  r7  rj   )r   r[   r7   r   r   r   get_cfws  s    r9  c                 C   sp   t  }| r,| d tv r,t| \}} || t| \}} || | rh| d tv rht| \}} || || fS r0   )rd   r8  r9  rj   r6  )r   Zquoted_stringr7   r   r   r   get_quoted_string  s    


r:  c                 C   s   t  }| r,| d tv r,t| \}} || | rL| d tv rLtd| | drzt	| \}} W q tjy   t
| \}} Y q0 nt
| \}} || | r| d tv rt| \}} || || fS )Nr   zexpected atom but found '{}'r  )r\   r8  r9  rj   	ATOM_ENDSr   r  r+   r  r'  r5  )r   r]   r7   r   r   r   get_atom  s&    



r<  c                 C   s   t  }| r| d tv r&td| | rt| d tvrtt| \}} || | r&| d dkr&|t | dd  } q&|d tu rtdd|  || 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  r+   r5  rj   r   )r   Zdot_atom_textr7   r   r   r   get_dot_atom_text0  s     

r=  c                 C   s   t  }| d tv r(t| \}} || | drfzt| \}} W qr tjyb   t| \}} Y qr0 nt| \}} || | r| d tv rt| \}} || || fS )Nr   r  )	r   r8  r9  rj   r  r'  r   r  r=  )r   Zdot_atomr7   r   r   r   get_dot_atomC  s    



r>  c                 C   s   | d t v rt| \}} nd }| s,td| d dkrFt| \}} n*| d tv rdtd| nt| \}} |d ur|g|d d< || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r
   z1Expected 'atom' or 'quoted-string' but found '{}')r8  r9  r   r  r:  SPECIALSr+   r<  )r   leaderr7   r   r   r   get_word\  s"    rA  c                 C   s   t  }zt| \}} || W n& tjyF   |jtd Y n0 | r| d tvr| d dkr|t |jt	d | dd  } qHzt| \}} W nB tjy   | d t
v rt| \}} |jt	d n Y n0 || qH|| fS )Nzphrase does not start with wordr   r   zperiod in 'phrase'r   zcomment found without atom)rW   rA  rj   r   r  r   r   PHRASE_ENDSr   ObsoleteHeaderDefectr8  r9  )r   rX   r7   r   r   r   
get_phrase~  s4    



rD  c                 C   sp  t  }d }| d tv r"t| \}} | s6td| zt| \}} W nZ tjy   zt| \}} W n4 tjy   | d dkr| d tv r t	 }Y n0 Y n0 |d ur|g|d d< |
| | r0| d dks| d tvr0tt||  \}} |jdkr|j
td n|j
td ||d< z|jd W n& tyf   |j
td Y n0 || fS )	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))r   r8  r9  r   r  r+   r>  rA  rB  r   rj   get_obs_local_partr   rE   r   r   rC  r   encoder   ZNonASCIILocalPartDefect)r   r   r@  r7   obs_local_partr   r   r   get_local_part  sJ    
 


rJ  c                 C   s  t  }d}| r&| d dks*| d tvr&| d dkrj|rL|jtd |t d}| dd  } q
nD| d dkr|t| d d | dd  } |jtd	 d}q
|r|d
 jdkr|jtd zt	| \}} d}W n2 tj
y   | d tvr t| \}} Y n0 || q
|d jdksV|d jdkrh|d jdkrh|jtd |d
 jdks|d
 jdkr|d jdkr|jtd |jrd|_|| fS )NFr   r   r   zinvalid repeated '.'Tr   misplaced-specialz/'\' character outside of quoted-string/ccontentr   r   zmissing '.' between wordsr[   z!Invalid leading '.' in local partr(  z"Invalid trailing '.' in local partrE  )r   rB  r   rj   r   r   r   r  rE   rA  r  r8  r9  )r   rI  Zlast_non_ws_was_dotr7   r   r   r   rG    sj     





rG  c                 C   s@   t | d\}} }t|d}|r0|jtd t| || fS )Nz[]r   z(quoted printable found in domain-literal)r  r  r   rj   r   rC  r  )r   r   r  r   r   r   	get_dtext  s    

rL  c                 C   s,   | rdS | td | tdd dS )NFz"end of input inside domain-literal]domain-literal-endT)rj   r   r   r  )r   domain_literalr   r   r   _check_for_early_dl_end  s    rP  c                 C   sj  t  }| d tv r(t| \}} || | s6td| d dkrRtd| | dd  } t| |rp|| fS |tdd | d t	v rt
| \}} || t| \}} || t| |r|| fS | d t	v rt
| \}} || t| |r|| fS | d dkrtd| |tdd	 | dd  } | rb| d tv rbt| \}} || || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'r   zdomain-literal-startrM  z4expected ']' at end of domain-literal but found '{}'rN  )r   r8  r9  rj   r   r  r+   rP  r  r$  r  rL  )r   rO  r7   r   r   r   get_domain_literal  sH    








rR  c                 C   sp  t  }d }| d tv r"t| \}} | s6td| | d dkrvt| \}} |d urd|g|d d< || || fS zt| \}} W n  tjy   t	| \}} Y n0 | r| d dkrtd|d ur|g|d d< || | rh| d dkrh|j
td |d jdkr(|d |d d < | rh| d dkrh|t t	| d	d  \}} || q(|| fS )
Nr   zexpected domain but found '{}'rQ  r   zInvalid Domainr   z(domain is not a dot-atom (contains CFWS)r   r   )r   r8  r9  r   r  r+   rR  rj   r>  r<  r   rC  rE   r   )r   r   r@  r7   r   r   r   
get_domain=  sD    




rS  c                 C   s|   t  }t| \}} || | r,| d dkrF|jtd || fS |tdd t| dd  \}} || || fS )Nr   r   z#addr-spec local part with no domainaddress-at-symbolr   )r   rJ  rj   r   r   r   r  rS  )r   r   r7   r   r   r   get_addr_specc  s    


rU  c                 C   s  t  }| rj| d dks"| d tv rj| d tv rFt| \}} || q| d dkr|t | dd  } q| rz| d dkrtd| |t t	| dd  \}} || | r>| d dkr>|t | dd  } | sq>| d tv rt| \}} || | d dkr|t t	| dd  \}} || q| sNtd| d dkrltd| |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   r8  r9  rj   ListSeparatorr   r  r+   RouteComponentMarkerrS  r  )r   Z	obs_router7   r   r   r   get_obs_routes  sF    






rY  c                 C   s  t  }| d tv r(t| \}} || | r8| d dkrHtd| |tdd | dd  } | d dkr|tdd |jt	d | dd  } || fS zt
| \}} W nv tjy,   z"t| \}} |jtd	 W n& tjy   td
| Y n0 || t
| \}} Y n0 || | rZ| d dkrZ| dd  } n|jt	d |tdd | r| d tv rt| \}} || || fS )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   r8  r9  rj   r   r  r+   r  r   r   rU  rY  rC  )r   Z
angle_addrr7   r   r   r   get_angle_addr  sT    








r\  c                 C   s<   t  }t| \}} ||d d   |jd d  |_|| fS r   )r   rD  r5   r   )r   r   r7   r   r   r   get_display_name  s
    r]  c                 C   s   t  }d }| d tv r6t| \}} | s6td|| d dkr| d tv r^td| t| \}} | s~td||d ur|g|d d d< d }|| t	| \}} |d ur|g|d d< || || fS )Nr   z!expected name-addr but found '{}'rZ  )
r   r8  r9  r   r  r+   rB  r]  rj   r\  )r   Z	name_addrr@  r7   r   r   r   get_name_addr  s6    

r^  c                 C   s   t  }zt| \}} W nJ tjy`   zt| \}} W n$ tjyZ   td| Y n0 Y n0 tdd |jD r|d|_|	| || fS )Nzexpected mailbox but found '{}'c                 s   s   | ]}t |tjV  qd S r   )r   r   r   r    r   r   r   r#     s   zget_mailbox.<locals>.<genexpr>r   )
r   r^  r   r  rU  r+   anyr.   rE   rj   )r   r   r7   r   r   r   get_mailbox  s     
r`  c                 C   sd   t  }| r\| d |vr\| d tv rD|t| d d | dd  } qt| \}} || q|| fS )Nr   rK  r   )r   rB  rj   r  rD  )r   r  Zinvalid_mailboxr7   r   r   r   get_invalid_mailbox  s    ra  c                 C   s  t  }| r| d dkrzt| \}} || W n tjy:   d }| d tv rt| \}} | rt| d dv r|| |jtd n@t	| d\}} |d ur|g|d d< || |jt
d nb| d dkr|jtd nBt	| d\}} |d ur|g|d d< || |jt
d Y n0 | r| d dvr|d }d|_t	| d\}} || |jt
d | r| d dkr|t | d	d  } q|| fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr  r   r   r   )r   r`  rj   r   r  r8  r9  r   rC  ra  r   rE   r5   rW  )r   Zmailbox_listr7   r@  r   r   r   r   get_mailbox_list  sX    










rc  c                 C   s  t  }| s$|jtd || fS d }| r| d tv rt| \}} | sl|jtd || || fS | d dkr|| || fS t| \}} t|j	dkr|d ur|| |
| |jtd || fS |d ur|g|d d< || || fS )Nzend of header before group-listr   zend of header in group-listrb  zgroup-list with empty entries)r   r   rj   r   r   r8  r9  rc  r   r|   r5   rC  )r   Z
group_listr@  r7   r   r   r   get_group_listW  s>    







rd  c                 C   s   t  }t| \}} | r"| d dkr2td| || |tdd | dd  } | r| d dkr|tdd || dd  fS t| \}} || | s|jt	d n| d dkrtd	| |tdd | dd  } | r| d t
v rt| \}} || || fS )
Nr   rV  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   rb  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r]  r   r  r+   rj   r  rd  r   r   r8  r9  )r   r~   r7   r   r   r   	get_group|  s8    



re  c                 C   st   t  }zt| \}} W nJ tjy`   zt| \}} W n$ tjyZ   td| Y n0 Y n0 || || fS )Nzexpected address but found '{}')r}   re  r   r  r`  r+   rj   )r   rt   r7   r   r   r   get_address  s    
rf  c              
   C   s  t  }| rzt| \}} || W n$ tjyL } zd }| d tv rt| \}} | rj| d dkr|| |jtd nFt	| d\}} |d ur|g|d d< |t
|g |jtd nh| d dkr|jtd nHt	| d\}} |d ur|g|d d< |t
|g |jtd W Y d }~n
d }~0 0 | r| d dkr|d d }d|_t	| d\}} || |jtd | r|tdd | d	d  } q|| fS )
Nr   r  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr   r   r  r   )rs   rf  rj   r   r  r8  r9  r   rC  ra  r}   r   rE   r5   r  )r   Zaddress_listr7   errr@  r   r   r   r   get_address_list  sX    








rh  c                 C   s   t  }| std| | d dkr6td| |tdd | dd  } t| \}} || | rx| d dkrtd| |tdd	 || dd  fS )
Nz'expected no-fold-literal but found '{}'r   rQ  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   rM  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r   r   r  r+   rj   r  rL  )r   Zno_fold_literalr7   r   r   r   get_no_fold_literal  s.    
ri  c                 C   s  t  }| r,| d tv r,t| \}} || | r<| d dkrLtd| |tdd | dd  } zt| \}} W n\ tjy   z"t	| \}} |j
td W n$ tjy   td| Y n0 Y n0 || | r| d dkr<|j
td	 | r4| d d
kr4|td
d | dd  } || fS |tdd | dd  } zt| \}} W n tjy   zt| \}} W nr tjy } zVz"t| \}} |j
td W n& tjy   td| Y n0 W Y d }~n
d }~0 0 Y n0 || | r0| d d
kr0| dd  } n|j
td |td
d | r|| d tv r|t| \}} || || fS )Nr   rZ  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-rightr[  z
msg-id-endrT  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   r8  r9  rj   r   r  r+   r  r=  rG  r   rC  r   ri  rS  )r   Zmsg_idr7   er   r   r   
get_msg_id  s~    






&


rk  c              
   C   s   t  }zt| \}} || W nN tjyn } z4t| }t|}|jtd	| W Y d }~n&d }~0 0 | r|jtd	|  |S )NzInvalid msg-id: {!r}zUnexpected {!r})
r   rk  rj   r   r  r-  r   r   r   r+   )r   Z
message_idr7   exr   r   r   parse_message_idI  s    
rm  c                 C   s  t  }| s |jtd |S | d tv rXt| \}} || | sX|jtd d}| r| d dkr| d tvr|| d 7 }| dd  } q\| s|jtd	| |t
|d nt||_|t
|d	 | r| d tv rt| \}} || | r| d dkrT|jd ur:|jtd
 | rP|t
| d |S |t
dd | dd  } | r| d tv rt| \}} || | s|jd ur|jtd
 |S d}| r| d tvr|| d 7 }| dd  } q| s*|jtd	| |t
|d nt||_|t
|d	 | rn| d tv rnt| \}} || | r|jtd |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)r   r   rj   r   HeaderMissingRequiredValuer8  r9  isdigitr   r+   r  intr   r   )r   Zmime_versionr7   rn  r   r   r   parse_mime_versione  s    













rr  c                 C   sd   t  }| r\| d dkr\| d tv rD|t| d d | dd  } qt| \}} || q|| fS )Nr   rb  rK  r   )r   rB  rj   r  rD  )r   Zinvalid_parameterr7   r   r   r   get_invalid_parameter  s    rs  c                 C   sN   t | }|std| | }| t|d  } t|d}t| || fS )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   r  r+   r~   r   r  r  )r   r4  rt  r   r   r   	get_ttext  s    	
rv  c                 C   s   t  }| r,| d tv r,t| \}} || | rL| d tv rLtd| t| \}} || | r| d tv rt| \}} || || fS Nr   zexpected token but found '{}')	r^   r8  r9  rj   
TOKEN_ENDSr   r  r+   rv  )r   Zmtokenr7   r   r   r   	get_token  s    	


ry  c                 C   sN   t | }|std| | }| t|d  } t|d}t| || fS )Nz expected attrtext but found {!r}r   )_non_attribute_end_matcherr   r  r+   r~   r   r  r  r   r4  r   r   r   r   get_attrtext  s    	
r|  c                 C   s   t  }| r,| d tv r,t| \}} || | rL| d tv rLtd| t| \}} || | r| d tv rt| \}} || || fS rw  )	r   r8  r9  rj   ATTRIBUTE_ENDSr   r  r+   r|  r   r   r7   r   r   r   get_attribute  s    	


r  c                 C   sN   t | }|std| | }| t|d  } t|d}t| || fS )Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherr   r  r+   r~   r   r  r  r{  r   r   r   get_extended_attrtext	  s    
r  c                 C   s   t  }| r,| d tv r,t| \}} || | rL| d tv rLtd| t| \}} || | r| d tv rt| \}} || || fS rw  )	r   r8  r9  rj   EXTENDED_ATTRIBUTE_ENDSr   r  r+   r  r~  r   r   r   get_extended_attribute!	  s    


r  c                 C   s   t  }| r| d dkr&td| |tdd | dd  } | rR| d  sbtd| d}| r| d  r|| d 7 }| dd  } qf|d dkr|dkr|jtd	 t	||_
|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 0rn  )r   r   r  r+   rj   r  rp  r   ZInvalidHeaderErrorrq  r   )r   r   rn  r   r   r   get_section7	  s,    	

r  c                 C   s   t  }| stdd }| d tv r0t| \}} | sDtd|| d dkr^t| \}} nt| \}} |d ur|g|d d< || || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r
   )	r   r   r  r8  r9  r+   r:  r  rj   )r   vr@  r7   r   r   r   	get_valueU	  s"    

r  c                 C   s  t  }t| \}} || | r,| d dkrL|jtd| || fS | d dkrz t| \}} d|_|| W n tj	y   Y n0 | st	d| d dkr|t
dd | dd  } d|_| d d	krt	d
|t
d	d | dd  } d }| r*| d tv r*t| \}} || d }|}|jrD| rD| d dkrDt| \}}|j}d}|jdkr|r|d dkrd}n$t|\}}	|	r|	d dkrd}n(zt|\}}	W n   Y n0 |	sd}|r.|jtd || |D ](}
|
jdkrg |
d d < |
} q(q|} nd }|jtd | r^| d dkr^d }nt| \}} |jr~|jdkr| r| d dkr|| |d ur|} || fS |jtd | s|jtd || |d u r|| fS n|d ur>|D ]}
|
jdkr q"q|
jdk ||
 |
j|_| d dkr\t	d| |t
dd | dd  } | r| d dkrt| \}} || |j|_| r| d dkrt	d| |t
dd | dd  } |d urbt }| r\| d tv rt| \}} n2| d dkrBt
dd}| dd  } nt| \}} || q|}nt| \}} || |d ur|} || fS )Nr   rb  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 invalidrg   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 delimitersr  r   z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)r   r  rj   r   r   r   r+   r  r   r  r  r   r8  r9  r:  rn   r   r|  r  rE   r  r   rb   rc   r   r$  r  r1  )r   r   r7   r@  r  ZappendtoZqstringZinner_valueZ
semi_validr%  tr  r   r   r   get_parameterk	  s    























r  c              
   C   sp  t  }| rlzt| \}} || W n tjy } zd }| d tv rTt| \}} | sr|| |W  Y d }~S | d dkr|d ur|| |jtd n@t	| \}} |r|g|d d< || |jtd
| W Y d }~n
d }~0 0 | rJ| d dkrJ|d }d|_t	| \}} || |jtd
| | r|tdd | d	d  } q|S )
Nr   rb  zparameter entry with no contentzinvalid parameter {!r}r   r   z)parameter with invalid trailing text {!r}r  r   )r   r  rj   r   r  r8  r9  r   r   rs  r+   rE   r5   r  )r   Zmime_parametersr7   rg  r@  r   r   r   r   parse_mime_parameters	  sJ    






r  c                 C   s   |rV|d dkrV|d t v r>| t|d d |dd  }q t|\}}| | q |s^d S | tdd | t|dd   d S )Nr   rb  rK  r   r  )rB  rj   r  rD  r  )Z	tokenlistr   r7   r   r   r   _find_mime_parameters-
  s    r  c              
   C   s  t  }d}| s$|jtd |S zt| \}} W n: tjyn   |jtd|  t	||  | Y S 0 || | r| d dkr|jtd | rt	||  |S |j
  |_|tdd | dd  } zt| \}} W n< tjy&   |jtd	|  t	||  | Y S 0 || |j
  |_| sL|S | d d
kr|jtd|  |`|`t	||  |S |td
d |t| dd   |S )NFz"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}rb  z<Only parameters are valid after content type, but found {!r}r  )r   r   rj   r   ro  ry  r  r   r+   r  r   r   lowerr   r  r   r  )r   ZctypeZrecoverr7   r   r   r   parse_content_type_header=
  sd    












r  c              
   C   s   t  }| s |jtd |S zt| \}} W n: tjyj   |jtd|  t	||  | Y S 0 || |j
  |_| s|S | d dkr|jtd|  t	||  |S |tdd |t| dd   |S )NzMissing content dispositionz+Expected content disposition but found {!r}r   rb  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r   r   rj   r   ro  ry  r  r   r+   r  r   r   r  r   r  r  )r   Zdisp_headerr7   r   r   r    parse_content_disposition_headerv
  s:    






r  c              
   C   s   t  }| s |jtd |S zt| \}} W n, tjy\   |jtd|  Y n0 || |j	
  |_| s|S | r|jtd | d tv r|t| d d | dd  } qt| \}} || q|S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   rK  r   )r   r   rj   r   ro  ry  r  r   r+   r   r   r  ra   rB  r  rD  )r   Z
cte_headerr7   r   r   r   &parse_content_transfer_encoding_header
  s4    



r  c                 C   sD   d}| r@| d r@| d d t v r@| d d }| d d d | d< |S )Nr   r   )r$  )linesZwspr   r   r   _steal_trailing_WSP_if_exists
  s
    r  c                C   s  |j p
tj}|jrdnd}dg}d }d}d}tdd}t| }	|	r|	d}
|
|u r`|d8 }q>t|
}|
jdkrt	|t
@ rd	}z|| |}W n4 ty   td
d |
jD rd}nd}d	}Y n0 |
jdkrt|
||| q>|r|s|
jsnd}d }|
jrn|
j|dd t|j  }|j|vrnt||t|d  kr\t|}|| |d  |7  < q>t|
dst|
|	 }	nt|||||
j|}d}q>t||t|d  kr|d  |7  < q>|
jrt|d |krt|}|s |
 r|||  d }q>t|
dsLt|
}|
jsB|d7 }|| ||	 }	q>|
jrl|sl|	d|
 d	}q>t|}|s|
 r|||  q>|d  |7  < q>|j||j S )Nutf-8r   r   r   Fwrap_as_ew_blockedr   r   Tc                 s   s   | ]}t |tjV  qd S r   )r   r   r   r    r   r   r   r#   
  s   z%_refold_parse_tree.<locals>.<genexpr>unknown-8bitr   r8   r   rH  )Zmax_line_lengthsysmaxsizeutf8r   r  r   r   rE   r   r?  rH  r   r_  r.   _fold_mime_parametersr2   rJ   r<   r   r   r  rj   rF   _fold_as_ewrK   r1   insertr&   )Z
parse_treer9   maxlenr   r  last_ewr  Zwant_encodingZend_ew_not_allowedr   r3   tstrrb   Zencoded_partnewlineZnewpartsr   r   r   r:   
  s    







r:   c                 C   s  |d ur<|r<t t|d |d  |  } |d d | |d< | d tv r| d }| dd  } t|d |krz|t| |d  |7  < d}| d tv r| d }| d d } |d u rt|d n|}|dkrdn|}	t|	d }
|
d |krtd| r|t|d  }||
 }|dkr,|d	 q| d | }tj	||	d
}t|| }|dkr|d d }tj	||	d
}t|| }qR|d  |7  < | t|d  } | r|d	 t|d }q|d  |7  < |r|S d S )Nr   r   r   r   r   r     z3max_line_length is too small to fit an encoded wordrP   )rb   )
r   r-  r$  r   rj   r  r   r  r!  rH  )Z	to_encoder  r  r  rK   rb   Zleading_wspZtrailing_wspZnew_last_ewZ	encode_as
chrome_lenZremaining_spaceZ
text_spaceZto_encode_wordZencoded_wordZexcessr   r   r   r  1  sT    



r  c              	   C   s  | j D ]\}}|d  ds2|d  d7  < |}d}z|| d}W n. tyz   d}t|rrd}d}nd}Y n0 |rtjj	|d	|d
}	d
|||	}
nd
|t|}
t|d t|
 d |k r|d d |
 |d< qn"t|
d |kr|d|
  qd}|d }|rt|tt| d t| }||d krJd}|| d  }}|d | }tjj	|d	|d
}	t|	|krq|d8 }qZ|d
||||	 d	}|d7 }||d  }|r|d  d7  < qqd S )Nr   rb  strictFTr  r   r  r   )safer   z
{}*={}''{}r   r   rP   r   r   z''r   N   z {}*{}*={}{})r   r   r   rH  r   r   r   r   r   rq   r+   r   r   rj   r   )r3   r  r  r   r   r   rb   Zerror_handlerZencoding_requiredZencoded_valuer  r   Zextra_chromer  Z
splitpointZmaxcharspartialr   r   r   r  r  s`    


 r  )rer  r   stringr   operatorr   Zemailr   r!  r   r   r   r$  r8  r?  r;  r   rB  Z	TSPECIALSrx  Z	ASPECIALSr}  r  r   compileVERBOSE	MULTILINEr)  r  r   rN   rT   rW   rY   rZ   r\   r^   r_   rd   ro   rp   rs   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r
  r   rW  rX  r+   r&   r   r  r  matchr3  findallr  ru  rz  r  r  r  r  r'  r-  r0  r1  r5  r6  r7  r9  r:  r<  r=  r>  rA  rD  rJ  rG  rL  rP  rR  rS  rU  rY  r\  r]  r^  r`  ra  rc  rd  re  rf  rh  ri  rk  rm  rr  rs  rv  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r:   r  r  r   r   r   r   <module>F   s,  
C"	
!*$
V	+






1C+"&'/'&).9%7ED 49/gA