<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    YI~d             	   @   sl  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 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/d0 d0e Z.G d1d2 d2e Z/G d3d4 d4e Z0G d5d6 d6e Z1G d7d8 d8e Z2G d9d: d:e Z3G d;d< d<e Z4G d=d> d>e Z5G d?d@ d@e Z6G dAdB dBe Z7G dCdD dDe Z8G dEdF dFe Z9G dGdH dHe Z:G dIdJ dJe#Z;G dKdL dLe Z<G dMdN dNe Z=G dOdP dPe Z>G dQdR dRe Z?G dSdT dTe?Z@G dUdV dVe ZAG dWdX dXe ZBG dYdZ dZe ZCG d[d\ d\e ZDG d]d^ d^e ZEG d_d` d`eEZFG dadb dbeEZGG dcdd dde ZHG dedf dfe ZIG dgdh dhe ZJG didj djeKZLG dkdl dleLZMG dmdn dneLZNG dodp dpeMZOG dqdr drejPZQeNddsZReNdtduZSeNdvdwZTe dxUdyVejWZXe dzUe YdyVejZZ[e d{j\Z]e dzUe YdyVejZZ^e dzUe YdyVejZZ_e dzUe YdyVejZZ`d|d} Zad~d 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 ZdS )    N)	hexdigits)OrderedDict)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%c             C   s    dt | dddd d S )N"\z\\z\")strreplace)value r   ?/opt/alt/python37/lib64/python3.7/email/_header_value_parser.pyquote_stringa   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|| g | _d S )N)super__init__defects)selfargskw)	__class__r   r   r   z   s    zTokenList.__init__c             C   s   d dd | D S )N c             s   s   | ]}t |V  qd S )N)r   ).0xr   r   r   	<genexpr>   s    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 )N)r   )r   r   r   r   r   r      s    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 )N)all_defects)r   r   r   r   r   r      s    z(TokenList.all_defects.<locals>.<genexpr>)sumr   )r   r   r   r   r$      s    zTokenList.all_defectsc             C   s   | d   S )Nr   )startswith_fws)r   r   r   r   r&      s    zTokenList.startswith_fwsc             C   s   t dd | D S )Nc             s   s   | ]}|j V  qd S )N)as_ew_allowed)r   partr   r   r   r      s    z*TokenList.as_ew_allowed.<locals>.<genexpr>)all)r   r   r   r   r'      s    zTokenList.as_ew_allowedc             C   s"   g }x| D ]}| |j q
W |S )N)extendcomments)r   r+   tokenr   r   r   r+      s    
zTokenList.commentsc            C   s   t | |dS )N)policy)_refold_parse_tree)r   r-   r   r   r   fold   s    zTokenList.foldr   c             C   s   t | j|d d S )N)indent)printppstr)r   r0   r   r   r   pprint   s    zTokenList.pprintc             C   s   d | j|dS )N
)r0   )r   _pp)r   r0   r   r   r   r2      s    zTokenList.ppstrc             c   s~   d || jj| jV  x<| D ]4}t|ds<|d | V  q||d E d H  qW | jrhd | j}nd}d ||V  d S )Nz{}{}/{}(r5   z*    !! invalid element in token list: {!r}z    z Defects: {}r   z{}){})r!   r   r"   
token_typehasattrr5   r   )r   r0   r,   Zextrar   r   r   r5      s    


zTokenList._pp)r   )r   )r   )r"   
__module____qualname__r6   syntactic_breakew_combine_allowedr   r    r#   propertyr   r$   r&   r'   r+   r/   r3   r2   r5   __classcell__r   r   )r   r   r   t   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)r6   content)r   r   r   r   r   
<listcomp>   s    z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   )r   r   r   r   r+      s    zWhiteSpaceTokenList.commentsN)r"   r8   r9   r<   r   r+   r   r   r   r   r>      s   r>   c               @   s   e Zd ZdZdS )UnstructuredTokenListunstructuredN)r"   r8   r9   r6   r   r   r   r   rC      s   rC   c               @   s   e Zd ZdZdS )PhrasephraseN)r"   r8   r9   r6   r   r   r   r   rE      s   rE   c               @   s   e Zd ZdZdS )WordZwordN)r"   r8   r9   r6   r   r   r   r   rG      s   rG   c               @   s   e Zd ZdZdS )CFWSListcfwsN)r"   r8   r9   r6   r   r   r   r   rH      s   rH   c               @   s   e Zd ZdZdS )AtomatomN)r"   r8   r9   r6   r   r   r   r   rJ      s   rJ   c               @   s   e Zd ZdZdZdS )Tokenr,   FN)r"   r8   r9   r6   Zencode_as_ewr   r   r   r   rL      s   rL   c               @   s   e Zd ZdZdZdZdZdS )EncodedWordzencoded-wordN)r"   r8   r9   r6   ctecharsetlangr   r   r   r   rM      s   rM   c               @   s4   e Zd ZdZedd Zedd Zedd ZdS )	QuotedStringzquoted-stringc             C   s"   x| D ]}|j dkr|jS qW d S )Nzbare-quoted-string)r6   r   )r   r   r   r   r   rA      s    

zQuotedString.contentc             C   sB   g }x2| D ]*}|j dkr(|t| q
||j q
W d|S )Nzbare-quoted-stringr   )r6   appendr   r   r   )r   resr   r   r   r   quoted_value   s    

zQuotedString.quoted_valuec             C   s"   x| D ]}|j dkr|jS qW d S )Nzbare-quoted-string)r6   r   )r   r,   r   r   r   stripped_value   s    

