
    h]                     .   S r SSKrSSKrSSKJr  SSKJrJrJr  SSK	J
r
  SSKJr  SSKJrJr  S rSS	 jr " S
 S5      r\" \5       " S S\5      5       r\" \
R(                  5       " S S5      5       r\" \5       " S S\5      5       r " S S\5      r\" \
R(                  5       " S S5      5       r " S S\R4                  5      r\" \5       " S S\5      5       r\" \
R(                  5       " S S5      5       r\" \5       " S S\5      5       rg)zD
Support for aliases(5) configuration files.

@author: Jp Calderone
    N)implementer)deferprotocolreactor)smtp)IAlias)failurelogc                 z   UR                  SS5       Vs/ s H  oDR                  5       PM     nn[        U5      S:w  a  SnX24n[        R                  " Xg-  5        gUu  pU R                  UR                  5       / 5      R                  [        [        R                  U	R                  S5      5      5        gs  snf )a  
Parse a line from an aliases file.

@type result: L{dict} mapping L{bytes} to L{list} of L{bytes}
@param result: A dictionary mapping username to aliases to which
    the results of parsing the line are added.

@type line: L{bytes}
@param line: A line from an aliases file.

@type filename: L{bytes}
@param filename: The full or relative path to the aliases file.

@type lineNo: L{int}
@param lineNo: The position of the line within the aliases file.
:      z+Invalid format on line %d of alias file %s.,N)	splitstriplenr
   err
setdefaultextendmapstr)
resultlinefilenamelineNoppartsfmtarguseraliass
             Y/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/mail/alias.pyhandler#      s    " !%

