+
    üÐje8  ã                   ó~  € R t ^ RIt^ RIHtHtHtHtHtHtH	t	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHtHt ^ RIHtHt ^ RIHt ^ R	IHtHt ^ R
IHt ^ RIHt ^ RIH t  ^ RI!H"t" ^ RI#H$t$ ^ RI%H&t& ^ RI'H(t(H)t)H*t*H+t+ ^ RI,H-t- ^ RI.H/t/ ^ RI0H1t1H2t2 ^ RI3H4t4 ^RI5H6t6H7t7H8t8 ]! RR7       ! R R]94      4       t: ! R R]4      t; ! R R]4      t<]
! R4      t=]]<.]]=,          3,          t> ! R R ] 4      t? ! R! R"] 4      t@]! ]4       ! R# R$4      4       tA]! ]4       ! R% R&4      4       tB ! R' R(]94      tC ! R) R*]4      tDR# )+z:
This module implements the worker classes.

@since: 12.3
N)ÚAnyÚ	AwaitableÚCallableÚDictÚListÚOptionalÚTextIOÚTypeVar)ÚTestCase)Úimplementer)Úfrozen)ÚProtocolÚ	TypedDict)ÚDeferredÚDeferredList)ÚProcessDone)ÚIAddressÚ
ITransport)ÚProcessProtocol)ÚLogger)ÚAMP©ÚFailure)ÚFilePath)ÚnamedObject)Ú_WORKER_AMP_STDINÚ_WORKER_AMP_STDOUTÚmanagercommandsÚworkercommands)ÚWorkerReporter)Ú
TestResult)Ú
TestLoaderÚ
TrialSuite)ÚTodo)Ú
StreamOpenÚStreamReceiverÚStreamWriteF)Úauto_excc                   ó0   a € ] tR t^+t o RtV 3R ltRtV tR# )ÚWorkerExceptionz}
An exception was reported by a test running in a worker process.

@ivar message: An error message describing the exception.
c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # )é   Úmessage)Ústr)ÚformatÚ__classdict__s   "€Ú</usr/lib/python3/dist-packages/twisted/trial/_dist/worker.pyÚ__annotate__ÚWorkerException.__annotate__+   s   ø‡ ‚ ñ �Lò ó    © N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©r/   s   @r0   r)   r)   +   s   ø‡ € ñ÷ ƒ r3   r)   c                   ó0   a € ] tR t^6t o RtV 3R ltRtV tR# )Ú	RunResultz:
Represent the result of a L{workercommands.Run} command.
c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # )r+   Úsuccess)Úbool)r.   r/   s   "€r0   r1   ÚRunResult.__annotate__6   s   ø‡ ‚ ñ
 �Mò r3   r4   Nr5   r>   s   @r0   r@   r@   6   s   ø‡ € ñ÷ ƒ r3   r@   c                   ó6   a € ] tR t^>t o RtV 3R lR ltRtV tR# )ÚWorkerz!
An object that can run actions.
c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r+   ÚcaseÚresultÚreturn©r
   r    r@   )r.   r/   s   "€r0   r1   ÚWorker.__annotate__C   s"   ø€ ÷ ñ ™hð ±
ð ¹yñ r3   c              ƒ  ó   "  € R# 5i)z
Run a test case.
Nr4   )ÚselfrH   rI   s   &&&r0   ÚrunÚ
Worker.runC   s   é ‚ ùs   ‚r4   N)r6   r7   r8   r9   r:   rO   r<   r=   r>   s   @r0   rF   rF   >   s   ø‡ € ñ÷ö r3   rF   Ú_Tc                   ó¸   a € ] tR t^Mt o Rt]! 4       tRR lt]P                  P                  V 3R lR l4       t]P                  P                  R 4       tRtV tR# )	ÚWorkerProtocolz-
The worker-side trial distributed protocol.
c                óP   € \        4       V n        \        V 4      V n        Wn        R # ©N)r!   Ú_loaderr   Ú_resultÚ_forceGarbageCollection)rN   ÚforceGarbageCollections   &&r0   Ú__init__ÚWorkerProtocol.__init__T   s   € Ü!“|ˆŒÜ% dÓ+ˆŒØ'=Ö$r3   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r+   ÚtestCaserJ   )r-   r@   )r.   r/   s   "€r0   r1   ÚWorkerProtocol.__annotate__Z   s   ø€ ÷ *)ñ *)¡#ð *)©)ñ *)r3   c              ƒ  óh  "  € V P                   P                  4       ;_uu_ 4       pV P                  P                  V4      p\	        V.V P
                  4      pVP                  V P                   4       RRR4       Rp\        XRR7      G Rj  x€L
  FT  w  rgV'       d   K  RpV P                  P                  RVVR7        V P                   P                  VV4      G Rj  x€L
  KV  	  RV/#   + '       g   i     Lƒ; i Ls L!  \         d     T P                  P                  R4        Kœ  i ; i5i)	z