zQuotedString.stripped_valueN)r"   r8   r9   r6   r<   rA   rT   rU   r   r   r   r   rQ      s   
rQ   c               @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringzbare-quoted-stringc             C   s   t ddd | D S )Nr   c             s   s   | ]}t |V  qd S )N)r   )r   r   r   r   r   r     s    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 )N)r   )r   r   r   r   r   r     s    z)BareQuotedString.value.<locals>.<genexpr>)r   )r   r   r   r   r   
  s    zBareQuotedString.valueN)r"   r8   r9   r6   r    r<   r   r   r   r   r   rV     s   rV   c               @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )Commentr@   c                s(   d tdg fdd D dggg S )Nr   r   c                s   g | ]}  |qS r   )quote)r   r   )r   r   r   rB     s    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 )Nr@   r   z\\r   z\(rY   z\))r6   r   r   )r   r   r   r   r   rX     s
    
zComment.quotec             C   s   d dd | D S )Nr   c             s   s   | ]}t |V  qd S )N)r   )r   r   r   r   r   r   #  s    z"Comment.content.<locals>.<genexpr>)r   )r   r   r   r   rA   !  s    zComment.contentc             C   s   | j gS )N)rA   )r   r   r   r   r+   %  s    zComment.commentsN)	r"   r8   r9   r6   r    rX   r<   rA   r+   r   r   r   r   rW     s
   rW   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)r6   )r   r   r   r   r   rB   /  s    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 )r[   N)r6   	mailboxes)r   r   r   r   r   r   3  s   z(AddressList.mailboxes.<locals>.<genexpr>)r%   )r   r   r   r   r]   1  s    zAddressList.mailboxesc             C   s   t dd | D g S )Nc             s   s   | ]}|j d kr|jV  qdS )r[   N)r6   all_mailboxes)r   r   r   r   r   r   8  s   z,AddressList.all_mailboxes.<locals>.<genexpr>)r%   )r   r   r   r   r^   6  s    zAddressList.all_mailboxesN)r"   r8   r9   r6   r<   r\   r]   r^   r   r   r   r   rZ   )  s   rZ   c               @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Addressr[   c             C   s   | d j dkr| d jS d S )Nr   group)r6   display_name)r   r   r   r   ra   @  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   mailboxzinvalid-mailbox)r6   r]   )r   r   r   r   r]   E  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 )Nr   rb   zinvalid-mailbox)r6   r^   )r   r   r   r   r^   M  s
    

zAddress.all_mailboxesN)r"   r8   r9   r6   r<   ra   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dS )MailboxListzmailbox-listc             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|qS )rb   )r6   )r   r   r   r   r   rB   [  s    z)MailboxList.mailboxes.<locals>.<listcomp>r   )r   r   r   r   r]   Y  s    zMailboxList.mailboxesc             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|qS ))rb   zinvalid-mailbox)r6   )r   r   r   r   r   rB   _  s    z-MailboxList.all_mailboxes.<locals>.<listcomp>r   )r   r   r   r   r^   ]  s    zMailboxList.all_mailboxesN)r"   r8   r9   r6   r<   r]   r^   r   r   r   r   rc   U  s   rc   c               @   s(   e Zd ZdZedd Zedd ZdS )	GroupListz
group-listc             C   s    | r| d j dkrg S | d jS )Nr   zmailbox-list)r6   r]   )r   r   r   r   r]   g  s    zGroupList.mailboxesc             C   s    | r| d j dkrg S | d jS )Nr   zmailbox-list)r6   r^   )r   r   r   r   r^   m  s    zGroupList.all_mailboxesN)r"   r8   r9   r6   r<   r]   r^   r   r   r   r   rd   c  s   rd   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   z
group-list)r6   r]   )r   r   r   r   r]   x  s    zGroup.mailboxesc             C   s   | d j dkrg S | d jS )Nrf   z
group-list)r6   r^   )r   r   r   r   r^   ~  s    zGroup.all_mailboxesc             C   s
   | d j S )Nr   )ra   )r   r   r   r   ra     s    zGroup.display_nameN)r"   r8   r9   r6   r<   r]   r^   ra   r   r   r   r   re   t  s   re   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 )NameAddrz	name-addrc             C   s   t | dkrd S | d jS )N   r   )lenra   )r   r   r   r   ra     s    zNameAddr.display_namec             C   s
   | d j S )N)
local_part)r   r   r   r   rk     s    zNameAddr.local_partc             C   s
   | d j S )Nrj   )domain)r   r   r   r   rl     s    zNameAddr.domainc             C   s
   | d j S )Nrj   )route)r   r   r   r   rm     s    zNameAddr.routec             C   s
   | d j S )Nrj   )	addr_spec)r   r   r   r   rn     s    zNameAddr.addr_specN)
r"   r8   r9   r6   r<   ra   rk   rl   rm   rn   r   r   r   r   rg     s   rg   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"   x| D ]}|j dkr|jS qW d S )Nz	addr-spec)r6   rk   )r   r   r   r   r   rk     s    

zAngleAddr.local_partc             C   s"   x| D ]}|j dkr|jS qW d S )Nz	addr-spec)r6   rl   )r   r   r   r   r   rl     s    

zAngleAddr.domainc             C   s"   x| D ]}|j dkr|jS qW d S )Nz	obs-route)r6   domains)r   r   r   r   r   rm     s    

zAngleAddr.routec             C   s<   x6| D ]*}|j dkr|jr |jS t|j|j S qW dS d S )Nz	addr-specz<>)r6   rk   rn   r   )r   r   r   r   r   rn     s    

