+
    Dfj]                     0   R t ^ RIt^ RIt^ RIHt ^ RIHtHtHt ^ RI	H
t
 ^ RIHt ^ RIHtHt R tRR lt ! R	 R
4      t]! ]4       ! R R]4      4       t]! ]
P(                  4       ! R R4      4       t]! ]4       ! R R]4      4       t ! R R]4      t]! ]
P(                  4       ! R R4      4       t ! R R]P4                  4      t]! ]4       ! R R]4      4       t]! ]
P(                  4       ! R R4      4       t]! ]4       ! R R]4      4       tR# )zD
Support for aliases(5) configuration files.

@author: Jp Calderone
N)implementer)deferprotocolreactor)smtp)IAlias)failurelogc                   VP                  R^4       Uu. uF  qDP                  4       NK  	  pp\        V4      ^8w  d$   RpW23p\        P                  ! Wg,          4       R# Vw  rV P                  VP                  4       . 4      P                  \        \        P                  V	P                  R4      4      4       R# u upi )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
   &&&&      4/usr/lib/python3/dist-packages/twisted/mail/alias.pyhandler       s    " !%

3 23 21WWY 2E3
5zQ; 	$**,+223syy%++cBR3ST 4s   B>c                f   / pRpVf   \        V4      pRpM\        VRR4      p^ pRp V F  pV^,          pVP                  4       pVP                  4       P	                  R4      '       d   KC  VP	                  R4      '       g   VP	                  R4      '       d   Wg,           pK{  V'       d   \        W6W4       TpK  	  V'       d   VP                  4        T'       d   \        Y6Y4       TP                  4        F  w  r\        YT4      Y8&   K  	  T#   T'       d   TP                  4        i i ; i)	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> # 	)	opengetattrrstriplstrip
startswithr    closeitems
AliasGroup)
domainsr   fpr   r,   iprevr   uas
   &&&       r   loadAliasFiler5   3   s   R FE	z(^2v{3	ADDFA;;=D{{}'',,%%)>)>{65  HHJvX)q1-	 M HHJ s   AD D D .D D0c                   :   a  ] tR t^{t o RtR tR tRR ltRtV t	R# )	AliasBasez
The default base class for aliases.

@ivar domains: See L{__init__}.

@type original: L{Address}
@ivar original: The original address being aliased.
c                H    Wn         \        P                  ! V4      V n        R# )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)r/   r   Addressoriginal)selfr/   r:   s   &&&r   __init__AliasBase.__init__   s     X.    c                P    V P                   V P                  P                  ,          # )z
Return the domain associated with original address.

@rtype: L{IDomain} provider
@return: The domain for the original address.
)r/   r:   domainr;   s   &r   r@   AliasBase.domain   s     ||DMM0011r>   Nc                n    Vf   / p\        V 4      V9   d   R# RV\        V 4      &   V P                  4       # 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))++r>   )r/   r:   N)
__name__
__module____qualname____firstlineno____doc__r<   r@   rI   __static_attributes____classdictcell____classdict__s   @r   r7   r7   {   s     	/2, ,r>   r7   c                   L   a  ] tR t^t o RtR tV 3R lR ltR tR	R ltRt	V t
R# )
AddressAliasz{
An alias which translates one email address into another.

@type alias : L{Address}
@ivar alias: The destination address.
c                l    \         P                  ! V .VO5!   \        P                  ! V4      V n        R# )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)r7   r<   r   r9   r   )r;   r   argss   &&*r   r<   AddressAlias.__init__   s'     	4'$'\\%(
r>   c                    < V ^8  d   QhRS[ /#    returnr   )formatrT   s   "r   __annotate__AddressAlias.__annotate__        ) ) )r>   c                "    RV P                    R2# )z
Build a string representation of this L{AddressAlias} instance.

@rtype: L{bytes}
@return: A string containing the destination address.
z	<Address >r   rA   s   &r   __str__AddressAlias.__str__   s     4::,a((r>   c                f    V P                  4       P                  \        V P                  4      4      # )z
Create a message receiver which delivers a message to
the destination address.

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

O44r>   Nc                   Vf   / p\        V 4      V9   d   R# RV\        V 4      &    V P                  4       P                  \        P                  ! V P
                  RRR4      V4      ! 4       #   \        P                   d     Mi ; iT P
                  P                  T9   d,   YP
                  P                  ,          P                  Y4      # R# rD   )	r   r@   ri   r   Userr   SMTPBadRcptlocalrI   rF   s   &&&r   rI   AddressAlias.resolve   s      <Dt9SY	;;=''		$**dD$(OQUVXX 		::x'JJ,,-55hEEs   AA. .BBre   rK   )rL   rM   rN   rO   rP   r<   rf   rE   rI   rQ   rR   rS   s   @r   rV   rV      s(     )) )5 r>   rV   c                   N   a  ] tR t^t o RtR tR tR tR tV 3R lR lt	Rt
V tR	# )
FileWrapperz
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                F    \         P                  ! 4       V n        Wn        R# )zk
@type filename: L{bytes}
@param filename: The name of the file in which the message should be
    stored.
N)tempfileTemporaryFiler0   	finalname)r;   r   s   &&r   r<   FileWrapper.__init__  s     ((*!r>   c                J    V P                   P                  VR,           4       R# )zq
Write a received line to the temporary file.

@type line: L{bytes}
@param line: A received line of the message.

N)r0   writer;   r   s   &&r   lineReceivedFileWrapper.lineReceived  s     	dTk"r>   c                   V P                   P                  ^ ^ 4        \        V P                  R4      pT;_uu_ 4        TP                  T P                   P                  4       4       T P                   P                  4        RRR4       \
        P                  ! T P                  4      #   \         d-    \
        P                  ! \        P                  ! 4       4      u # i ; i  + '       g   i     Lj; i)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.
r4   N)r0   seekr'   ru   BaseExceptionr   failr   Failurery   readr,   succeed)r;   fs   & r   eomReceivedFileWrapper.eomReceived  s     	Q	1T^^S)A QGGDGGLLN#GGMMO  }}T^^,,  	1::goo/00	1 Qs   B* AC$*4C! C!$C4	c                H    V P                   P                  4        RV n         R# )z7
Close the temporary file when the connection is lost.
N)r0   r,   rA   s   &r   connectionLostFileWrapper.connectionLost-  s     	r>   c                    < V ^8  d   QhRS[ /# r[   r^   )r_   rT   s   "r   r`   FileWrapper.__annotate__4  s     1 1 1r>   c                "    RV P                    R2# )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 rd   )ru   rA   s   &r   rf   FileWrapper.__str__4  s     t~~.a00r>   )ru   r0   NrL   rM   rN   rO   rP   r<   r{   r   r   rf   rQ   rR   rS   s   @r   rq   rq      s(     	"#-,1 1r>   rq   c                   B   a  ] tR tRt o RtR tV 3R lR ltR tRtV t	R# )		FileAliasi>  zS
An alias which translates an address to a file.

@ivar filename: See L{__init__}.
c                B    \         P                  ! V .VO5!   Wn        R# )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)r7   r<   r   )r;   r   rX   s   &&*r   r<   FileAlias.__init__F  s     	4'$' r>   c                    < V ^8  d   QhRS[ /# r[   r^   )r_   rT   s   "r   r`   FileAlias.__annotate__R  rb   r>   c                "    RV P                    R2# )z
Build a string representation of this L{FileAlias} instance.

@rtype: L{bytes}
@return: A string containing the name of the file.
z<File rd   r   rA   s   &r   rf   FileAlias.__str__R  s     a((r>   c                ,    \        V P                  4      # )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.
)rq   r   rA   s   &r   rE   FileAlias.createMessageReceiver[  s     4==))r>   r   N)
rL   rM   rN   rO   rP   r<   rf   rE   rQ   rR   rS   s   @r   r   r   >  s#     
!) )* *r>   r   c                       ] tR tRtRtRtR# )ProcessAliasTimeoutie  zV
An error indicating that a timeout occurred while waiting for a process
to complete.
 N)rL   rM   rN   rO   rP   rQ   r   r>   r   r   r   e  s    r>   r   c                   n   a  ] tR tRt o RtRt^<tRt]tRR lt	R t