Run a test case by name.
NT)ÚconsumeErrorsFz Result reporting for {id} failed)ÚfailureÚidz5Additionally, reporting the reporting failure failed.rB   )rW   ÚgatherReportingResultsrV   Ú
loadByNamer"   rX   rO   r   Úloggerra   ÚaddErrorFallibleÚBaseException)rN   r]   ÚresultsrH   ÚsuiteÚallSucceededrB   rI   s   &&      r0   rO   ÚWorkerProtocol.runY   s  é € ð
 �\‰\×0Ñ0×2Ô2°gØ—<‘<×*Ñ*¨8Ó4ˆDÜ ˜v t×'CÑ'CÓDˆEØ�I‰I�d—l‘lÔ#÷ 3ð
 ˆÜ%1°'ÈÔ%N×NÒN‰OˆGßáð !ˆLð �K‰K×ÑØ2àØð	  ô ðØ—l‘l×3Ñ3Øàó÷ ò ñ'  Oð@ ˜<Ð(Ð(÷M 3×2úñ  Oñ&øô
 !ô ð —‘×#Ñ#ØK÷ð	üs_   ‚#D2¥AC.Á3D2ÂDÂ3D2ÃDÃ!DÃ"DÃ&D2Ã.C>	Ã9	D2ÄDÄ&D/Ä+D2Ä.D/Ä/D2c                ó6   € \         P                  ! V4       RR/# )zJ
Set up the worker, moving into given directory for tests to run in
them.
rB   T)ÚosÚchdir)rN   Ú	directorys   &&r0   ÚstartÚWorkerProtocol.start†   s   € ô 	�Š�ÔØ˜4Ð Ð r3   )rX   rV   rW   N)F)r6   r7   r8   r9   r:   r   re   rZ   r   ÚRunÚ	responderrO   ÚStartrp   r<   r=   r>   s   @r0   rS   rS   M   sY   ø‡ € ññ ‹X€Fô>ð
 ×Ñ×!Ñ!÷*)ó "ð*)ðX ×Ñ×#Ñ#ñ!ó $ö!r3   rS   c                   óX  a a€ ] tR t^�t oRtRV 3R llt]P                  R 4       t]	P                  R 4       t
]P                  P                  R 4       tV3R lR lt]P                  P                  V3R lR	 l4       t]P"                  P                  V3R
 lR l4       t]P&                  P                  R 4       t]P*                  P                  V3R lR l4       t]P.                  P                  R 4       t]P2                  P                  R 4       tV3R lR ltR tRtVtV ;t# )ÚLocalWorkerAMPz/