zAngleAddr.addr_specN)	r"   r8   r9   r6   r<   rk   rl   rm   rn   r   r   r   r   ro     s
   ro   c               @   s   e Zd ZdZedd ZdS )ObsRoutez	obs-routec             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|jqS )rl   )r6   rl   )r   r   r   r   r   rB     s    z$ObsRoute.domains.<locals>.<listcomp>r   )r   r   r   r   rp     s    zObsRoute.domainsN)r"   r8   r9   r6   r<   rp   r   r   r   r   rq     s   rq   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 )Mailboxrb   c             C   s   | d j dkr| d jS d S )Nr   z	name-addr)r6   ra   )r   r   r   r   ra     s    zMailbox.display_namec             C   s
   | d j S )Nr   )rk   )r   r   r   r   rk     s    zMailbox.local_partc             C   s
   | d j S )Nr   )rl   )r   r   r   r   rl     s    zMailbox.domainc             C   s   | d j dkr| d jS d S )Nr   z	name-addr)r6   rm   )r   r   r   r   rm     s    zMailbox.routec             C   s
   | d j S )Nr   )rn   )r   r   r   r   rn     s    zMailbox.addr_specN)
r"   r8   r9   r6   r<   ra   rk   rl   rm   rn   r   r   r   r   rr     s   rr   c               @   s,   e Zd ZdZedd Ze Z Z ZZ	dS )InvalidMailboxzinvalid-mailboxc             C   s   d S )Nr   )r   r   r   r   ra     s    zInvalidMailbox.display_nameN)
r"   r8   r9   r6   r<   ra   rk   rl   rm   rn   r   r   r   r   rs     s   rs   c                   s(   e Zd ZdZdZe fddZ  ZS )Domainrl   Fc                s   d t j S )Nr   )r   r   r   split)r   )r   r   r   rl     s    zDomain.domain)r"   r8   r9   r6   r'   r<   rl   r=   r   r   )r   r   rt     s   rt   c               @   s   e Zd ZdZdS )DotAtomzdot-atomN)r"   r8   r9   r6   r   r   r   r   rv     s   rv   c               @   s   e Zd ZdZdZdS )DotAtomTextzdot-atom-textTN)r"   r8   r9   r6   r'   r   r   r   r   rw     s   rw   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 )AddrSpecz	addr-specFc             C   s
   | d j S )Nr   )rk   )r   r   r   r   rk     s    zAddrSpec.local_partc             C   s   t | dk rd S | d jS )N   rj   )ri   rl   )r   r   r   r   rl     s    zAddrSpec.domainc             C   s<   t | dk r| d jS | d j | d j | d j  S )Nry   r   rh   rf   )ri   r   rstriplstrip)r   r   r   r   r     s    
zAddrSpec.valuec             C   sL   t | j}t|t|t kr*t| j}n| j}| jd k	rH|d | j S |S )N@)setrk   ri   DOT_ATOM_ENDSr   rl   )r   ZnamesetZlpr   r   r   rn     s    

zAddrSpec.addr_specN)
r"   r8   r9   r6   r'   r<   rk   rl   r   rn   r   r   r   r   rx   
  s   rx   c               @   s   e Zd ZdZdZdS )ObsLocalPartzobs-local-partFN)r"   r8   r9   r6   r'   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   rI   rh   rj   )r   ri   r   r6   pop)r   rS   r   r   r   ra   6  s    
zDisplayName.display_namec                s   d}| j rd}nx| D ]}|jdkrd}qW t| dkr|rd }}| d jdksd| d d jdkrhd}| d jdks| d d jdkrd}|t| j | S t jS d S )	NFTzquoted-stringr   r   rI   r?   rj   )r   r6   ri   r   ra   r   r   )r   rX   r   ZpreZpost)r   r   r   r   G  s    

  zDisplayName.value)	r"   r8   r9   r6   r;   r<   ra   r   r=   r   r   )r   r   r   1  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   zquoted-string)r6   rT   r   )r   r   r   r   r   `  s    
zLocalPart.valuec             C   s   t g}t }d}x| 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W t|dd }|jS )NFr   rI   dotrj   rh   )DOTr6   r   
isinstancerR   r   )r   rS   ZlastZ
last_is_tltokZis_tlr   r   r   rk   g  s$    


zLocalPart.local_partN)r"   r8   r9   r6   r'   r<   r   rk   r   r   r   r   r   [  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 )Nr   )r   r   r   ru   )r   )r   r   r   rl     s    zDomainLiteral.domainc             C   s"   x| D ]}|j dkr|jS qW d S )Nptext)r6   r   )r   r   r   r   r   ip  s    

zDomainLiteral.ip)	r"   r8   r9   r6   r'   r<   rl   r   r=   r   r   )r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r"   r8   r9   r6   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	parameterFzus-asciic             C   s   | j r| d jS dS )Nrh   r   )	sectionednumber)r   r   r   r   section_number  s    zParameter.section_numberc             C   sb   x\| D ]T}|j dkr|jS |j dkrx4|D ],}|j dkr*x|D ]}|j dkr>|jS q>W q*W qW dS )Nr   zquoted-stringzbare-quoted-stringr   )r6   rU   )r   r,   r   r   r   param_value  s    






zParameter.param_valueN)
r"   r8   r9   r6   r   extendedrO   r<   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )InvalidParameterzinvalid-parameterN)r"   r8   r9   r6   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$   x| D ]}|j dr|jS qW d S )Nattrtext)r6   endswithr   )r   r,   r   r   r   rU     s    
zAttribute.stripped_valueN)r"   r8   r9   r6   r<   rU   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdS )SectionsectionN)r"   r8   r9   r6   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   rI   rh   )zquoted-stringr   zextended-attribute)r6   r   rU   r   )r   r,   r   r   r   rU     s    
zValue.stripped_valueN)r"   r8   r9   r6   r<   rU   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 )MimeParameterszmime-parametersFc          
   c   s  t  }x\| D ]T}|jdsq|d jdkr.q|d j }||krLg ||< || |j|f qW x| 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}x|D ]\}	}
|	|kr4|
js"|
jtd qn|
jtd |d7 }|
j}|
jrytj|}W n& tk
r   tjj|d	d
}Y nRX y||d}W n" tk
r   |dd}Y nX t|r|
jt  || qW d|}||fV  qpW d S )Nr   r   r   )keyrh   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingzlatin-1)encodingsurrogateescapezus-asciir   )r   r6   r   r   striprR   r   itemssortedr   rO   r   ri   r   r   InvalidHeaderDefectr   urllibparseZunquote_to_bytesUnicodeEncodeErrorZunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr   )r   paramsr,   namepartsZfirst_paramrO   Zvalue_partsir   paramr   r   r   r   r     sZ    