3 23 21WWY 2E3
5zQ; 	$**,+223syy%++cBR3ST 4s   B8c                 F   0 nSnUc  [        U5      nSnO[        USS5      nSnSn U H  nUS-  nUR                  5       nUR                  5       R	                  S5      (       a  M>  UR	                  S	5      (       d  UR	                  S
5      (       a  Xg-   nMp  U(       a  [        X6X5        UnM     U(       a  UR                  5         U(       a  [        X6X5        UR                  5        H  u  p[        XU5      X8'   M     U$ ! U(       a  UR                  5         f f = f)a:  
Load a file containing email aliases.

Lines in the file should be formatted like so::

     username: alias1, alias2, ..., aliasN

Aliases beginning with a C{|} will be treated as programs, will be run, and
the message will be written to their stdin.

Aliases beginning with a C{:} will be treated as a file containing
additional aliases for the username.

Aliases beginning with a C{/} will be treated as the full pathname to a file
to which the message will be appended.

Aliases without a host part will be assumed to be addresses on localhost.

If a username is specified multiple times, the aliases for each are joined
together as if they had all been on one line.

Lines beginning with a space or a tab are continuations of the previous
line.

Lines beginning with a C{#} are comments.

@type domains: L{dict} mapping L{bytes} to L{IDomain} provider
@param domains: A mapping of domain name to domain object.

@type filename: L{bytes} or L{None}
@param filename: The full or relative path to a file from which to load
    aliases. If omitted, the C{fp} parameter must be specified.

@type fp: file-like object or L{None}
@param fp: The file from which to load aliases. If specified,
    the C{filename} parameter is ignored.

@rtype: L{dict} mapping L{bytes} to L{AliasGroup}
@return: A mapping from username to group of aliases.
FTnamez	<unknown>r    r   # 	)	opengetattrrstriplstrip
startswithr#   closeitems
AliasGroup)
domainsr   fpr   r/   iprevr   uas
             r"   loadAliasFiler8   3   s   R FE	z(^2v{3	ADDFA;;=D{{}'',,%%)>)>{65  HHJvX)q1-	 M HHJ s   BD D c                   .    \ rS rSrSrS rS rSS jrSrg)		AliasBase{   z
The default base class for aliases.

@ivar domains: See L{__init__}.

@type original: L{Address}
@ivar original: The original address being aliased.
c                 F    Xl         [        R                  " U5      U l        g)z
@type domains: L{dict} mapping L{bytes} to L{IDomain} provider
@param domains: A mapping of domain name to domain object.

@type original: L{bytes}
@param original: The original address being aliased.
N)r2   r   Addressoriginal)selfr2   r>   s      r"   __init__AliasBase.__init__   s     X.    c                 H    U R                   U R                  R                     $ )z
Return the domain associated with original address.

@rtype: L{IDomain} provider
@return: The domain for the original address.
)r2   r>   domainr?   s    r"   rD   AliasBase.domain   s     ||DMM0011rB   Nc                 h    Uc  0 n[        U 5      U;   a  gSU[        U 5      '   U R                  5       $ a  
Map this alias to its ultimate destination.

@type aliasmap: L{dict} mapping L{bytes} to L{AliasBase}
@param aliasmap: A mapping of username to alias or group of aliases.

@type memo: L{None} or L{dict} of L{AliasBase}
@param memo: A record of the aliases already considered in the
    resolution process.  If provided, C{memo} is modified to include
    this alias.

@rtype: L{IMessage <smtp.IMessage>} or L{None}
@return: A message receiver for the ultimate destination or None for
    an invalid destination.
N)r   createMessageReceiverr?   aliasmapmemos      r"   resolveAliasBase.resolve   s9      <Dt9SY))++rB   )r2   r>   N)	__name__
__module____qualname____firstlineno____doc__r@   rD   rM   __static_attributes__ rB   r"   r:   r:   {   s    	/2,rB   r:   c                   <    \ rS rSrSrS rS\4S jrS rS
S jr	S	r
g)AddressAlias   z{
An alias which translates one email address into another.

@type alias : L{Address}
@ivar alias: The destination address.
c                 h    [         R                  " U /UQ76   [        R                  " U5      U l        g)a  
@type alias: L{Address}, L{User}, L{bytes} or object which can be
    converted into L{bytes}
@param alias: The destination address.

@type args: 2-L{tuple} of (0) L{dict} mapping L{bytes} to L{IDomain}
    provider, (1) L{bytes}
@param args: Arguments for L{AliasBase.__init__}.
N)r:   r@   r   r=   r!   )r?   r!   argss      r"   r@   AddressAlias.__init__   s'     	4'$'\\%(
rB   returnc                 "    SU R                    S3$ )z
Build a string representation of this L{AddressAlias} instance.

@rtype: L{bytes}
@return: A string containing the destination address.
z	<Address >r!   rE   s    r"   __str__AddressAlias.__str__   s     4::,a((rB   c                 f    U R                  5       R                  [        U R                  5      5      $ )z
Create a message receiver which delivers a message to
the destination address.

@rtype: L{IMessage <smtp.IMessage>} provider
@return: A message receiver.
)rD   existsr   r!   rE   s    r"   rI   "AddressAlias.createMessageReceiver   s#     {{}##C

O44rB   Nc                    Uc  0 n[        U 5      U;   a  gSU[        U 5      '    U R                  5       R                  [        R                  " U R
                  SSS5      U5      " 5       $ ! [        R                   a     Of = fU R
                  R                  U;   a'  XR
                  R                     R                  X5      $ grH   )	r   rD   rd   r   Userr!   SMTPBadRcptlocalrM   rJ   s      r"   rM   AddressAlias.resolve   s      <Dt9SY	;;=''		$**dD$(OQUVXX 		::x'JJ,,-55hEEs   AA+ +BBr`   rO   )rP   rQ   rR   rS   rT   r@   r   ra   rI   rM   rU   rV   rB   r"   rX   rX      s"    )) )5rB   rX   c                   >    \ rS rSrSrS rS rS rS rS\	4S jr
S	rg
)FileWrapper   z
A message receiver which delivers a message to a file.

@type fp: file-like object
@ivar fp: A file used for temporary storage of the message.

@type finalname: L{bytes}
@ivar finalname: The name of the file in which the message should be
    stored.
c                 D    [         R                  " 5       U l        Xl        g)zk
@type filename: L{bytes}
@param filename: The name of the file in which the message should be
    stored.
N)tempfileTemporaryFiler3   	finalname)r?   r   s     r"   r@   FileWrapper.__init__  s     ((*!rB   c                 @    U R                   R                  US-   5        g)zq
Write a received line to the temporary file.

@type line: L{bytes}
@param line: A received line of the message.

N)r3   writer?   r   s     r"   lineReceivedFileWrapper.lineReceived  s     	dTk"rB   c                    U R                   R                  SS5         [        U R                  S5      nU   UR                  U R                   R                  5       5        U R                   R                  5         SSS5        [
        R                  " U R                  5      $ ! [         a,    [
        R                  " [        R                  " 5       5      s $ f = f! , (       d  f       Ng= f)a+  
Handle end of message by writing the message to the file.

@rtype: L{Deferred <defer.Deferred>} which successfully results in
    L{bytes}
@return: A deferred which succeeds with the name of the file to which
    the message has been stored or fails if the message cannot be
    saved to the file.
r   r7   N)r3   seekr*   rq   BaseExceptionr   failr	   Failureru   readr/   succeed)r?   fs     r"   eomReceivedFileWrapper.eomReceived  s     	Q	1T^^S)A GGDGGLLN#GGMMO  }}T^^,,  	1::goo/00	1 Qs   B" AC"3CC
C)c                 F    U R                   R                  5         SU l         g)z7
Close the temporary file when the connection is lost.
N)r3   r/   rE   s    r"   connectionLostFileWrapper.connectionLost-  s     	rB   r]   c                 "    SU R                    S3$ )z
Build a string representation of this L{FileWrapper} instance.