Local implementation of the manager commands.
c                óD   <€ \         SV `  W4       \        4       V n        R # rU   )ÚsuperrZ   r%   Ú_streams)rN   ÚboxReceiverÚlocatorÚ	__class__s   &&&€r0   rZ   ÚLocalWorkerAMP.__init__•   s   ø€ Ü‰Ñ˜Ô.Ü&Ó(ˆŽr3   c                ó:   € R V P                   P                  4       /# )ÚstreamId)ry   Úopen©rN   s   &r0   Ú
streamOpenÚLocalWorkerAMP.streamOpen™   s   € à˜DŸM™M×.Ñ.Ó0Ð1Ð1r3   c                ó<   € V P                   P                  W4       / # rU   )ry   Úwrite)rN   r   Údatas   &&&r0   ÚstreamWriteÚLocalWorkerAMP.streamWrite�   s   € à�‰×Ñ˜HÔ+Øˆ	r3   c                óT   € V P                   P                  V P                  4       RR/# )z 
Add a success to the reporter.
rB   T)rW   Ú
addSuccessÚ	_testCase)rN   ÚtestNames   &&r0   rŠ   ÚLocalWorkerAMP.addSuccess¢   s%   € ð
 	�‰×Ñ §¡Ô/Ø˜4Ð Ð r3   c                óB   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[/# )r+   ÚerrorÚ
errorClassÚframesrJ   )r)   r-   r   r   )r.   r/   s   "€r0   r1   ÚLocalWorkerAMP.__annotate__ª   s7   ø€ ÷ ñ áðñ ðñ ‘S•	ð	ñ
 
ñr3   c           
     óþ   € \        V4      p\        W4      p\        ^ \        V4      ^4       FL  pVP                  P                  W6,          W6^,           ,          \        W6^,           ,          4      . . 34       KN  	  V# )a`  
Helper to build a C{Failure} with some traceback.

@param error: An C{Exception} instance.

@param errorClass: The class name of the C{error} class.

@param frames: A flat list of strings representing the information need
    to approximatively rebuild C{Failure} frames.

@return: A L{Failure} instance with enough information about a test
   error.
)r   r   ÚrangeÚlenr‘   ÚappendÚint)rN   r�   r�   r‘   Ú	errorTypera   Úis   &&&&   r0   Ú_buildFailureÚLocalWorkerAMP._buildFailureª   si   € ô&   
Ó+ˆ	Ü˜%Ó+ˆÜ�qœ#˜f›+ qÖ)ˆAØ�N‰N×!Ñ!Ø•˜F q¥5�M¬3¨v¸!µe­}Ó+=¸rÀ2ÐFöñ *ð ˆr3   c                óN   <€ V ^8„  d   QhRS[ RS[ RS[RS[RS[S[ S[3,          /# )r+   rŒ   r�   ÚerrorStreamIdÚframesStreamIdrJ   ©r-   r—   r   rC   )r.   r/   s   "€r0   r1   r’   Æ   sE   ø€ ÷ !ñ !áð!ñ ð!ñ ð	!ñ
 ð!ñ 
‰c‘4ˆi�ñ!r3   c                óx  € RP                  V P                  P                  V4      4      P                  R4      pV P                  P                  V4       Uu. uF  qfP                  R4      NK  	  ppV P	                  \        V4      W'4      pV P                  P                  V P                  V4       RR/# u upi )ao  
Add an error to the reporter.

@param errorStreamId: The identifier of a stream over which the text
    of this error was previously completely sent to the peer.

@param framesStreamId: The identifier of a stream over which the lines
    of the traceback for this error were previously completely sent to
    the peer.