zMimeParameters.paramsc             C   sX   g }x8| j D ].\}}|r0|d|t| q|| qW d|}|rTd| S dS )Nz{}={}z; r?   r   )r   rR   r!   r   r   )r   r   r   r   r   r   r   r    !  s    
zMimeParameters.__str__N)r"   r8   r9   r6   r:   r<   r   r    r   r   r   r   r     s   Fr   c               @   s   e Zd ZdZedd ZdS )ParameterizedHeaderValueFc             C   s&   x t | D ]}|jdkr
|jS q
W i S )Nzmime-parameters)reversedr6   r   )r   r,   r   r   r   r   2  s    

zParameterizedHeaderValue.paramsN)r"   r8   r9   r:   r<   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"   r8   r9   r6   r'   maintypesubtyper   r   r   r   r   :  s   r   c               @   s   e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r"   r8   r9   r6   r'   content_dispositionr   r   r   r   r   B  s   r   c               @   s   e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r"   r8   r9   r6   r'   rN   r   r   r   r   r   I  s   r   c               @   s   e Zd ZdZdZdS )HeaderLabelzheader-labelFN)r"   r8   r9   r6   r'   r   r   r   r   r   P  s   r   c               @   s   e Zd ZdZdS )HeaderheaderN)r"   r8   r9   r6   r   r   r   r   r   V  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 )N)r   __new__r6   r   )clsr   r6   r   )r   r   r   r   e  s    zTerminal.__new__c                s   d | jjt  S )Nz{}({}))r!   r   r"   r   r#   )r   )r   r   r   r#   k  s    zTerminal.__repr__c             C   s   t | jjd | j  d S )N/)r1   r   r"   r6   )r   r   r   r   r3   n  s    zTerminal.pprintc             C   s
   t | jS )N)listr   )r   r   r   r   r$   q  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"   r6   r   r#   r   )r   r0   )r   r   r   r5   u  s    zTerminal._ppc             C   s   d S )Nr   )r   r   r   r   pop_trailing_ws~  s    zTerminal.pop_trailing_wsc             C   s   g S )Nr   )r   r   r   r   r+     s    zTerminal.commentsc             C   s   t | | jfS )N)r   r6   )r   r   r   r   __getnewargs__  s    zTerminal.__getnewargs__)r   )r"   r8   r9   r'   r;   r:   r   r#   r3   r<   r$   r5   r   r+   r   r=   r   r   )r   r   r   _  s   	r   c               @   s    e Zd Zedd Zdd ZdS )WhiteSpaceTerminalc             C   s   dS )Nr?   r   )r   r   r   r   r     s    zWhiteSpaceTerminal.valuec             C   s   dS )NTr   )r   r   r   r   r&     s    z!WhiteSpaceTerminal.startswith_fwsN)r"   r8   r9   r<   r   r&   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 )Nr   )r   r   r   r   r     s    zValueTerminal.valuec             C   s   dS )NFr   )r   r   r   r   r&     s    zValueTerminal.startswith_fwsN)r"   r8   r9   r<   r   r&   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 )Nr   r   )r   r   r   r   r     s    zEWWhiteSpaceTerminal.valuec             C   s   dS )Nr   r   )r   r   r   r   r      s    zEWWhiteSpaceTerminal.__str__N)r"   r8   r9   r<   r   r    r   r   r   r   r     s   r   c               @   s   e Zd ZdS )_InvalidEwErrorN)r"   r8   r9   r   r   r   r   r     s   r   r   ,z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   rR   r   ZNonPrintableDefectr   r   r   )xtextZnon_printablesr   r   r   _validate_xtext  s    

r   c             C   s   t | d^}}g }d}d}xbtt|D ]J}|| dkrL|rFd}d}nd}q(|rVd}n|| |krdP |||  q(W |d }d|d||d  g| |fS )Nrh   Fr   Tr   )_wsp_splitterrangeri   rR   r   )r   endcharsZ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   ri   )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kr|d tkr|	ddk r|dd^}}|d | }t| dkr|j
td	 | |_d|} ytd| d \}}}}	W n* ttfk
r*   td
|jY nX ||_||_|j
|	 xh|r|d tkrtt|\}
}||
 qFt|d^}}t|d}t| || d|}qFW | r| d tkr|j
td || fS )Nz=?z"expected encoded word but found {}rf   z?=rh   r   r   ?zwhitespace inside encoded wordz!encoded word format invalid: '{}'vtextz.missing trailing whitespace after encoded-word)rM   
startswithr   HeaderParseErrorr!   ru   r   ri   r   countr   rR   r   rN   _ewr   
ValueErrorKeyErrorr   rO   rP   r*   WSPr   r   r   r   )r   Zewr   r   Zremstrrestr   rO   rP   r   r,   charsr   r   r   r   get_encoded_word  sT    







r   c             C   sL  t  }x>| rF| d tkr4t| \}} || q
d}| dryt| \}} W n, tk
rj   d}Y n tjk
r~   Y nrX 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
W |S )Nr   Tz=?Frj   r   z&missing whitespace before encoded wordrh   zencoded-wordr   r   )rC   r   r   rR   r   r   r   r   r   ri   r6   r   r   r   r   rfc2047_matchersearch	partitionr   r   r   )r   rD   r,   valid_ewZhave_wsr   r   r   r   r   r   get_unstructured8  sD    






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    
r   c             C   s*   t | d\}} }t|d}t| || fS )Nr   r   )r   r   r   )r   r   r   r   r   r   get_qcontent  s    