R tR tR	 tR
 tV 3R lR ltRtV tR# )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.
FNc                    W n         Wn        \        P                  ! 4       V n        V P                  V P                  n        V P                  P                  V P                  4       Ve	   W0n        R# R# )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 r>   c                v    RV n         V P                  e$   V P                  P                  4        RV n        R# V# )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 Mr>   c                    V P                   '       d   R# V P                  P                  P                  VR,           4       R# )zp
Write a received line to the child process.

@type line: L{bytes}
@param line: A received line of the message.
Nrx   )r   r   	transportry   rz   s   &&r   r{   MessageWrapper.lineReceived  s,     999%%dTk2r>   c                    V P                   '       gZ   V P                  P                  P                  4        V P                  P                  V P                  V P                  4      V n        V P                  # )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   rA   s   &r   r   MessageWrapper.eomReceived  sW     yyyMM##224"&,,"8"8&&(>(>#D r>   c                   RV n         V P                  P                  P                  R4       \	        RV P
                   R24      pRV P                  n        V P                  P                  \        P                  ! V4      4       R# )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5r>   c                    R# )z)
Ignore notification of lost connection.
Nr   rA   s   &r   r   MessageWrapper.connectionLost  s    r>   c                    < V ^8  d   QhRS[ /# r[   r^   )r_   rT   s   "r   r`   MessageWrapper.__annotate__  s     6 6 6r>   c                "    RV P                    R2# )z
Build a string representation of this L{MessageWrapper} instance.

@rtype: L{bytes}
@return: A string containing the name of the process.
z<ProcessWrapper rd   )r   rA   s   &r   rf   MessageWrapper.__str__  s     "$"2"2!3155r>   )r   r   r   r   r   r   NN)rL   rM   rN   rO   rP   r   r   r   r   r<   r   r{   r   r   r   rf   rQ   rR   rS   s   @r   r   r   l  sI     < DNG#*,	3 
6
6 6r>   r   c                   .   a  ] tR tRt o RtRtR tRtV tR# )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 P                   e   V P                   P                  V4       R# R# )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& "r>   r   )	rL   rM   rN   rO   rP   r   r   rQ   rR   rS   s   @r   r   r     s      E' 'r>   r   c                   L   a  ] tR tRt o Rt]tR tV 3R lR ltR tR t	Rt
V tR	# )
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                    \         P                  ! V .VO5!   VP                  4       V n        V P                  ^ ,          V n        R# )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__}.
N)r7   r<   r   pathprogram)r;   r   rX   s   &&*r   r<   ProcessAlias.__init__  s3     	4'$'JJL	yy|r>   c                    < V ^8  d   QhRS[ /# r[   r^   )r_   rT   s   "r   r`   ProcessAlias.__annotate__.  s     ( ( (r>   c                "    RV P                    R2# )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 rd   )r   rA   s   &r   rf   ProcessAlias.__str__.  s     499+Q''r>   c                :    V P                   P                  WV4      # )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 ||((>>r>   c                    \        4       p\        WP                  V P                  4      pV P	                  WP                  V P
                  4       V# )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   rE   "ProcessAlias.createMessageReceiverQ  s=     !"1llDLL9!\\4995r>   )r   r   N)rL   rM   rN   rO   rP   r   r<   rf   r   rE   rQ   rR   rS   s   @r   r   r   
  s/     " G$( (?4 r>   r   c                   N   a  ] tR tRt o RtR tR tR tR tV 3R lR lt	R	t
V tR
# )MultiWrapperi_  zw
A message receiver which delivers a single message to multiple other
message receivers.

@ivar objs: See L{__init__}.
c                    Wn         R# )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	     	r>   c                N    V P                    F  pVP                  V4       K  	  R# )zj
Pass a received line to the message receivers.

@type line: L{bytes}
@param line: A line of the message.
N)r   r{   )r;   r   os   && r   r{   MultiWrapper.lineReceivedp  s     ANN4  r>   c                    \         P                  ! V P                   Uu. uF  qP                  4       NK  	  up4      # u upi )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                L    V P                    F  pVP                  4        K  	  R# )zA
Inform the message receivers that the connection has been lost.
N)r   r   r   s   & r   r   MultiWrapper.connectionLost  s     A r>   c                    < V ^8  d   QhRS[ /# r[   r^   )r_   rT   s   "r   r`   MultiWrapper.__annotate__  s     9 9 9r>   c                @    R\        \        V P                  4      : R2# )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 rd   )r   r   r   rA   s   &r   rf   MultiWrapper.__str__  s      C 36a88r>   r   Nr   rS   s   @r   r   r   _  s)     !	H9 9r>   r   c                   V   a  ] tR tRt o Rt]tR tR tV 3R lR lt	R t
RR	 ltR
tV tR# )r.   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           	     0   \         P                  ! V .VO5!   . V n        V'       Ed   VP                  4       P	                  4       pVP                  R4      '       dw    \        VR,          4      pT;_uu_ 4        RP                  V Uu. uF  qUP	                  4       NK  	  up4      pRRR4       VP                  VP                  R4      4       K  VP                  R4      '       d8   V P                  P                  V P                  ! VR,          .VO5!  4       EK  VP                  R4      '       dh   \        P                   P#                  V4      '       d   \        P                  ! R	4       EKW  V P                  P                  \%        V.VO5!  4       EK  V P                  P                  \'        V.VO5!  4       EK  R# u upi   + '       g   i     EL/; i  \         d'    \        P                  ! RTR,          : 24        EK  i ; i)
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   :   NNr%   Nr   zInvalid filename in alias file |/z Directory delivery not supported)r7   r<   aliasespopr   r+   r'   joinr   r   r   r	   r   appendprocessAliasFactoryosr   isdirr   rV   )r;   r-   rX   addrr   ls   &&*   r   r<   AliasGroup.__init__  sv    	4'$'e99;$$&Ds##2T"XA "xxA(>AqA(>? LLC1%%##D$<$<T"X$M$MN%%77==&&GG>?LL''	$(>(>?##L$=$=>'  )?  % LGG=d2h\JKKLs0   G$ ;GG#GGG!	$,HHc                ,    \        V P                  4      # )zi
Return the number of aliases in the group.