@param error: A message describing the error.
r3   úutf-8rB   T)	Újoinry   ÚfinishÚdecoderš   r)   rW   ÚaddErrorr‹   )	rN   rŒ   r�   r�   rž   r�   Úframer‘   ra   s	   &&&&&    r0   r¥   ÚLocalWorkerAMP.addErrorÅ   s    € ð( —‘˜Ÿ™×-Ñ-¨mÓ<Ó=×DÑDÀWÓMˆà/3¯}©}×/CÑ/CÀNÔ/Só
Ù/S e�L‰L˜Ö!Ñ/Sð 	ð 
ð ×$Ñ$¤_°UÓ%;¸ZÓPˆØ�‰×Ñ˜dŸn™n¨gÔ6Ø˜4Ð Ð ùò
ó   ÁB7c                óN   <€ V ^8„  d   QhRS[ RS[RS[ RS[RS[S[ S[3,          /# )r+   rŒ   ÚfailStreamIdÚ	failClassrž   rJ   rŸ   )r.   r/   s   "€r0   r1   r’   æ   sE   ø€ ÷ !ñ !áð!ñ ð!ñ ð	!ñ
 ð!ñ 
‰c‘4ˆi�ñ!r3   c                óx  € RP                  V P                  P                  V4      4      P                  R4      pV P                  P                  V4       Uu. uF  qfP                  R4      NK  	  ppV P	                  \        V4      W74      pV P                  P                  V P                  V4       RR/# u upi )aB  
Add a failure to the reporter.

@param failStreamId: The identifier of a stream over which the text of
    this failure was previously completely sent to the peer.

@param framesStreamId: The identifier of a stream over which the lines
    of the traceback for this error were previously completely sent to the
    peer.
r3   r¡   rB   T)	r¢   ry   r£   r¤   rš   r)   rW   Ú
addFailurer‹   )	rN   rŒ   rª   r«   rž   Úfailr¦   r‘   ra   s	   &&&&&    r0   r­   ÚLocalWorkerAMP.addFailureå   s    € ð$ �x‰x˜Ÿ™×,Ñ,¨\Ó:Ó;×BÑBÀ7ÓKˆà/3¯}©}×/CÑ/CÀNÔ/Só
Ù/S e�L‰L˜Ö!Ñ/Sð 	ð 
ð ×$Ñ$¤_°TÓ%:¸IÓNˆØ�‰×Ñ §¡°Ô8Ø˜4Ð Ð ùò
r¨   c                óV   € V P                   P                  V P                  V4       RR/# )z
Add a skip to the reporter.
rB   T)rW   ÚaddSkipr‹   )rN   rŒ   Úreasons   &&&r0   r±   ÚLocalWorkerAMP.addSkip   s'   € ð
 	�‰×Ñ˜TŸ^™^¨VÔ4Ø˜4Ð Ð r3   c          
      óX   <€ V ^8„  d   QhRS[ RS[RS[S[ ,          RS[S[ S[3,          /# )r+   rŒ   r�   ÚtodorJ   )r-   r—   r   r   rC   )r.   r/   s   "€r0   r1   r’   	  s9   ø€ ÷ !ñ !Ùð!Ù,/ð!Ù7?Áµ}ð!á	‰c‘4ˆi�ñ!r3   c                óê   € RP                  V P                  P                  V4      4      P                  R4      p\	        Vf   RMT4      pV P
                  P                  V P                  WE4       RR/# )z®
Add an expected failure to the reporter.

@param errorStreamId: The identifier of a stream over which the text
    of this error was previously completely sent to the peer.
r3   r¡   z	<unknown>rB   T)r¢   ry   r£   r¤   r#   rW   ÚaddExpectedFailurer‹   )rN   rŒ   r�   rµ   r�   Ú_todos   &&&&  r0   r·   Ú!LocalWorkerAMP.addExpectedFailure  s_   € ð —‘˜Ÿ™×-Ñ-¨mÓ<Ó=×DÑDÀWÓMˆÜ D¢L‘[°dÓ;ˆØ�‰×'Ñ'¨¯©¸ÔEØ˜4Ð Ð r3   c                óV   € V P                   P                  V P                  V4       RR/# )z,
Add an unexpected success to the reporter.
rB   T)rW   ÚaddUnexpectedSuccessr‹   )rN   rŒ   rµ   s   &&&r0   r»   Ú#LocalWorkerAMP.addUnexpectedSuccess  s'   € ð
 	�‰×)Ñ)¨$¯.©.¸$Ô?Ø˜4Ð Ð r3   c                ó‚   € V P                   P                  VR,           4       V P                   P                  4        RR/# )z$
Print test output from the worker.
Ú
rB   T)Ú_testStreamr…   Úflush)rN   Úouts   &&r0   Ú	testWriteÚLocalWorkerAMP.testWrite  s9   € ð
 	×Ñ×Ñ˜s T�zÔ*Ø×Ñ×ÑÔ Ø˜4Ð Ð r3   c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r+   r]   rI   rJ   rK   )r.   r/   s   "€r0   r1   r’   (  s"   ø€ ÷ ,ñ ,¡(ð ,±Jð ,Á9ñ ,r3   c              ƒ  óF  "  € Wn         W n        V P                  P                  V4       VP                  4       p V P	                  \
        P                  VR7      G Rj  x€L
 V P                  P                  V4       #  L  T P                  P                  T4       i ; i5i)z
Run a test.
)r]   N)r‹   rW   Ú	startTestrb   Ú
callRemoter   rr   ÚstopTest)rN   r]   rI   Ú
testCaseIds   &&& r0   rO   ÚLocalWorkerAMP.run(  sw   é € ð "ŒØŒØ�‰×Ñ˜xÔ(Ø—[‘[“]ˆ
ð	,ØŸ™¬×);Ñ);Àj˜ÓQ×Qà�L‰L×!Ñ! (Õ+ñ Røà�L‰L×!Ñ! (Õ+üs.   ‚8B!»$B ÁA?Á B Á#B!Á?B ÂBÂB!c                ó   € Wn         R# )z/
Set the stream used to log output from tests.
N)r¿   )rN   Ústreams   &&r0   ÚsetTestStreamÚLocalWorkerAMP.setTestStream5  s
   € ð "Ör3   )rW   ry   r‹   r¿   )NN) r6   r7   r8   r9   r:   rZ   r$   rs   r‚   r&   r‡   r   Ú