r   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`   ri   r   r   )r   mr   r   r   r   	get_atext  s    
r   c             C   sv  | d dkrt d| t }| dd  } | rT| d dkrTt| \}} || x| rD| d dkrD| d tkrt| \}} n| d d dkr,d}y&t| \}} |j	t 
d d	}W n" t jk
r   t| \}} Y nX |r8t|dkr8|d
 jdkr8|d jdkr8t|d
 d|d
< nt| \}} || qVW | sf|j	t 
d || fS || dd  fS )Nr   r   zexpected '"' but found '{}'rh   rf   z=?Fz!encoded word inside quoted stringTrj   r   r   zencoded-wordz"end of header inside quoted string)r   r   r!   rV   r   rR   r   r   r   r   r   ri   r6   r   )r   Zbare_quoted_stringr,   r   r   r   r   get_bare_quoted_string  s@    


r   c             C   s   | r | d dkr t d| t }| dd  } x^| r| d dkr| d tkr^t| \}} n&| d dkrxt| \}} nt| \}} || q4W | s|j	t 
d || fS || dd  fS )Nr   r   zexpected '(' but found '{}'rh   rY   zend of header inside comment)r   r   r!   rW   r   r   get_commentr   rR   r   r   )r   r@   r,   r   r   r   r     s"    
r   c             C   sT   t  }xD| rJ| d tkrJ| d tkr2t| \}} nt| \}} || qW || fS )Nr   )rH   CFWS_LEADERr   r   r   rR   )r   rI   r,   r   r   r   get_cfws  s    r   c             C   sp   t  }| r,| d tkr,t| \}} || t| \}} || | rh| d tkrht| \}} || || fS )Nr   )rQ   r   r   rR   r   )r   Zquoted_stringr,   r   r   r   get_quoted_string  s    


r   c             C   s   t  }| r,| d tkr,t| \}} || | rL| d tkrLtd| | dryt	| \}} W q tjk
r   t
| \}} Y qX nt
| \}} || | r| d tkrt| \}} || || fS )Nr   zexpected atom but found '{}'z=?)rJ   r   r   rR   	ATOM_ENDSr   r   r!   r   r   r   )r   rK   r,   r   r   r   get_atom  s$    



r   c             C   s   t  }| r| d tkr&td| xP| rv| d tkrvt| \}} || | r(| d dkr(|t | dd  } q(W |d tkrtdd|  || fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r	   rh   rj   z4expected atom at end of dot-atom-text but found '{}')rw   r   r   r   r!   r   rR   r   )r   Zdot_atom_textr,   r   r   r   get_dot_atom_text)  s    

r   c             C   s   t  }| d tkr(t| \}} || | drhyt| \}} W qt tjk
rd   t| \}} Y qtX nt| \}} || | r| d tkrt| \}} || || fS )Nr   z=?)	rv   r   r   rR   r   r   r   r   r   )r   Zdot_atomr,   r   r   r   get_dot_atom<  s    



r   c             C   s   | d t krt| \}} nd }| s,td| d dkrFt| \}} n*| d tkrdtd| nt| \}} |d k	r|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   SPECIALSr!   r   )r   leaderr,   r   r   r   get_wordU  s    
r   c             C   s   t  }yt| \}} || W n( tjk
rH   |jtd Y nX x| r| d tkr| d dkr|t |jt	d | dd  } qLyt| \}} W nD tjk
r   | d t
krt| \}} |jt	d n Y nX || qLW || fS )Nzphrase does not start with wordr   r	   zperiod in 'phrase'rh   zcomment found without atom)rE   r   rR   r   r   r   r   PHRASE_ENDSr   ObsoleteHeaderDefectr   r   )r   rF   r,   r   r   r   
get_phrasew  s.    




r   c             C   sv  t  }d }| d tkr"t| \}} | s6td| yt| \}} W n^ tjk
r   yt| \}} W n6 tjk
r   | d dkr| d tkr t	 }Y nX Y nX |d k	r|g|d d< |
| | r4| d dks| d tkr4tt||  \}} |jdkr|j
td n|j
td ||d< y|jd W n( tk
rl   |j
td Y nX || fS )	Nr   z"expected local-part but found '{}'r   z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   r   r   r   r   r!   r   r   r   r   rR   get_obs_local_partr   r6   r   r   r   r   encoder   ZNonASCIILocalPartDefect)r   rk   r   r,   obs_local_partr   r   r   get_local_part  sB    
 



r  c             C   s  t  }d}x | r,| d dks.| d tkr,| d dkrn|rP|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 yt	| \}} d}W n4 tj
k
r   | d tkr t| \}} Y nX || qW |d jdks^|d jdkrp|d jdkrp|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 '.'Trh   zmisplaced-specialz/'\' character outside of quoted-string/ccontentrj   r   zmissing '.' between wordsrI   z!Invalid leading '.' in local partr   z"Invalid trailing '.' in local partzinvalid-obs-local-part)r   r   r   rR   r   r   r   r   r6   r   r   r   r   )r   r   Zlast_non_ws_was_dotr,   r   r   r   r     sV    $





r   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   rR   r   r   r   )r   r   r   r   r   r   	get_dtext  s    

r  c             C   s,   | rdS | td | tdd dS )NFz"end of input inside domain-literal]zdomain-literal-endT)rR   r   r   r   )r   domain_literalr   r   r   _check_for_early_dl_end  s    r  c             C   sj  t  }| d tkr(t| \}} || | s6td| d dkrRtd| | dd  } t| |rp|| fS |tdd | d t	krt
| \}} || t| \}} || t| |r|| fS | d t	krt
| \}} || t| |r|| fS | d dkrtd| |tdd	 | dd  } | rb| d tkrbt| \}} || || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'rh   zdomain-literal-startr  z4expected ']' at end of domain-literal but found '{}'zdomain-literal-end)r   r   r   rR   r   r   r!   r  r   r   r   r  )r   r  r,   r   r   r   get_domain_literal  sD    








r  c             C   sv  t  }d }| d tkr"t| \}} | s6td| | d dkrvt| \}} |d k	rd|g|d d< || || fS yt| \}} W n" tjk
r   t	| \}} Y nX | r| d dkrtd|d k	r|g|d d< || | rn| d dkrn|j
td |d jdkr*|d |d d < xB| rl| d dkrl|t t	| d	d  \}} || q,W || fS )
Nr   zexpected domain but found '{}'r  r|   zInvalid Domainr	   z(domain is not a dot-atom (contains CFWS)zdot-atomrh   )rt   r   r   r   r   r!   r  rR   r   r   r   r   r6   r   )r   rl   r   r,   r   r   r   
get_domain6  s@    




r  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"add-spec local part with no domainzaddress-at-symbolrh   )rx   r  rR   r   r   r   r   r  )r   rn   r,   r   r   r   get_addr_spec\  s    


r	  c             C   s  t  }xf| rl| d dks$| d tkrl| d tkrHt| \}} || q| d dkr|t | dd  } qW | r~| d dkrtd| |t t	| dd  \}} || x| rB| d dkrB|t | dd  } | sP | d tkrt| \}} || | d dkr|t t	| dd  \}} || qW | sTtd| d dkrrtd| |t
dd	 || dd  fS )
Nr   r   rh   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)rq   r   r   rR   ListSeparatorr   r   r!   RouteComponentMarkerr  r   )r   Z	obs_router,   r   r   r   get_obs_routel  sB    






r  c             C   s  t  }| d tk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 yt
| \}} W nz tjk
r0   y"t| \}} |jtd	 W n( tjk
r   td
| Y nX || t
| \}} Y nX || | r^| d dkr^| dd  } n|jt	d |tdd | r| d tkrt| \}} || || fS )Nr   <z"expected angle-addr but found '{}'zangle-addr-startrh   >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)ro   r   r   rR   r   r   r!   r   r   r   r	  r  r   )r   Z
angle_addrr,   r   r   r   get_angle_addr  sJ    






r  c             C   s<   t  }t| \}} ||d d   |jd d  |_|| fS )N)r   r   r*   r   )r   ra   r,   r   r   r   get_display_name  s
    r  c             C   s   t  }d }| d tkr6t| \}} | s6td|| d dkr| d tkr^td| t| \}} | s~td||d k	r|g|d d d< d }|| t	| \}} |d k	r|g|d d< || || fS )Nr   z!expected name-addr but found '{}'r  )
rg   r   r   r   r   r!   r   r  rR   r  )r   Z	name_addrr   r,   r   r   r   get_name_addr  s0    

r  c             C   s   t  }yt| \}} W nN tjk
rd   yt| \}} W n& tjk
r^   td| Y nX Y nX tdd |jD rd|_|	| || fS )Nzexpected mailbox but found '{}'c             s   s   | ]}t |tjV  qd S )N)r   r   r   )r   r   r   r   r   r     s   zget_mailbox.<locals>.<genexpr>zinvalid-mailbox)
rr   r  r   r   r	  r!   anyr$   r6   rR   )r   rb   r,   r   r   r   get_mailbox  s    
r  c             C   sh   t  }xX| r^| d |kr^| d tkrF|t| d d | dd  } qt| \}} || qW || fS )Nr   zmisplaced-specialrh   )rs   r   rR   r   r   )r   r   Zinvalid_mailboxr,   r   r   r   get_invalid_mailbox  s    r  c             C   s  t  }x| r| d dkryt| \}} || W n tjk
r@   d }| d tkrt| \}} | rz| d dkr|| |jtd n@t	| d\}} |d k	r|g|d d< || |jt
d nb| d dkr|jtd nBt	| d\}} |d k	r |g|d d< || |jt
d Y nX | r| d dkr|d }d|_t	| d\}} || |jt
d | r
| d dkr
|t | d	d  } q
W || fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr   rj   zinvalid-mailboxrh   )rc   r  rR   r   r   r   r   r   r   r  r   r6   r*   r  )r   Zmailbox_listr,   r   rb   r   r   r   get_mailbox_list  sN    













r  c             C   s  t  }| s$|jtd || fS d }| r| d tkrt| \}} | sl|jtd || || fS | d dkr|| || fS t| \}} t|j	dkr|d k	r|| |
| |jtd || fS |d k	r|g|d d< || || fS )Nzend of header before group-listr   zend of header in group-listr  zgroup-list with empty entries)rd   r   rR   r   r   r   r   r  ri   r^   r*   r   )r   Z
group_listr   r,   r   r   r   get_group_listP  s8    







r  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
krt| \}} || || fS )
Nr   r
  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorrh   r  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})re   r  r   r   r!   rR   r   r  r   r   r   r   )r   r`   r,   r   r   r   	get_groupu  s2    




