B ‡Ž€Æ›Õ0œã@sšdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddl mZddl mZddl mZddl mZdd l mZdd l mZdd l mZdd l mZdd lmZdZe jdkrêedƒ‚dd„ZGdd„dejƒZGdd„dejƒZGdd„dej ej!ƒZ"Gdd„dej#ƒZ$Gdd„dƒZ%Gdd„de%ƒZ&Gdd „d e&ƒZ'Gd!d"„d"e&ƒZ(Gd#d$„d$ej)ƒZ*eZ+e*Z,dS)%z2Selector event loop for Unix with signal handling.éNé)Ú base_events)Úbase_subprocess)Ú constants)Ú coroutines)Úevents)Úfutures)Úselector_events)Útasks)Ú transports)Úlogger)ÚSelectorEventLoopÚAbstractChildWatcherÚSafeChildWatcherÚFastChildWatcherÚDefaultEventLoopPolicyZwin32z+Signals are not really supported on WindowscCsdS)zDummy signal handler.N©)ÚsignumÚframerrú6/opt/alt/python37/lib/python3.7/asyncio/unix_events.pyÚ_sighandler_noop'srcsÊeZdZdZd)‡fdd„ Z‡fdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z d*dd„Z d+dd„Z d,dd„Z dd„Zd-dddddœdd„Zd.ddddddœdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Z‡ZS)/Ú_UnixSelectorEventLoopzdUnix event loop. Adds signal handling and UNIX Domain Socket support to SelectorEventLoop. Ncstƒ |¡i|_dS)N)ÚsuperÚ__init__Ú_signal_handlers)ÚselfÚselector)Ú __class__rrr2s z_UnixSelectorEventLoop.__init__cs^tƒ ¡t ¡s2xFt|jƒD]}| |¡qWn(|jrZtjd|›dt |d|j  ¡dS)NzClosing the loop z@ on interpreter shutdown stage, skipping signal handlers removal)Úsource) rÚcloseÚsysÚ is_finalizingÚlistrÚremove_signal_handlerÚwarningsÚwarnÚResourceWarningÚclear)rÚsig)rrrr6s z_UnixSelectorEventLoop.closecCs"x|D]}|sq| |¡qWdS)N)Ú_handle_signal)rÚdatarrrrÚ_process_self_dataDs z)_UnixSelectorEventLoop._process_self_datac GsLt |¡st |¡rtdƒ‚| |¡| ¡yt |j  ¡¡Wn2t t fk rt}zt t |ƒƒ‚Wdd}~XYnXt |||d¡}||j|<yt |t¡t |d¡Wnšt k rF}zz|j|=|jsyt d¡Wn4t t fk r}zt d|¡Wdd}~XYnX|jtjkr4t d|›dƒ‚n‚Wdd}~XYnXdS)zÃAdd a handler for a signal. UNIX only. Raise ValueError if the signal number is invalid or uncatchable. Raise RuntimeError if there is a problem setting up the handler. z3coroutines cannot be used with add_signal_handler()NFéÿÿÿÿzset_wakeup_fd(-1) failed: %szsig z cannot be caught)rZ iscoroutineZiscoroutinefunctionÚ TypeErrorÚ _check_signalZ _check_closedÚsignalÚ set_wakeup_fdZ_csockÚfilenoÚ ValueErrorÚOSErrorÚ RuntimeErrorÚstrrZHandlerrÚ siginterruptr ÚinfoÚerrnoÚEINVAL)rr(ÚcallbackÚargsÚexcÚhandleZnexcrrrÚadd_signal_handlerKs0     z)_UnixSelectorEventLoop.add_signal_handlercCs8|j |¡}|dkrdS|jr*| |¡n | |¡dS)z2Internal helper that is the actual signal handler.N)rÚgetZ _cancelledr#Z_add_callback_signalsafe)rr(r=rrrr)xs   z%_UnixSelectorEventLoop._handle_signalc Csä| |¡y |j|=Wntk r*dSX|tjkr>tj}ntj}yt ||¡WnBtk r–}z$|jtj kr„t d|›dƒ‚n‚Wdd}~XYnX|jsàyt  d¡Wn2t tfk rÞ}zt  d|¡Wdd}~XYnXdS)zwRemove a handler for a signal. UNIX only. Return True if a signal handler was removed, False if not. Fzsig z cannot be caughtNr,zset_wakeup_fd(-1) failed: %sT)r.rÚKeyErrorr/ÚSIGINTÚdefault_int_handlerÚSIG_DFLr3r8r9r4r0r2r r7)rr(Zhandlerr<rrrr#‚s(    z,_UnixSelectorEventLoop.remove_signal_handlercCsLt|tƒstd|›ƒ‚d|kr.tjksHntd|›dtj›dƒ‚dS)zÁInternal helper to validate a signal. Raise ValueError if the signal number is invalid or uncatchable. Raise RuntimeError if there is a problem setting up the handler. zsig must be an int, not rzsig z out of range(1, ú)N)Ú isinstanceÚintr-r/ÚNSIGr2)rr(rrrr.¢s z$_UnixSelectorEventLoop._check_signalcCst|||||ƒS)N)Ú_UnixReadPipeTransport)rÚpipeÚprotocolÚwaiterÚextrarrrÚ_make_read_pipe_transport®sz0_UnixSelectorEventLoop._make_read_pipe_transportcCst|||||ƒS)N)Ú_UnixWritePipeTransport)rrIrJrKrLrrrÚ_make_write_pipe_transport²sz1_UnixSelectorEventLoop._make_write_pipe_transportc Ës”t ¡‚} | ¡} t||||||||f| |dœ| —Ž} |  |  ¡|j| ¡y| IdHWn,tk r„|  ¡|   ¡IdH‚YnXWdQRX| S)N)rKrL) rÚget_child_watcherÚ create_futureÚ_UnixSubprocessTransportÚadd_child_handlerZget_pidÚ_child_watcher_callbackÚ ExceptionrZ_wait) rrJr;ÚshellÚstdinÚstdoutÚstderrÚbufsizerLÚkwargsÚwatcherrKÚtransprrrÚ_make_subprocess_transport¶s     z1_UnixSelectorEventLoop._make_subprocess_transportcCs| |j|¡dS)N)Zcall_soon_threadsafeZ_process_exited)rÚpidÚ returncoder]rrrrTËsz._UnixSelectorEventLoop._child_watcher_callback)ÚsslÚsockÚserver_hostnameÚssl_handshake_timeoutc Ãs |r|dkr6tdƒ‚n |dk r&tdƒ‚|dk r6tdƒ‚|dk r¤|dk rNtdƒ‚t |¡}t tjtjd¡}y | d¡| ||¡IdHWqä| ¡‚YqäXn@|dkr´tdƒ‚|j tjksÌ|j tjkrÚtd|›ƒ‚| d¡|j |||||d IdH\}}||fS) Nz/you have to pass server_hostname when using sslz+server_hostname is only meaningful with sslz1ssl_handshake_timeout is only meaningful with sslz3path and sock can not be specified at the same timerFzno path and sock were specifiedz.A UNIX Domain Stream Socket was expected, got )rd) r2ÚosÚfspathÚsocketÚAF_UNIXÚ SOCK_STREAMÚ setblockingZ sock_connectrÚfamilyÚtypeZ_create_connection_transport) rÚprotocol_factoryÚpathrarbrcrdÚ transportrJrrrÚcreate_unix_connectionÎs@       z-_UnixSelectorEventLoop.create_unix_connectionédT)rbÚbacklogrardÚ start_servingc ÃsÊt|tƒrtdƒ‚|dk r&|s&tdƒ‚|dk rH|dk r@tdƒ‚t |¡}t tjtj¡}|ddkrÊy t   t  |¡j ¡r„t  |¡WnBt k ršYn0tk rÈ}zt d||¡Wdd}~XYnXy| |¡Wnltk r0} z8| ¡| jtjkrd|›d} ttj| ƒd‚n‚Wdd} ~ XYn| ¡‚YnXn<|dkrZtd ƒ‚|jtjksv|jtjkr„td |›ƒ‚| d ¡t ||g||||¡} |rÆ|  ¡tjd|d IdH| S) Nz*ssl argument must be an SSLContext or Nonez1ssl_handshake_timeout is only meaningful with sslz3path and sock can not be specified at the same timer)rúz2Unable to check or remove stale UNIX socket %r: %rzAddress z is already in usez-path was not specified, and no sock specifiedz.A UNIX Domain Stream Socket was expected, got F)Úloop)rEÚboolr-r2rerfrgrhriÚstatÚS_ISSOCKÚst_modeÚremoveÚFileNotFoundErrorr3r ÚerrorZbindrr8Z EADDRINUSErkrlrjrZServerZ_start_servingr Zsleep) rrmrnrbrrrardrsÚerrr<ÚmsgZserverrrrÚcreate_unix_serverûsZ            z)_UnixSelectorEventLoop.create_unix_serverc Ãsôy tjWn,tk r6}zt d¡‚Wdd}~XYnXy | ¡}Wn2ttjfk rv}zt d¡‚Wdd}~XYnXyt |¡j }Wn,t k r´}zt d¡‚Wdd}~XYnX|r¾|n|} | sÊdS|  ¡} |  | d||||| d¡| IdHS)Nzos.sendfile() is not availableznot a regular filer) reÚsendfileÚAttributeErrorrÚSendfileNotAvailableErrorr1ÚioÚUnsupportedOperationÚfstatÚst_sizer3rQÚ_sock_sendfile_native_impl) rrbÚfileÚoffsetÚcountr<r1r}ZfsizeÚ blocksizeÚfutrrrÚ_sock_sendfile_native>s(     z,_UnixSelectorEventLoop._sock_sendfile_nativec Cs| ¡} |dk r| |¡| ¡r4| |||¡dS|rd||}|dkrd| |||¡| |¡dSyt | |||¡} Wn*ttfk rÆ|dkr¢|  ||¡|  | |j || ||||||¡ YnHt k rj} z†|dk r| j t jkrt| ƒtk rtdt jƒ} | | _| } |dkrBt d¡} | |||¡| | ¡n| |||¡| | ¡Wdd} ~ XYn¤tk r¤} z| |||¡| | ¡Wdd} ~ XYnjX| dkrÊ| |||¡| |¡nD|| 7}|| 7}|dkrð|  ||¡|  | |j || ||||||¡ dS)Nrzsocket is not connectedzos.sendfile call failed)r1Ú remove_writerÚ cancelledÚ_sock_sendfile_update_fileposZ set_resultrer€ÚBlockingIOErrorÚInterruptedErrorÚ_sock_add_cancellation_callbackZ add_writerr‡r3r8ZENOTCONNrlÚConnectionErrorÚ __cause__rr‚Z set_exceptionrU)rrŒZ registered_fdrbr1r‰rŠr‹Ú total_sentÚfdZsentr<Únew_excr}rrrr‡Us`             z1_UnixSelectorEventLoop._sock_sendfile_native_implcCs|dkrt ||tj¡dS)Nr)reÚlseekÚSEEK_SET)rr1r‰r–rrrr™sz4_UnixSelectorEventLoop._sock_sendfile_update_fileposcs‡‡fdd„}| |¡dS)Ncs&| ¡r"ˆ ¡}|dkr"ˆ |¡dS)Nr,)rr1rŽ)rŒr—)rrbrrÚcbžszB_UnixSelectorEventLoop._sock_add_cancellation_callback..cb)Zadd_done_callback)rrŒrbr›r)rrbrr“sz6_UnixSelectorEventLoop._sock_add_cancellation_callback)N)NN)NN)N)N)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrr+r>r)r#r.rMrOr^rTrprrr‡rr“Ú __classcell__rr)rrr,s4 -      *?Drcs„eZdZdZd‡fdd„ Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z ddd„Zdd„Zdd„Z‡ZS) rHiNcsÚtƒ |¡||jd<||_||_| ¡|_||_d|_d|_ t   |j¡j }t  |¡s„t  |¡s„t  |¡s„d|_d|_d|_tdƒ‚t  |jd¡|j |jj|¡|j |jj|j|j¡|dk rÖ|j tj|d¡dS)NrIFz)Pipe transport is for pipes/sockets only.)rrÚ_extraÚ_loopÚ_piper1Ú_filenoÚ _protocolÚ_closingÚ_pausedrer…ryrwÚS_ISFIFOrxÚS_ISCHRr2Ú set_blockingÚ call_soonÚconnection_madeÚ _add_readerÚ _read_readyrÚ_set_result_unless_cancelled)rrurIrJrKrLÚmode)rrrrªs.         z_UnixReadPipeTransport.__init__cCsÀ|jjg}|jdkr | d¡n|jr0| d¡| d|j›¡t|jddƒ}|jdk r|dk rt  ||jt j ¡}|r„| d¡q°| d¡n |jdk r¦| d¡n | d¡d  d   |¡¡S) NÚclosedÚclosingzfd=Ú _selectorÚpollingÚidleÚopenz<{}>ú )rrœr£Úappendr¦r¤Úgetattrr¢r Ú_test_selector_eventÚ selectorsZ EVENT_READÚformatÚjoin)rr7rr´rrrÚ__repr__Ès"         z_UnixReadPipeTransport.__repr__c Csºyt |j|j¡}WnDttfk r,YnŠtk rX}z| |d¡Wdd}~XYn^X|rl|j  |¡nJ|j   ¡r‚t   d|¡d|_|j  |j¡|j  |jj¡|j  |jd¡dS)Nz"Fatal read error on pipe transportz%r was closed by peerT)reÚreadr¤Úmax_sizer‘r’r3Ú _fatal_errorr¥Z data_receivedr¢Ú get_debugr r7r¦Ú_remove_readerr«Z eof_receivedÚ_call_connection_lost)rr*r<rrrr®Ýs  z"_UnixReadPipeTransport._read_readycCs>|js |jrdSd|_|j |j¡|j ¡r:t d|¡dS)NTz%r pauses reading)r¦r§r¢rÃr¤rÂr Údebug)rrrrÚ pause_readingïs   z$_UnixReadPipeTransport.pause_readingcCsB|js |jsdSd|_|j |j|j¡|j ¡r>t d|¡dS)NFz%r resumes reading) r¦r§r¢r­r¤r®rÂr rÅ)rrrrÚresume_reading÷s   z%_UnixReadPipeTransport.resume_readingcCs ||_dS)N)r¥)rrJrrrÚ set_protocolÿsz#_UnixReadPipeTransport.set_protocolcCs|jS)N)r¥)rrrrÚ get_protocolsz#_UnixReadPipeTransport.get_protocolcCs|jS)N)r¦)rrrrÚ is_closingsz!_UnixReadPipeTransport.is_closingcCs|js| d¡dS)N)r¦Ú_close)rrrrrsz_UnixReadPipeTransport.closecCs.|jdk r*tjd|›t|d|j ¡dS)Nzunclosed transport )r)r£r$r%r&r)rrrrÚ__del__ s z_UnixReadPipeTransport.__del__úFatal error on pipe transportcCsZt|tƒr4|jtjkr4|j ¡rLtjd||ddn|j ||||j dœ¡|  |¡dS)Nz%r: %sT)Úexc_info)ÚmessageÚ exceptionrorJ) rEr3r8ZEIOr¢rÂr rÅÚcall_exception_handlerr¥rË)rr<rÏrrrrÁs  z#_UnixReadPipeTransport._fatal_errorcCs(d|_|j |j¡|j |j|¡dS)NT)r¦r¢rÃr¤r«rÄ)rr<rrrrË sz_UnixReadPipeTransport._closecCs4z|j |¡Wd|j ¡d|_d|_d|_XdS)N)r¥Úconnection_lostr£rr¢)rr<rrrrÄ%s  z,_UnixReadPipeTransport._call_connection_lost)NN)rÍ)rœrržrÀrr¾r®rÆrÇrÈrÉrÊrrÌrÁrËrÄr rr)rrrH¦s rHcs¢eZdZd%‡fdd„ Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd&dd „Zd'd!d"„Zd#d$„Z‡ZS)(rNNc sþtƒ ||¡||jd<||_| ¡|_||_tƒ|_d|_ d|_ t   |j¡j }t |¡}t |¡}t |¡} |s”|s”| s”d|_d|_d|_tdƒ‚t  |jd¡|j |jj|¡| sÈ|ràtj d¡sà|j |jj|j|j¡|dk rú|j tj|d¡dS)NrIrFz?Pipe transport is only for pipes, sockets and character devicesZaix)rrr¡r£r1r¤r¥Ú bytearrayÚ_bufferÚ _conn_lostr¦rer…ryrwr©r¨rxr2rªr¢r«r¬r ÚplatformÚ startswithr­r®rr¯) rrurIrJrKrLr°Zis_charZis_fifoZ is_socket)rrrr2s2         z _UnixWritePipeTransport.__init__cCsØ|jjg}|jdkr | d¡n|jr0| d¡| d|j›¡t|jddƒ}|jdk r¨|dk r¨t  ||jt j ¡}|r„| d¡n | d¡|  ¡}| d|›¡n |jdk r¾| d¡n | d¡d   d  |¡¡S) Nr±r²zfd=r³r´rµzbufsize=r¶z<{}>r·)rrœr£r¸r¦r¤r¹r¢r rºr»Z EVENT_WRITEÚget_write_buffer_sizer¼r½)rr7rr´rZrrrr¾Ws&         z _UnixWritePipeTransport.__repr__cCs t|jƒS)N)ÚlenrÔ)rrrrrØosz-_UnixWritePipeTransport.get_write_buffer_sizecCs6|j ¡rt d|¡|jr*| tƒ¡n| ¡dS)Nz%r was closed by peer)r¢rÂr r7rÔrËÚBrokenPipeError)rrrrr®rs   z#_UnixWritePipeTransport._read_readyc Cst|tƒrt|ƒ}|sdS|js&|jrN|jtjkrÚ _sig_chldrù)rrurrrrïgs zBaseChildWatcher.attach_loopc CsFy | ¡Wn4tk r@}z|j d|dœ¡Wdd}~XYnXdS)Nz$Unknown exception in SIGCHLD handler)rÏrÐ)rùrUr¢rÑ)rr<rrrrü{s  zBaseChildWatcher._sig_chldcCs2t |¡rt |¡ St |¡r*t |¡S|SdS)N)reÚ WIFSIGNALEDÚWTERMSIGÚ WIFEXITEDÚ WEXITSTATUS)rÚstatusrrrÚ_compute_returncode‡s     z$BaseChildWatcher._compute_returncodeN) rœrržrrrørùrïrürrrrrrõXs rõcsPeZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z ‡Z S)rad'Safe' child watcher implementation. This implementation avoids disrupting other code spawning processes by polling explicitly each process in the SIGCHLD handler instead of calling os.waitpid(-1). This is a safe solution but it has a significant overhead when handling a big number of children (O(n) each time SIGCHLD is raised) cs|j ¡tƒ ¡dS)N)rör'rr)r)rrrr s zSafeChildWatcher.closecCs|S)Nr)rrrrrð¤szSafeChildWatcher.__enter__cCsdS)Nr)rrñròrórrrrô§szSafeChildWatcher.__exit__cGs.|jdkrtdƒ‚||f|j|<| |¡dS)NzICannot add child handler, the child watcher does not have a loop attached)r¢r4rörø)rr_r:r;rrrrSªs  z"SafeChildWatcher.add_child_handlercCs&y |j|=dStk r dSXdS)NTF)rör@)rr_rrrrîµs z%SafeChildWatcher.remove_child_handlercCs"xt|jƒD]}| |¡q WdS)N)r"rörø)rr_rrrrù¼sz SafeChildWatcher._do_waitpid_allcCsÆyt |tj¡\}}Wn(tk r>|}d}t d|¡Yn0X|dkrLdS| |¡}|j ¡rnt  d||¡y|j   |¡\}}Wn.t k r°|j ¡r¬tjd|ddYnX|||f|žŽdS)Néÿz8Unknown child process pid %d, will report returncode 255rz$process %s exited with returncode %sz'Child watcher got an unexpected pid: %rT)rÎ) reÚwaitpidÚWNOHANGÚChildProcessErrorr rÜrr¢rÂrÅröÚpopr@)rr÷r_rr`r:r;rrrrøÁs*    zSafeChildWatcher._do_waitpid) rœrržrŸrrðrôrSrîrùrør rr)rrr•s   rcsTeZdZdZ‡fdd„Z‡fdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z ‡Z S)raW'Fast' child watcher implementation. This implementation reaps every terminated processes by calling os.waitpid(-1) directly, possibly breaking other code spawning processes and waiting for their termination. There is no noticeable overhead when handling a big number of children (O(1) each time a child terminates). cs$tƒ ¡t ¡|_i|_d|_dS)Nr)rrÚ threadingZLockÚ_lockÚ_zombiesÚ_forks)r)rrrrîs  zFastChildWatcher.__init__cs"|j ¡|j ¡tƒ ¡dS)N)rör'r rr)r)rrrrôs  zFastChildWatcher.closec Cs$|j|jd7_|SQRXdS)Nr)r r )rrrrrðùszFastChildWatcher.__enter__c CsT|j8|jd8_|js"|js&dSt|jƒ}|j ¡WdQRXt d|¡dS)Nrz5Caught subprocesses termination from unknown pids: %s)r r r r5r'r rÜ)rrñròróZcollateral_victimsrrrrôÿs  zFastChildWatcher.__exit__c Gsl|jdkrtdƒ‚|j:y|j |¡}Wn"tk rL||f|j|<dSXWdQRX|||f|žŽdS)NzICannot add child handler, the child watcher does not have a loop attached)r¢r4r r rr@rö)rr_r:r;r`rrrrS s z"FastChildWatcher.add_child_handlercCs&y |j|=dStk r dSXdS)NTF)rör@)rr_rrrrî s z%FastChildWatcher.remove_child_handlerc Csöxðyt dtj¡\}}Wntk r,dSX|dkr:dS| |¡}|jvy|j |¡\}}WnBtk r¢|j rš||j |<|j   ¡r˜t  d||¡wd}YnX|j   ¡r¼t  d||¡WdQRX|dkrÞt  d||¡q|||f|žŽqWdS)Nr,rz,unknown process %s exited with returncode %sz$process %s exited with returncode %sz8Caught subprocess termination from unknown pid: %d -> %d)rerrrrr rörr@r r r¢rÂr rÅrÜ)rr_rr`r:r;rrrrù's6      z FastChildWatcher._do_waitpid_all) rœrržrŸrrrðrôrSrîrùr rr)rrräs   rcsHeZdZdZeZ‡fdd„Zdd„Z‡fdd„Zdd „Z d d „Z ‡Z S) Ú_UnixDefaultEventLoopPolicyz:UNIX event loop policy with a watcher for child processes.cstƒ ¡d|_dS)N)rrÚ_watcher)r)rrrrVs z$_UnixDefaultEventLoopPolicy.__init__c CsHtj8|jdkr:tƒ|_tt ¡tjƒr:|j |j j ¡WdQRXdS)N) rr r rrErÚcurrent_threadÚ _MainThreadrïÚ_localr¢)rrrrÚ _init_watcherZs  z)_UnixDefaultEventLoopPolicy._init_watchercs6tƒ |¡|jdk r2tt ¡tjƒr2|j |¡dS)zÑSet the event loop. As a side effect, if a child watcher was set before, then calling .set_event_loop() from the main thread will call .attach_loop(loop) on the child watcher. N)rÚset_event_loopr rErrrrï)rru)rrrrbs  z*_UnixDefaultEventLoopPolicy.set_event_loopcCs|jdkr| ¡|jS)zzGet the watcher for child processes. If not yet set, a SafeChildWatcher object is automatically created. N)r r)rrrrrPps z-_UnixDefaultEventLoopPolicy.get_child_watchercCs|jdk r|j ¡||_dS)z$Set the watcher for child processes.N)r r)rr\rrrÚset_child_watcherzs  z-_UnixDefaultEventLoopPolicy.set_child_watcher) rœrržrŸrZ _loop_factoryrrrrPrr rr)rrr Rs   r )-rŸr8rƒrer»r/rgrwrçr rr$Úrrrrrrr r r Úlogr Ú__all__rÖÚ ImportErrorrZBaseSelectorEventLooprZ ReadTransportrHZ_FlowControlMixinZWriteTransportrNZBaseSubprocessTransportrRrrõrrZBaseDefaultEventLoopPolicyr r rrrrrÚsR           | JF=On3