AddSuccessrŠ   rš   ÚAddErrorr¥   Ú
AddFailurer­   ÚAddSkipr±   ÚAddExpectedFailurer·   ÚAddUnexpectedSuccessr»   Ú	TestWriterÂ   rO   rÍ   r<   r=   Ú__classcell__)r|   r/   s   @@r0   rv   rv   �   sA  ù‡ € ñ÷)ð ×Ññ2ó ð2ð ×Ññó ðð ×Ñ×)Ñ)ñ!ó *ð!÷ð ð6 ×Ñ×'Ñ'÷!ó (ð!ð> ×Ñ×)Ñ)÷!ó *ð!ð4 ×Ñ×&Ñ&ñ!ó 'ð!ð ×'Ñ'×1Ñ1÷!ó 2ð!ð ×)Ñ)×3Ñ3ñ!ó 4ð!ð ×Ñ×(Ñ(ñ!ó )ð!÷,ð ,÷"ò "r3   rv   c                   ó   € ] tR tRtRtRtR# )ÚLocalWorkerAddressi<  zs
A L{IAddress} implementation meant to provide stub addresses for
L{ITransport.getPeer} and L{ITransport.getHost}.
r4   N©r6   r7   r8   r9   r:   r<   r4   r3   r0   rØ   rØ   <  s   † õr3   rØ   c                   óH   a € ] tR tRt o RtR tR tR tR tR t	R t
R	tV tR
# )ÚLocalWorkerTransportiD  z]
A stub transport implementation used to support L{AMP} over a
L{ProcessProtocol} transport.
c                ó   € Wn         R # rU   ©Ú
_transport)rN   Ú	transports   &&r0   rZ   ÚLocalWorkerTransport.__init__K  s   € Ø#Žr3   c                óF   € V P                   P                  \        V4       R# )z
Forward data to transport.
N©rÞ   ÚwriteToChildr   ©rN   r†   s   &&r0   r…   ÚLocalWorkerTransport.writeN  s   € ð 	�‰×$Ñ$Ô%6¸Ö=r3   c                óX   € V F#  pV P                   P                  \        V4       K%  	  R# )z@
Emulate C{writeSequence} by iterating data in the C{sequence}.
Nrâ   )rN   Úsequencer†   s   && r0   ÚwriteSequenceÚ"LocalWorkerTransport.writeSequenceT  s#   € ó ˆDØ�O‰O×(Ñ(Ô):¸DÖAó r3   c                ó:   € V P                   P                  4        R# )z
Closes the transport.
N)rÞ   ÚloseConnectionr�   s   &r0   rë   Ú#LocalWorkerTransport.loseConnection[  s   € ð 	�‰×&Ñ&Ö(r3   c                ó   € \        4       # ©z*
Return a L{LocalWorkerAddress} instance.
©rØ   r�   s   &r0   ÚgetHostÚLocalWorkerTransport.getHosta  ó   € ô "Ó#Ð#r3   c                ó   € \        4       # rî   rï   r�   s   &r0   ÚgetPeerÚLocalWorkerTransport.getPeerg  rò   r3   rÝ   N)r6   r7   r8   r9   r:   rZ   r…   rè   rë   rð   rô   r<   r=   r>   s   @r0   rÛ   rÛ   D  s.   ø‡ € ñò
$ò>òBò)ò$÷$ð $r3   rÛ   c                   ó   € ] tR tRtRtRtR# )Ú
NotRunningin  zF
An operation was attempted on a worker process which is not running.
r4   NrÙ   r4   r3   r0   r÷   r÷   n  s   † õr3   r÷   c                   óx   a € ] tR tRt o RtV 3R lR ltV 3R lR ltR tR tV 3R	 lR
 lt	R t