r  c             C   sx   t  }yt| \}} W nN tjk
rd   yt| \}} W n& tjk
r^   td| Y nX Y nX || || fS )Nzexpected address but found '{}')r_   r  r   r   r  r!   rR   )r   r[   r,   r   r   r   get_address  s    
r  c          
   C   s  t  }x| ryt| \}} || W n  tjk
rL } zd }| d tkrt| \}} | rn| d dkr|| |jtd nFt	| d\}} |d k	r|g|d d< |t
|g |jtd nh| d dkr|jtd nHt	| d\}} |d k	r|g|d d< |t
|g |jtd W d d }~X Y nX | r| d dkr|d d }d|_t	| d\}} || |jtd | r
|tdd | d	d  } q
W || fS )
Nr   r   z"address-list entry with no contentzinvalid address in address-listzempty element in address-listrj   zinvalid-mailboxzlist-separatorrh   )rZ   r  rR   r   r   r   r   r   r   r  r_   r   r6   r*   r   )r   Zaddress_listr,   errr   rb   r   r   r   get_address_list  sN    












r  c             C   s  t  }| s |jtd |S | d tkrXt| \}} || | sX|jtd d}x8| r| d dkr| d tkr|| d 7 }| dd  } q^W | s|jtd	| |t
|d nt||_|t
|d	 | r| d tkrt| \}} || | r | d dkrX|jd k	r>|jtd
 | rT|t