@rtype: L{bytes}
@return: A string containing the file name of the message.
z<FileWrapper r_   )rq   rE   s    r"   ra   FileWrapper.__str__4  s     t~~.a00rB   )rq   r3   NrP   rQ   rR   rS   rT   r@   rw   r   r   r   ra   rU   rV   rB   r"   rl   rl      s'    	"#-,1 1rB   rl   c                   2    \ rS rSrSrS rS\4S jrS rSr	g)		FileAliasi>  zS
An alias which translates an address to a file.

@ivar filename: See L{__init__}.
c                 >    [         R                  " U /UQ76   Xl        g)z
@type filename: L{bytes}
@param filename: The name of the file in which to store the message.

@type args: 2-L{tuple} of (0) L{dict} mapping L{bytes} to L{IDomain}
    provider, (1) L{bytes}
@param args: Arguments for L{AliasBase.__init__}.
N)r:   r@   r   )r?   r   r[   s      r"   r@   FileAlias.__init__F  s     	4'$' rB   r]   c                 "    SU R                    S3$ )z
Build a string representation of this L{FileAlias} instance.

@rtype: L{bytes}
@return: A string containing the name of the file.
z<File r_   r   rE   s    r"   ra   FileAlias.__str__R  s     a((rB   c                 ,    [        U R                  5      $ )z
Create a message receiver which delivers a message to the file.

@rtype: L{FileWrapper}
@return: A message receiver which writes a message to the file.
)rl   r   rE   s    r"   rI   FileAlias.createMessageReceiver[  s     4==))rB   r   N)
rP   rQ   rR   rS   rT   r@   r   ra   rI   rU   rV   rB   r"   r   r   >  s    
!) )*rB   r   c                       \ rS rSrSrSrg)ProcessAliasTimeoutie  zV
An error indicating that a timeout occurred while waiting for a process
to complete.
rV   N)rP   rQ   rR   rS   rT   rU   rV   rB   r"   r   r   e  s    rB   r   c                   ^    \ rS rSrSrSrSrSr\rSS jr	S r
S rS	 rS
 rS rS\4S jrSrg)MessageWrapperil  a  
A message receiver which delivers a message to a child process.

@type completionTimeout: L{int} or L{float}
@ivar completionTimeout: The number of seconds to wait for the child
    process to exit before reporting the delivery as a failure.

@type _timeoutCallID: L{None} or
    L{IDelayedCall <twisted.internet.interfaces.IDelayedCall>} provider
@ivar _timeoutCallID: The call used to time out delivery, started when the
    connection to the child process is closed.

@type done: L{bool}
@ivar done: A flag indicating whether the child process has exited
    (C{True}) or not (C{False}).

@type reactor: L{IReactorTime <twisted.internet.interfaces.IReactorTime>}
    provider
@ivar reactor: A reactor which will be used to schedule timeouts.

@ivar protocol: See L{__init__}.

@type processName: L{bytes} or L{None}
@ivar processName: The process name.

@type completion: L{Deferred <defer.Deferred>}
@ivar completion: The deferred which will be triggered by the protocol
    when the child process exits.