R tR tRtV tR# )ÚLocalWorkerit  a0  
Local process worker protocol. This worker runs as a local process and
communicates via stdin/out.

@ivar _ampProtocol: The L{AMP} protocol instance used to communicate with
    the worker.

@ivar _logDirectory: The directory where logs will reside.

@ivar _logFile: The main log file for tests output.
c                ó<   <€ V ^8„  d   QhRS[ RS[S[,          RS[/# )r+   ÚampProtocolÚlogDirectoryÚlogFile)rv   r   r   r   )r.   r/   s   "€r0   r1   ÚLocalWorker.__annotate__�  s-   ø€ ÷ 	6ñ 	6á#ð	6ñ ™s•mð	6ñ ñ		6r3   c                óH   € Wn         W n        W0n        \        4       V n        R # rU   )Ú_ampProtocolÚ_logDirectoryÚ_logFiler   ÚendDeferred)rN   rû   rü   rý   s   &&&&r0   rZ   ÚLocalWorker.__init__�  s   € ð (ÔØ)ÔØŒÜ+3«:ˆÖr3   c                ó   <€ V ^8„  d   QhRR/# )r+   rJ   Nr4   )r.   r/   s   "€r0   r1   rþ   Œ  s   ø€ ÷ ñ ˜Dñ r3   c              ƒ  óÒ   "  € V P                   f   \        4       hV P                  pV P                   P                  \        4        VG Rj  x€L
  R#  L  \
         d     R# i ; i5i)z#
Cause the worker process to exit.
N)rß   r÷   r  ÚcloseChildFDr   r   )rN   r  s   & r0   ÚexitÚLocalWorker.exitŒ  sV   é € ð �>‰>Ò!Ü“,Ðà×&Ñ&ˆØ�‰×#Ñ#Ô$5Ô6ð	Ø×ÔøÜô 	Úð	üs<   ‚AA'ÁA ÁAÁA ÁA'ÁA ÁA$Á A'Á#A$Á$A'c                óB  € V P                   P                  \        V P                  4      4       V P                  P                  RR7       V P                  P                  R4      P                  R4      V n        V P                  P                  R4      P                  R4      V n	        V P                   P                  V P                  4       V P                   P                  \        P                  V P                  P                  R7      pVP!                  R 4       R# )	z<
When connection is made, create the AMP protocol instance.
T)ÚignoreExistingDirectoryzout.logÚwzerr.log)ro   c                 ó   € R # rU   r4   )Úxs   &r0   Ú<lambda>Ú,LocalWorker.connectionMade.<locals>.<lambda>©  s   € ™tr3   N)r   ÚmakeConnectionrÛ   rß   r  ÚmakedirsÚchildr€   Ú_outLogÚ_errLogrÍ   r  rÇ   r   rt   ÚpathÚ
addErrback)rN   Úds   & r0   ÚconnectionMadeÚLocalWorker.connectionMadeš  sØ   € ð 	×Ñ×(Ñ(Ô)=¸d¿n¹nÓ)MÔNØ×Ñ×#Ñ#¸DÐ#ÔAØ×)Ñ)×/Ñ/°	Ó:×?Ñ?ÀÓDˆŒØ×)Ñ)×/Ñ/°	Ó:×?Ñ?ÀÓDˆŒØ×Ñ×'Ñ'¨¯©Ô6Ø×Ñ×(Ñ(Ü× Ñ Ø×(Ñ(×-Ñ-ð )ó 
ˆð 	
�‰‘^Ö$r3   c                ó|   € V P                   P                  4        V P                  P                  4        RV n        R# )zS
On connection lost, close the log files that we're managing for stdin
and stdout.
N)r  Úcloser  rß   ©rN   r²   s   &&r0   ÚconnectionLostÚLocalWorker.connectionLost«  s+   € ð
 	�‰×ÑÔØ�‰×ÑÔØˆŽr3   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r+   r²   rJ   Nr   )r.   r/   s   "€r0   r1   rþ   ´  s   ø€ ÷ *ñ *¡7ð *¨tñ *r3   c                ó”   € V P                  V4       V P                  P                  V4       V P                  P                  V4       R# )zz