| d |S |t
dd | dd  } | r| d tkrt| \}} || | s|jd k	r|jtd
 |S d}x2| r| d tkr|| d 7 }| dd  } qW | s2|jtd	| |t
|d nt||_|t
|d	 | rv| d tkrvt| \}} || | 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	   rh   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   rR   r   HeaderMissingRequiredValuer   r   isdigitr   r!   r   intr   r   )r   Zmime_versionr,   r  r   r   r   parse_mime_version  sv    













r!  c             C   sh   t  }xX| r^| d dkr^| d tkrF|t| d d | dd  } qt| \}} || qW || fS )Nr   r  zmisplaced-specialrh   )r   r   rR   r   r   )r   Zinvalid_parameterr,   r   r   r   get_invalid_parameter2  s    r"  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`   ri   r   r   )r   r   r#  r   r   r   	get_ttextD  s    	
r%  c             C   s   t  }| r,| d tkr,t| \}} || | rL| d tkrLtd| t| \}} || | r| d tkrt| \}} || || fS )Nr   zexpected token but found '{}')	rL   r   r   rR   
TOKEN_ENDSr   r   r!   r%  )r   Zmtokenr,   r   r   r   	get_tokenW  s    	


r'  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`   ri   r   r   )r   r   r   r   r   r   get_attrtextn  s    	
r)  c             C   s   t  }| r,| d tkr,t| \}} || | rL| d tkrLtd| t| \}} || | r| d tkrt| \}} || || fS )Nr   zexpected token but found '{}')	r   r   r   rR   ATTRIBUTE_ENDSr   r   r!   r)  )r   r   r,   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}zextended-attrtext)#_non_extended_attribute_end_matcherr   r   r!   r`   ri   r   r   )r   r   r   r   r   r   get_extended_attrtext  s    
r-  c             C   s   t  }| r,| d tkr,t| \}} || | rL| d tkrLtd| t| \}} || | r| d tkrt| \}} || || fS )Nr   zexpected token but found '{}')	r   r   r   rR   EXTENDED_ATTRIBUTE_ENDSr   r   r!   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}x,| r| d  r|| d 7 }| dd  } qhW |d dkr|dkr|jtd	 t	||_
|t|d
 || fS )Nr   *zExpected section but found {}zsection-markerrh   z$Expected section number but found {}r   0z'section number has an invalid leading 0r  )r   r   r   r!   rR   r   r  r   ZInvalidHeaderErrorr   r   )r   r   r  r   r   r   get_section  s&    	

r2  c             C   s   t  }| stdd }| d tkr0t| \}} | sDtd|| d dkr^t| \}} nt| \}} |d k	r|g|d d< || || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	r   r   r   r   r   r!   r   r/  rR   )r   vr   r,   r   r   r   	get_value  s     