F<   Nc                     X l         Xl        [        R                  " 5       U l        U R                  U R                  l        U R                  R                  U R                  5        Ub  X0l        gg)aV  
@type protocol: L{ProcessAliasProtocol}
@param protocol: The protocol associated with the child process.

@type process: L{bytes} or L{None}
@param process: The process name.

@type reactor: L{None} or L{IReactorTime
    <twisted.internet.interfaces.IReactorTime>} provider
@param reactor: A reactor which will be used to schedule timeouts.
N)	processNamer   r   Deferred
completiononEndaddBoth_processEndedr   )r?   r   processr   s       r"   r@   MessageWrapper.__init__  sU     # ..*"oo 2 23"L rB   c                 r    SU l         U R                  b"  U R                  R                  5         SU l        gU$ )a_  
Record process termination and cancel the timeout call if it is active.

@type result: L{Failure <failure.Failure>}
@param result: The reason the child process terminated.

@rtype: L{None} or L{Failure <failure.Failure>}
@return: None, if the process end is expected, or the reason the child
    process terminated, if the process end is unexpected.
TN)done_timeoutCallIDcancel)r?   r   s     r"   r   MessageWrapper._processEnded  s:     	* &&("&D MrB   c                 x    U R                   (       a  gU R                  R                  R                  US-   5        g)zp
Write a received line to the child process.

@type line: L{bytes}
@param line: A received line of the message.
Nrt   )r   r   	transportru   rv   s     r"   rw   MessageWrapper.lineReceived  s*     99%%dTk2rB   c                     U R                   (       dY  U R                  R                  R                  5         U R                  R                  U R                  U R                  5      U l        U R                  $ )z
Disconnect from the child process and set up a timeout to wait for it
to exit.

@rtype: L{Deferred <defer.Deferred>}
@return: A deferred which will be called back when the child process
    exits.
)
r   r   r   loseConnectionr   	callLatercompletionTimeout_completionCancelr   r   rE   s    r"   r   MessageWrapper.eomReceived  sU     yyMM##224"&,,"8"8&&(>(>#D rB   c                    SU l         U R                  R                  R                  S5        [	        SU R
                   S35      nSU R                  l        U R                  R                  [        R                  " U5      5        g)z
Handle the expiration of the timeout for the child process to exit by
terminating the child process forcefully and issuing a failure to the
L{completion} deferred.
NKILLzNo answer after z seconds)r   r   r   signalProcessr   r   r   r   errbackr	   r}   )r?   excs     r"   r    MessageWrapper._completionCancel  sf     #--f5!$4T5K5K4LH"UV" 45rB   c                     g)z)
Ignore notification of lost connection.
NrV   rE   s    r"   r   MessageWrapper.connectionLost  s    rB   r]   c                 "    SU R                    S3$ )z
Build a string representation of this L{MessageWrapper} instance.

@rtype: L{bytes}
@return: A string containing the name of the process.
z<ProcessWrapper r_   )r   rE   s    r"   ra   MessageWrapper.__str__  s     "$"2"2!3155rB   )r   r   r   r   r   r   NN)rP   rQ   rR   rS   rT   r   r   r   r   r@   r   rw   r   r   r   r   ra   rU   rV   rB   r"   r   r   l  sH    < DNG#*,	3 
6
6 6rB   r   c                   "    \ rS rSrSrSrS rSrg)ProcessAliasProtocoli  z
A process protocol which errbacks a deferred when the associated
process ends.

@type onEnd: L{None} or L{Deferred <defer.Deferred>}
@ivar onEnd: If set, a deferred on which to errback when the process ends.
Nc                 V    U R                   b  U R                   R                  U5        gg)zv
Call an errback.

@type reason: L{Failure <failure.Failure>}
@param reason: The reason the child process terminated.
N)r   r   )r?   reasons     r"   processEnded!ProcessAliasProtocol.processEnded  s%     ::!JJv& "rB   rV   )rP   rQ   rR   rS   rT   r   r   rU   rV   rB   r"   r   r     s     E'rB   r   c                   <    \ rS rSrSr\rS rS\4S jrS r	S r
Srg	)
ProcessAliasi
  a  
An alias which is handled by the execution of a program.

@type path: L{list} of L{bytes}
@ivar path: The arguments to pass to the process. The first string is
    the executable's name.

@type program: L{bytes}
@ivar program: The path of the program to be executed.

@type reactor: L{IReactorTime <twisted.internet.interfaces.IReactorTime>}
    and L{IReactorProcess <twisted.internet.interfaces.IReactorProcess>}
    provider
@ivar reactor: A reactor which will be used to create and timeout the
    child process.