@rtype: L{int}
@return: The number of aliases in the group.
)r   r   rA   s   &r   __len__AliasGroup.__len__  s     4<<  r>   c                    < V ^8  d   QhRS[ /# r[   r^   )r_   rT   s   "r   r`   AliasGroup.__annotate__  s     I I Ir>   c                b    RRP                  \        \        V P                  4      4      ,          # )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   rA   s   &r   rf   AliasGroup.__str__  s#     #diiC0F&GHHr>   c                p    \        V P                   Uu. uF  qP                  4       NK  	  up4      # u upi )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   rE   )r;   r4   s   & r   rE    AliasGroup.createMessageReceiver  s,     M1446MNNMs   3Nc                    Vf   / p. pV P                    F#  pVP                  VP                  W4      4       K%  	  \        \	        RV4      4      # )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   rI   r   filter)r;   rG   rH   rr4   s   &&&  r   rI   AliasGroup.resolve  sG      <DAHHQYYx./ F4O,,r>   )r   rK   )rL   rM   rN   rO   rP   r   r   r<   r   rf   rE   rI   rQ   rR   rS   s   @r   r.   r.     s9     	 '$?L!I I	O- -r>   r.   r   )rP   r   rs   zope.interfacer   twisted.internetr   r   r   twisted.mailr   twisted.mail.interfacesr   twisted.pythonr   r	   r    r5   r7   rV   IMessagerq   r   	Exceptionr   r   ProcessProtocolr   r   r   r.   r   r>   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-r>   