r4  c             C   s  t  }t| \}} || | r,| d dkrL|jtd| || fS | d dkry t| \}} d|_|| W n tj	k
r   Y nX | 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kr,t| \}} || d }|}|jrF| rF| d dkrFt| \}}|j}d}|jdkr|r|d dkrd}n$t|\}}	|	r|	d dkrd}n(yt|\}}	W n   Y nX |	sd}|r0|jtd || x,|D ]$}
|
jdkrg |
d d < |
}P qW |} 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 k	r|} || fS |jtd | s|jtd || |d kr|| fS n|d k	r@x|D ]}
|
jdkrP qW |
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 k	rht }xd| r`| d tkr t| \}} n2| d dkrFt
dd}| dd  } nt| \}} || qW |}nt| \}} || |d k	r|} || fS )Nr   r  z)Parameter contains name ({}) but no valuer0  TzIncomplete parameterzextended-parameter-markerrh   =zParameter not followed by '='zparameter-separatorr   F'z5Quoted string value for extended parameter is invalidzbare-quoted-stringzZParameter 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 delimiterszextended-attrtextr   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+  rR   r   r   r   r!   r2  r   r   r   r   r   r   r   rU   r   r)  r-  r6   r4  r   rO   rP   r   r   r   r   )r   r   r,   r   r   ZappendtoZqstringZinner_valueZ
semi_validr   tr3  r   r   r   get_parameter  s    
























r8  c          
   C   sh  t  }xZ| rbyt| \}} || W n tjk
r } zd }| d tkrZt| \}} | sl|| |S | d dkr|d k	r|| |jtd n@t	| \}} |r|g|d d< || |jtd
| W d d }~X Y nX | r@| d dkr@|d }d|_t	| \}} || |jtd
| | r
|tdd | d	d  } q
W |S )
Nr   r  zparameter entry with no contentzinvalid parameter {!r}rj   zinvalid-parameterz)parameter with invalid trailing text {!r}zparameter-separatorrh   )r   r8  rR   r   r   r   r   r   r   r"  r!   r6   r*   r   )r   Zmime_parametersr,   r  r   r   r   r   r   parse_mime_parameters	  sD    






 

r9  c             C   s   xX|rX|d dkrX|d t kr@| t|d d |dd  }qt|\}}| | qW |sbd S | tdd | t|dd   d S )Nr   r  zmisplaced-specialrh   zparameter-separator)r   rR   r   r   r9  )Z	tokenlistr   r,   r   r   r   _find_mime_parameters	  s    r:  c          
   C   s  t  }d}| s$|jtd |S yt| \}} W n8 tjk
rl   |jtd|  t	||  |S X || | r| d dkr|jtd | rt	||  |S |j
  |_|tdd | dd  } yt| \}} W n: tjk
r"   |jtd	|  t	||  |S X || |j
  |_| sH|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-separatorrh   z'Expected content subtype but found {!r}r  z<Only parameters are valid after content type, but found {!r}zparameter-separator)r   r   rR   r   r  r'  r   r   r!   r:  r   r   lowerr   r   r   r9  )r   ZctypeZrecoverr,   r   r   r   parse_content_type_header	  sX    











r<  c          
   C   s   t  }| s |jtd |S yt| \}} W n8 tjk
rh   |jtd|  t	||  |S X || |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   r  zCOnly parameters are valid after content disposition, but found {!r}zparameter-separatorrh   )r   r   rR   r   r  r'  r   r   r!   r:  r   r   r;  r   r   r9  )r   Zdisp_headerr,   r   r   r    parse_content_disposition_header	  s2    






r=  c          
   C   s   t  }| s |jtd |S yt| \}} W n. tjk
r^   |jtd|  Y nX || |j	
  |_| s|S x^| r|jtd | d tkr|t| d d | dd  } qt| \}} || qW |S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   zmisplaced-specialrh   )r   r   rR   r   r  r'  r   r   r!   r   r   r;  rN   r   r   r   )r   Z
cte_headerr,   r   r   r   &parse_content_transfer_encoding_header
  s.    



r>  c             C   sD   d}| r@| d r@| d d t kr@| d d }| d d d | d< |S )Nr   rj   )r   )linesZwspr   r   r   _steal_trailing_WSP_if_existsL
  s
    r@  c            C   s  |j p
tj}|jrdnd}dg}d }d}d}tdd}t| }	xl|	r|	d}
|
|krd|d8 }qBt|
}|
jdkrt	|t
@ rd	}y|| |}W n6 tk
r   td
d |
jD rd}nd}d	}Y nX |
jdkrt|
||| qB|r|s|
jstd}d }|
jrt|
j|dd t|j  }|j|krtt||t|d  krbt|}|| |d  |7  < qBt|
dst|
|	 }	nt|||||
j|}d}qBt||t|d  kr|d  |7  < qB|
jrt|d |krt|}|s|
 r|||  d }qBt|
dsRt|
}|
jsH|d7 }|| ||	 }	qB|
jrr|sr|	d|
 d	}qBt|}|s|
 r|||  qB|d  |7  < qBW |j||j S )Nzutf-8zus-asciir   r   Fwrap_as_ew_blockedrh   r   Tc             s   s   | ]}t |tjV  qd S )N)r   r   r   )r   r   r   r   r   r   m
  s   z%_refold_parse_tree.<locals>.<genexpr>zunknown-8bitzmime-parameters)r-   rj   r   )Zmax_line_lengthsysmaxsizeutf8r   r   r   r   r6   r}   r   r   r   r  r$   _fold_mime_parametersr'   r:   r/   ri   linesepr@  rR   r7   _fold_as_ewr;   r&   insertr   )Z
parse_treer-   maxlenr   r?  last_ewrA  Zwant_encodingZend_ew_not_allowedr   r(   tstrrO   Zencoded_partnewlineZnewpartsr   r   r   r.   S
  s    









r.   c             C   s  |d k	r<|r<t t|d |d  |  } |d d | |d< | d tkr| d }| dd  } t|d |krz|t| |d  |7  < d}| d tkr| d }| d d } |d krt|d n|}|dkrdn|}	t|	d }
|
d |krtdx| r|t|d  }||
 }|dkr.|d	 q| d | }tj	||	d
}t|| }x6|dkr|d d }tj	||	d
}t|| }qVW |d  |7  < | t|d  } | r|d	 t|d }qW |d  |7  < |r|S d S )Nrj   r   rh   r   zus-asciizutf-8   z3max_line_length is too small to fit an encoded wordr?   )rO   )
r   r   r   ri   rR   r@  r   r   r   r   )Z	to_encoder?  rI  rJ  r;   rO   Zleading_wspZtrailing_wspZnew_last_ewZ	encode_as
chrome_lenZremaining_spaceZ
text_spaceZto_encode_wordZencoded_wordZexcessr   r   r   rG  
  sP    


rG  c          	   C   s  x| j D ]\}}|d  ds6|d  d7  < |}d}y|| d}W n0 tk
r   d}t|rxd}d}nd}Y nX |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 }x|rt|tt| d t| }||d krTd}|| d  }}x<|d | }tjj	|d	|d
}	t|	|krP |d8 }qfW |d
||||	 d	}|d7 }||d  }|r|d  d7  < qW q
W d S )Nrj   r  strictFTzunknown-8bitr   zutf-8r   )Zsafer   z
{}*={}''{}z{}={}rh   r?   rf   r   z''ry   N   z {}*{}*={}{})r   rz   r   r   r   r   r   r   r   rX   r!   r   ri   rR   r   )r(   r?  rI  r   r   r   rO   Zerror_handlerZencoding_requiredZencoded_valuerK  r   Zextra_chromerN  Z
splitpointZmaxcharspartialr   r   r   rE  
  s\    


 rE  )rerB  r   stringr   collectionsr   operatorr   Zemailr   r   r   r   r}   r   r   r   r   r~   r   Z	TSPECIALSr&  Z	ASPECIALSr*  r.  r   compileVERBOSE	MULTILINEr   r   r   r>   rC   rE   rG   rH   rJ   rL   rM   rQ   rV   rW   rZ   r_   rc   rd   re   rg   ro   rq   rr   rs   rt   rv   rw   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r!   r   ru   r   r   matchr   findallr   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'  r)  r+  r-  r/  r2  r4  r8  r9  r:  r<  r=  r>  r@  r.   rG  rE  r   r   r   r   <module>F   s  C"	
!*$
V	+






1C+"&'/'&).9%>D 49/gA