c                     [         R                  " U /UQ76   UR                  5       U l        U R                  S   U l        g)a   
@type path: L{bytes}
@param path: The command to invoke the program consisting of the path
    to the executable followed by any arguments.

@type args: 2-L{tuple} of (0) L{dict} mapping L{bytes} to L{IDomain}
    provider, (1) L{bytes}
@param args: Arguments for L{AliasBase.__init__}.
r   N)r:   r@   r   pathprogram)r?   r   r[   s      r"   r@   ProcessAlias.__init__  s3     	4'$'JJL	yy|rB   r]   c                 "    SU R                    S3$ )z
Build a string representation of this L{ProcessAlias} instance.

@rtype: L{bytes}
@return: A string containing the command used to invoke the process.
z	<Process r_   )r   rE   s    r"   ra   ProcessAlias.__str__.  s     499+Q''rB   c                 :    U R                   R                  XU5      $ )a  
Spawn a process.

This wraps the L{spawnProcess
<twisted.internet.interfaces.IReactorProcess.spawnProcess>} method on
L{reactor} so that it can be customized for test purposes.

@type proto: L{IProcessProtocol
    <twisted.internet.interfaces.IProcessProtocol>} provider
@param proto: An object which will be notified of all events related to
    the created process.

@type program: L{bytes}
@param program: The full path name of the file to execute.

@type path: L{list} of L{bytes}
@param path: The arguments to pass to the process. The first string
    should be the executable's name.

@rtype: L{IProcessTransport
    <twisted.internet.interfaces.IProcessTransport>} provider
@return: A process transport.
)r   spawnProcess)r?   protor   r   s       r"   r   ProcessAlias.spawnProcess7  s    0 ||((>>rB   c                     [        5       n[        XR                  U R                  5      nU R	                  XR                  U R
                  5        U$ )z
Launch a process and create a message receiver to pass a message
to the process.

@rtype: L{MessageWrapper}
@return: A message receiver which delivers a message to the process.
)r   r   r   r   r   r   )r?   r   ms      r"   rI   "ProcessAlias.createMessageReceiverQ  s=     !"1llDLL9!\\4995rB   )r   r   N)rP   rQ   rR   rS   rT   r   r@   r   ra   r   rI   rU   rV   rB   r"   r   r   
  s)    " G$( (?4rB   r   c                   >    \ rS rSrSrS rS rS rS rS\	4S jr
S	rg
)MultiWrapperi_  zw
A message receiver which delivers a single message to multiple other
message receivers.

@ivar objs: See L{__init__}.
c                     Xl         g)z
@type objs: L{list} of L{IMessage <smtp.IMessage>} provider
@param objs: Message receivers to which the incoming message should be
    directed.
Nobjs)r?   r   s     r"   r@   MultiWrapper.__init__h  s	     	rB   c                 L    U R                    H  nUR                  U5        M     g)zj
Pass a received line to the message receivers.

@type line: L{bytes}
@param line: A line of the message.
N)r   rw   )r?   r   os      r"   rw   MultiWrapper.lineReceivedp  s     ANN4  rB   c                     [         R                  " U R                   Vs/ s H  oR                  5       PM     sn5      $ s  snf )a  
Pass the end of message along to the message receivers.

@rtype: L{DeferredList <defer.DeferredList>} whose successful results
    are L{bytes} or L{None}
@return: A deferred list which triggers when all of the message
    receivers have finished handling their end of message.
)r   DeferredListr   r   r?   r   s     r"   r   MultiWrapper.eomReceivedz  s/     !!DII"FIq==?I"FGG"Fs   ?c                 J    U R                    H  nUR                  5         M     g)zA
Inform the message receivers that the connection has been lost.
N)r   r   r   s     r"   r   MultiWrapper.connectionLost  s     A rB   r]   c                 @    S[        [        U R                  5      < S3$ )z
Build a string representation of this L{MultiWrapper} instance.

@rtype: L{bytes}
@return: A string containing a list of the message receivers.
z<GroupWrapper r_   )r   r   r   rE   s    r"   ra   MultiWrapper.__str__  s      C 36a88rB   r   Nr   rV   rB   r"   r   r   _  s(    !	H9 9rB   r   c                   F    \ rS rSrSr\rS rS rS\	4S jr
S rSS	 jrS
rg)r1   i  a0  
An alias which points to multiple destination aliases.

@type processAliasFactory: no-argument callable which returns
    L{ProcessAlias}
@ivar processAliasFactory: A factory for process aliases.

