package Ġbe . my god . lib root kotlin x Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . os . Remote Exception Ċ import Ġandroid . system . Errno Exception Ċ import Ġandroid . system . Os Ċ import Ġandroid . system . Os Constants Ċ import Ġandroidx . collection . Long Sparse Array Ċ import Ġandroidx . collection . value Iterator Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels .* Ċ import Ġjava . io .* Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġkotlin . system . exit Process Ċ Ċ class ĠRoot Server Ġ{ ĊĠĠĠ Ġprivate Ġsealed Ġclass ĠCallback ( private Ġval Ġserver : ĠRoot Server , Ġprivate Ġval Ġindex : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġval Ġclass Loader : ĠClassLoader ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġactive Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġcancel () ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġshould Remove ( result : ĠByte ): ĠBoolean ĊĠĠĠĠĠĠĠ Ġabstract Ġoperator Ġfun Ġinvoke ( input : ĠData InputStream , Ġresult : ĠByte ) ĊĠĠĠĠĠĠĠ Ġfun Ġsend Closed () Ġ= Ġserver . execute ( Cancel Command ( index )) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinit Exception ( target Class : ĠClass <* >, Ġmessage : ĠString ): ĠThrowable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtarget Class Ġ= Ġtarget Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtry Ġto Ġfind Ġa Ġmessage Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget Class . getDeclared Constructor ( String :: class . java ). newInstance ( message ) Ġas ĠThrowable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠReflect ive OperationException ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġtarget Class . super class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmake Remote Exception ( cause : ĠThrowable , Ġmessage : ĠString ? Ġ= Ġnull ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cause Ġis ĠC ancellation Exception ) Ġcause Ġelse ĠRemoteException ( message ). init Cause ( cause ) ĊĠĠĠĠĠĠĠ Ġprotected Ġfun ĠData InputStream . read Exception ( result : ĠByte ) Ġ= Ġwhen Ġ( result . toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEX _ GENERIC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġread UTF () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġmessage . split (' :', Ġlimit Ġ= Ġ 2 )[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmake Remote Exception ( init Exception ( try Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader ?. load Class ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠClass . forName ( name ), Ġmessage ), Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEX _ PAR CEL ABLE Ġ-> Ġmake Remote Exception ( read Parcelable < Parcelable >( class Loader ) Ġas ĠThrowable ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEX _ SERIAL IZ ABLE Ġ-> Ġmake Remote Exception ( read Serializable ( class Loader ) Ġas ĠThrowable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unexpected Ġresult Ġ$ result ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠOrd inary ( server : ĠRoot Server , Ġindex : ĠLong , Ġclass Loader : ĠClassLoader ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcallback : ĠComp letable Deferred < Parcelable ?> ) Ġ: ĠCallback ( server , Ġindex , Ġclass Loader ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcancel () Ġ= Ġcallback . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Remove ( result : ĠByte ) Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( input : ĠData InputStream , Ġresult : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . toInt () Ġ== ĠSUCCESS ) Ġcallback . complete ( input . read Parcelable ( class Loader )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcallback . complete Exception ally ( input . read Exception ( result )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠChannel ( server : ĠRoot Server , Ġindex : ĠLong , Ġclass Loader : ĠClassLoader ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġchannel : ĠSend Channel < Parcelable ?> ) Ġ: ĠCallback ( server , Ġindex , Ġclass Loader ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinish : ĠComp letable Deferred < Unit > Ġ= ĠComp letable Deferred () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcancel () Ġ= Ġfinish . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Remove ( result : ĠByte ) Ġ= Ġresult . toInt () Ġ!= ĠSUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( input : ĠData InputStream , Ġresult : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSUCCESS Ġ-> Ġchannel . try Send ( input . read Parcelable ( class Loader )). on Closed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Closed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish . complete Exception ally ( it ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠClosed Send Channel Exception (" Channel Ġwas Ġclosed Ġnormally ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġthrow Ġit !! Ġ} Ġ Ġ// Ġthe Ġchannel Ġwe Ġare Ġsupporting Ġshould Ġnever Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHAN NEL _ CON SU MED Ġ-> Ġfinish . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfinish . complete Exception ally ( input . read Exception ( result )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠUnexpected Exit Exception Ġ: ĠRemoteException (" Root Ġprocess Ġexited Ġunexpected ly ") ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprocess : ĠProcess ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThread Ġsafety : Ġneeds Ġto Ġbe Ġprotected Ġby Ġcallback Lookup . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoutput : ĠData OutputStream ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġactive Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcounter Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġcallback Listener Exit : ĠDeferred < Unit >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġcallback Lookup Ġ= ĠLong Sparse Array < Callback >() ĊĊĠĠĠ Ġprivate Ġfun Ġread Unexpected Stderr (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this :: process . isInitialized ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ ĠLogger . me . d (" At tempting Ġto Ġread Ġstderr ") ĊĠĠĠĠĠĠĠ Ġvar Ġavailable Ġ= Ġprocess . error Stream . available () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( available Ġ<= Ġ 0 ) Ġnull Ġelse ĠString ( ByteArray OutputStream (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( available Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( available ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġprocess . error Stream . read ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ< Ġ 0 ) Ġthrow ĠEOF Exception () ĠĠ Ġ// Ġshould Ġnot Ġhappen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( bytes , Ġ 0 , Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ= Ġprocess . error Stream . available () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . w (" Reading Ġstderr Ġwas Ġcut Ġshort ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toByteArray ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBufferedReader . look For Token ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġread Line () Ġ?: Ġthrow ĠEOF Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . endsWith ( token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextra Length Ġ= Ġline . length Ġ- Ġtoken . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extra Length Ġ> Ġ 0 ) ĠLogger . me . w ( line . substring ( 0 , Ġextra Length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . w ( line ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġdo Init ( context : ĠContext , Ġnice Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( reader , Ġwriter ) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Ġ= ĠProcess Builder (" su "). start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken 1 Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠData OutputStream ( process . output Stream . buffered ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write Bytes (" echo Ġ$ token 1 \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= Ġprocess . inputStream . buffered Reader () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . look For Token ( token 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . d (" Root Ġshell Ġinitialized ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader Ġto Ġwriter ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNo Shell Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken 2 Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpersistence Ġ= ĠFile ( context . code Cache Dir , Ġ". lib root kotlin x - uuid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġcontext . packageName Ġ+ Ġ'@ ' Ġ+ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpersistence . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . randomUUID (). toString (). also Ġ{ Ġpersistence . write Text ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( script , Ġre located ) Ġ= ĠApp Process . re locate Script ( uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript . append Line ( App Process . launch String ( context . package Code Path , ĠRoot Server :: class . java . name , Ġre located , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnice Name ) Ġ+ Ġ" Ġ$ token 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write Bytes ( script . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . look For Token ( token 2 ) Ġ// Ġwait Ġfor Ġready Ġsignal ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġlaunch Ġroot Ġdaemon ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput Ġ= Ġwriter ĊĠĠĠĠĠĠĠ Ġrequire (! active ) ĊĠĠĠĠĠĠĠ Ġactive Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠLogger . me . d (" Root Ġserver Ġinitialized ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcallback Spin () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠData InputStream ( process . inputStream . buffered ()) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . read Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠEOF Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġinput . read Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġsynchronized ( callback Lookup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active ) Ġ( callback Lookup [ index ] Ġ?: Ġerror (" Empty Ġcallback Ġ#$ index ")). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . should Remove ( result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Lookup . remove ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . active Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . d (" Received Ġcallback Ġ#$ index : Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( input , Ġresult ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġa ĠRoot Server Ġsynchronous ly , Ġcan Ġthrow Ġa Ġlot Ġof Ġexceptions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠAny Ġ[ Context ] Ġfrom Ġthe Ġapp . ĊĠĠĠĠ Ġ* Ġ@ param Ġnice Name ĠName Ġto Ġcall Ġthe Ġroot ed ĠJava Ġprocess . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġinit ( context : ĠContext , Ġnice Name : ĠString Ġ= Ġ"${ context . packageName }: root ") Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Init ( context , Ġnice Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Unexpected Stderr ()?. let Ġ{ ĠLogger . me . e ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . e (" Failed Ġto Ġread Ġfrom Ġstderr ", Ġe ) ĠĠĠ Ġ// Ġavoid Ġthe Ġreal Ġexception Ġbeing Ġsw allowed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcallback Listener Exit Ġ= ĠGlobal Scope . async ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Reader Ġ= Ġasync ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . error Stream . buffered Reader (). forEach Line ( Logger . me :: w ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠIOException ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Spin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active ) Ġthrow ĠUnexpected Exit Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . d (" Waiting Ġfor Ġexit ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Non C ancellable ) Ġ{ Ġerror Reader . await () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . waitFor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Internal ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall er Ġshould Ġcheck Ġfor Ġactive . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsend Locked ( command : ĠParcel able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write Parcelable ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . flush () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . is EB ADF ) Ġthrow ĠC ancellation Exception (). init Cause ( e ) Ġelse Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠErr no Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . errno Ġ== ĠOs Constants . E PIPE ) Ġthrow ĠC ancellation Exception (). init Cause ( e ) Ġelse Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLogger . me . d (" Sent Ġ#$ counter : Ġ$ command ") ĊĠĠĠĠĠĠĠ Ġcounter ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute ( command : ĠRoot Command One Way ) Ġ= Ġsynchronized ( callback Lookup ) Ġ{ Ġif Ġ( active ) Ġsend Locked ( command ) Ġ} ĊĠĠĠ Ġ@ Throws ( Remote Exception :: class ) ĊĠĠĠ Ġsuspend Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠParcel able ?> Ġexecute ( command : ĠRoot Command < T >) Ġ= ĊĠĠĠĠĠĠĠ Ġexecute ( command , ĠT :: class . java . class Loader ) ĊĠĠĠ Ġ@ Throws ( Remote Exception :: class ) ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠParcel able ?> Ġexecute ( command : ĠRoot Command < T >, Ġclass Loader : ĠClassLoader ?): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠComp letable Deferred < T >() ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġsynchronized ( callback Lookup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠCallback . Ord inary ( this , Ġcounter , Ġclass Loader , Ġfuture Ġas ĠComp letable Deferred < Parcelable ?> ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Lookup . append ( counter , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Locked ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġfuture . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfuture . await () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback . active ) Ġcallback . send Closed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . active Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ Throws ( Remote Exception :: class ) ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠParcel able ?> Ġcreate ( command : ĠRoot Command Channel < T >, Ġscope : ĠCor outine Scope ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate ( command , Ġscope , ĠT :: class . java . class Loader ) ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ Throws ( Remote Exception :: class ) ĊĠĠĠ Ġfun Ġ< T Ġ: ĠParcel able ?> Ġcreate ( command : ĠRoot Command Channel < T >, Ġscope : ĠCor outine Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader : ĠClassLoader ?) Ġ= Ġscope . produce < T >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSuper visor Job (), Ġcommand . capacity . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . UN LIMIT ED , ĠChannel . CON FL ATED Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġchannel Ġcapacity Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġsynchronized ( callback Lookup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠCallback . Channel ( this @ Root Server , Ġcounter , Ġclass Loader , Ġthis Ġas ĠSend Channel < Parcelable ?> ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Lookup . append ( counter , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Locked ( command ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcallback . finish . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . finish . await () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback . active ) Ġcallback . send Closed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . active Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Internal ( from Worker : ĠBoolean Ġ= Ġfalse ) Ġ= Ġsynchronized ( callback Lookup ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . d ( if Ġ( from Worker ) Ġ" Shut ting Ġdown Ġfrom Ġworker " Ġelse Ġ" Shut ting Ġdown Ġfrom Ġclient ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Locked ( Shutdown ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . output Stream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . w (" send ĠShutdown Ġfailed ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . d (" Client Ġclosed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( from Worker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( callback Ġin Ġcallback Lookup . value Iterator ()) Ġcallback . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Lookup . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShutdown Ġthe Ġinstance Ġgrace fully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġclose Internal () ĊĠĠĠĠĠĠĠ Ġval Ġcallback Listener Exit Ġ= Ġcallback Listener Exit Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( 1 0 0 0 0 ) Ġ{ Ġcallback Listener Exit . await () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTimeout Cancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . w (" Closing Ġthe Ġinstance Ġhas Ġtimed Ġout ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 2 6 ) Ġprocess . destroy () Ġelse Ġif Ġ( process . is Alive ) Ġprocess . destroy For c ibly () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnexpected Exit Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . w ( e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSUCCESS Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX _ GENERIC Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX _ PAR CEL ABLE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX _ SERIAL IZ ABLE Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCHAN NEL _ CON SU MED Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠData InputStream . read ByteArray () Ġ= ĠByteArray ( readInt ()). also Ġ{ Ġread Fully ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠParcel able > ĠData InputStream . read Parcelable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader : ĠClassLoader ? Ġ= ĠT :: class . java . class Loader ) Ġ= Ġread ByteArray (). to Parcelable < T >( class Loader ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠData OutputStream . write Parcelable ( data : ĠParcel able ?, Ġparcel able Flags : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġdata . toByteArray ( parcel able Flags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( bytes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠData InputStream . read Serializable ( class Loader : ĠClassLoader ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠObject InputStream ( ByteArray InputStream ( read ByteArray ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresolve Class ( desc : ĠObject Stream Class ) Ġ= ĠClass . forName ( desc . name , Ġfalse , Ġclass Loader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. read Object () ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . setDefault Un caught ExceptionHandler Ġ{ Ġthread , Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . e (" Un caught Ġexception Ġfrom Ġ$ thread ", Ġthrowable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . printStackTrace () ĠĠĠĠ Ġ// Ġstderr Ġwill Ġbe Ġread Ġby Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Main ( args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) Ġ Ġ// Ġthere Ġmight Ġbe Ġother Ġnon - daemon Ġthreads ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠData OutputStream . push Throwable ( callback : ĠLong , Ġe : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Long ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠParcel able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( EX _ PAR CEL ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Parcelable ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArrayOutputStream (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObject OutputStream ( this ). use Ġ{ Ġit . write Object ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( EX _ SERIAL IZ ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( bytes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠNot Serializable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( EX _ GENERIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite UTF ( e . stack Trace ToString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠData OutputStream . push Result ( callback : ĠLong , Ġresult : ĠParcel able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Long ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( SUCCESS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Parcelable ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġroot Main ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( args . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Initialized Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Ġ= ĠThread ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ooper . prepare Main Looper () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Initialized . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ooper . loop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ" main ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠJob () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Worker Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Initialized . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Main . immediate Ġ+ Ġjob ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Worker Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Initialized . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch ers . IO . limited Parallel ism ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaccess Ġto Ġcancell ables Ġshall Ġbe Ġwrapped Ġin Ġdefault Worker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcancell ables Ġ= ĠLong Sparse Array < () Ġ-> ĠUnit >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthread Ġsafety : Ġusage Ġof Ġoutput Ġshould Ġbe Ġgu arded Ġby Ġcallback Worker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠData OutputStream ( File OutputStream ( Os . dup ( FileDescriptor . out )). buffered (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprevent Ġfuture Ġwrite Ġattempts Ġto ĠSystem . out , Ġpossibly Ġfrom ĠSamsung Ġchanges Ġ( again ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOs . dup 2 ( FileDescriptor . err , ĠOs Constants . STDOUT _ FIL ENO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . set Out ( System . err ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= Ġwriter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . append Line ( args [ 0 ]) Ġ Ġ// Ġecho Ġready Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthread Ġsafety : Ġusage Ġof Ġinput Ġshould Ġbe Ġin Ġmain Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠData InputStream ( System .` in `. buffered ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . d (" Server Ġentering Ġmain Ġloop ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop @ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . read Parcelable < Parcelable >( Root Server :: class . java . class Loader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠEOF Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġcounter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . d (" Received Ġ#$ callback : Ġ$ command ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( command ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCancel Command Ġ-> Ġdefault Worker . launch Ġ{ Ġcancell ables [ command . index ]?. invoke () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRoot Command One Way Ġ-> Ġdefault Worker . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . e (" Unexpected Ġexception Ġin ĠRoot Command One Way Ġ($ command . java Class . simple Name )", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRoot Command < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Job Ġ= ĠJob () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Worker . launch ( command Job ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancell ables . append ( callback ) Ġ{ Ġcommand Job . cancel () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcommand . execute (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġoutput . push Result ( callback , Ġresult ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworker Ġ= Ġ{ Ġoutput . push Throwable ( callback , Ġe ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancell ables . remove ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( callback Worker Ġ+ ĠNon C ancellable ) Ġ{ Ġresult () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRoot Command Channel < *> Ġ-> Ġdefault Worker . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . create ( this ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancell ables . append ( callback ) Ġ{ Ġit . cancel () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. consume Each Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( callback Worker ) Ġ{ Ġoutput . push Result ( callback , Ġresult ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write Byte ( CHANNEL _ CON SU MED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write Long ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworker Ġ= Ġ{ Ġoutput . push Throwable ( callback , Ġe ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancell ables . remove ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( callback Worker Ġ+ ĠNon C ancellable ) Ġ{ Ġresult () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShutdown Ġ-> Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unrecognized Ġinput : Ġ$ command ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . d (" Clean Ġup Ġinitiated Ġbefore Ġexit . ĠJobs : Ġ${ job . children . join ToString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( run Blocking Ġ{ Ġwith Timeout OrNull ( 5 0 0 0 ) Ġ{ Ġjob . join () Ġ} Ġ} Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . me . w (" Clean Ġup Ġtimeout : Ġ${ job . children . join ToString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠLogger . me . d (" Clean Ġup Ġfinished , Ġexiting ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