When the process closes, call C{connectionLost} for cleanup purposes
and forward the information to the C{_ampProtocol}.
N)r  r   r  Úcallbackr  s   &&r0   ÚprocessEndedÚLocalWorker.processEnded´  s:   € ð
 	×Ñ˜FÔ#Ø×Ñ×(Ñ(¨Ô0Ø×Ñ×!Ñ! &Ö)r3   c                ó<   € V P                   P                  V4       R# )z(
Send data received from stdout to log.
N)r  r…   rä   s   &&r0   ÚoutReceivedÚLocalWorker.outReceived½  s   € ð
 	�‰×Ñ˜4Ö r3   c                ó<   € V P                   P                  V4       R# )z
Write error data to log.
N)r  r…   rä   s   &&r0   ÚerrReceivedÚLocalWorker.errReceivedÄ  s   € ð 	�‰×Ñ˜4Ö r3   c                ó„   € V\         8X  d   V P                  P                  V4       R# \        P                  ! WV4       R# )zD
Handle data received on the specific pipe for the C{_ampProtocol}.
N)r   r   ÚdataReceivedr   ÚchildDataReceived)rN   ÚchildFDr†   s   &&&r0   r-  ÚLocalWorker.childDataReceivedÊ  s1   € ð Ô(Ô(Ø×Ñ×*Ñ*¨4Ö0ä×-Ò-¨d¸TÖBr3   )r   r  r  r  r  r  rß   N)r6   r7   r8   r9   r:   rZ   r  r  r  r#  r&  r)  r-  r<   r=   r>   s   @r0   rù   rù   t  sH   ø‡ € ñ
÷	6ð 	6÷ð ò%ò"÷*ð *ò!ò!÷Cð Cr3   rù   )Er:   rm   Útypingr   r   r   r   r   r   r   r	   Úunittestr
   Úzope.interfacer   Úattrsr   r   r   Útwisted.internet.deferr   r   Útwisted.internet.errorr   Útwisted.internet.interfacesr   r   Útwisted.internet.protocolr   Útwisted.loggerr   Útwisted.protocols.ampr   Útwisted.python.failurer   Útwisted.python.filepathr   Útwisted.python.reflectr   Útwisted.trial._distr   r   r   r   Ú"twisted.trial._dist.workerreporterr   Útwisted.trial.reporterr    Útwisted.trial.runnerr!   r"   Útwisted.trial.unittestr#   rÌ   r$   r%   r&   Ú	Exceptionr)   r@   rF   rQ   ÚWorkerActionrS   rv   rØ   rÛ   r÷   rù   r4   r3   r0   Ú<module>rD     s,  ðñó 
ß R× RÓ RÝ å &å ß &ç 9Ý .ß <Ý 5Ý !Ý %Ý *Ý ,Ý .÷ó õ >Ý -ß 7Ý 'ß ;Ñ ;ñ �Ôô�ió ó ðô�	ô ôˆXô ñ ˆTƒ]€Ø˜˜ )¨B¥-Ð/Õ0€ô@!�Sô @!ôFi"�Sô i"ñX ˆXÓ÷ð ó ðñ ˆZÓ÷&$ð &$ó ð&$ôR�ô ô]C�/ö ]Cr3   