@type aliases: L{list} of L{AliasBase} which implements L{IAlias}
@ivar aliases: The destination aliases.
c                    [         R                  " U /UQ76   / U l        U(       Ga  UR                  5       R	                  5       nUR                  S5      (       aj   [        USS 5      nU   SR                  U Vs/ s H  oUR	                  5       PM     sn5      nSSS5        UR                  UR                  S5      5        OUR                  S5      (       a0  U R                  R                  U R                  " USS /UQ76 5        OUR                  S5      (       aa  [        R                   R#                  U5      (       a  [        R                  " S	5        OKU R                  R                  [%        U/UQ76 5        O%U R                  R                  ['        U/UQ76 5        U(       a  GM  ggs  snf ! , (       d  f       GN#= f! [         a     [        R                  " SUSS < 35         NLf = f)
a:  
Create a group of aliases.

Parse a list of alias strings and, for each, create an appropriate
alias object.

@type items: L{list} of L{bytes}
@param items: Aliases.

@type args: n-L{tuple} of (0) L{dict} mapping L{bytes} to L{IDomain}
    provider, (1) L{bytes}
@param args: Arguments for L{AliasBase.__init__}.
r   r   Nr(   r   zInvalid filename in alias file |/z Directory delivery not supported)r:   r@   aliasespopr   r.   r*   joinr   r   r{   r
   r   appendprocessAliasFactoryosr   isdirr   rX   )r?   r0   r[   addrr   ls         r"   r@   AliasGroup.__init__  su    	4'$'99;$$&Ds##2T!"XA "xxA(>AqA(>? LLC1%%##D$<$<T!"X$M$MN%%77==&&GG>?LL''	$(>(>?##L$=$=>' e )?  % LGG=d12h\JKLs0   G
 ,F8<F3
F83F88
G
'G43G4c                 ,    [        U R                  5      $ )zi
Return the number of aliases in the group.

@rtype: L{int}
@return: The number of aliases in the group.
)r   r   rE   s    r"   __len__AliasGroup.__len__  s     4<<  rB   r]   c                 Z    SSR                  [        [        U R                  5      5      -  $ )z
Build a string representation of this L{AliasGroup} instance.

@rtype: L{bytes}
@return: A string containing the aliases in the group.
z<AliasGroup [%s]>z, )r   r   r   r   rE   s    r"   ra   AliasGroup.__str__  s#     #diiC0F&GHHrB   c                 r    [        U R                   Vs/ s H  oR                  5       PM     sn5      $ s  snf )z
Create a message receiver for each alias and return a message receiver
which will pass on a message to each of those.

@rtype: L{MultiWrapper}
@return: A message receiver which passes a message on to message
    receivers for each alias in the group.
)r   r   rI   )r?   r7   s     r"   rI    AliasGroup.createMessageReceiver  s,     M1446MNNMs   4Nc                     Uc  0 n/ nU R                    H#  nUR                  UR                  X5      5        M%     [        [	        SU5      5      $ )a)  
Map each of the aliases in the group to its ultimate destination.

@type aliasmap: L{dict} mapping L{bytes} to L{AliasBase}
@param aliasmap: A mapping of username to alias or group of aliases.

@type memo: L{None} or L{dict} of L{AliasBase}
@param memo: A record of the aliases already considered in the
    resolution process.  If provided, C{memo} is modified to include
    this alias.

@rtype: L{MultiWrapper}
@return: A message receiver which passes the message on to message
    receivers for the ultimate destination of each alias in the group.
N)r   r   rM   r   filter)r?   rK   rL   rr7   s        r"   rM   AliasGroup.resolve  sG      <DAHHQYYx./ F4O,,rB   )r   rO   )rP   rQ   rR   rS   rT   r   r   r@   r   r   ra   rI   rM   rU   rV   rB   r"   r1   r1     s3    	 '$?L!I I	O-rB   r1   r   )rT   r   ro   zope.interfacer   twisted.internetr   r   r   twisted.mailr   twisted.mail.interfacesr   twisted.pythonr	   r
   r#   r8   r:   rX   IMessagerl   r   	Exceptionr   r   ProcessProtocolr   r   r   r1   rV   rB   r"   <module>r      sU   
  & 5 5  * 'U6EP3, 3,l VC9 C CL T]]B1 B1 B1J V#*	 #* #*L)  T]]D6 D6 D6N'833 ', VQ9 Q Qh T]]39 39 39l Vf- f- f-rB   