package Ġcom . hand truth . mc . p aket Ċ Ċ import Ġcom . hand truth . mc . p aket . codec . Codec Ċ import Ġcom . hand truth . mc . p aket . codec . Enum Codec Ċ import Ġcom . hand truth . mc . p aket . codec . String Codec Ċ import Ġcom . hand truth . mc . p aket . transmit ter .* Ċ import Ġcom . hand truth . mc . p aket . util .* Ċ import Ġcom . hand truth . mc . p aket . util . Struct P aket Ċ import Ġkotlinx . atomic fu . Atomic Ref Ċ import Ġkotlinx . atomic fu . atomic Ċ import Ġkotlinx . atomic fu . locks . re entrant Lock Ċ import Ġkotlinx . atomic fu . locks . with Lock Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . jvm . Jvm Name Ċ Ċ @ Dsl Marker Ċ public Ġannotation Ġclass ĠP aket Tree Ċ Ċ public Ġclass ĠProtocol Domain < T >( ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context , ĊĠĠĠ Ġprivate Ġval Ġsplit ter : ĠTrans mit Splitter < T > Ċ ) Ġ: ĠCor outine Scope Ġ{ ĊĠĠĠ Ġprivate Ġclass ĠTask ( val Ġjob : ĠJob , Ġval Ġtransmit ter : ĠTrans mit ter ) ĊĊĠĠĠ Ġprivate Ġval Ġtasks Ġ= Ġhash Map Of < T , ĠTask >() ĊĠĠĠ Ġprivate Ġval Ġdefault : ĠAtomic Ref < Task ?> Ġ= Ġatomic ( null ) ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= Ġre entrant Lock () ĊĊĠĠĠ Ġprivate Ġfun Ġadd Task ( key : ĠT , Ġtask : ĠJob , Ġtransmit ter : ĠTrans mit ter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . put ( key , ĠTask ( task , Ġtransmit ter )) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . transmit ter . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . job . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Task ( key : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġtasks . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . transmit ter . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . job . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetDefault ( task : ĠJob , Ġtransmit ter : ĠTrans mit ter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġdefault . get AndSet ( Task ( task , Ġtransmit ter )) ĊĠĠĠĠĠĠĠ Ġif Ġ( old Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold . transmit ter . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold . job . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Default () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġdefault . get AndSet ( null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( old Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold . transmit ter . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold . job . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġpublic Ġfun Ġbranch ( key : ĠT , Ġroutine : Ġsuspend ĠCor outine Scope .( Transmit ter ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransmit ter Ġ= Ġsplit ter . sp ill ( key ) ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġlaunch ( start Ġ= ĠCor outine Start . LA ZY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroutine ( transmit ter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransmit ter . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Task ( key , Ġtask , Ġtransmit ter ) ĊĠĠĠĠĠĠĠ Ġtask . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġpublic Ġfun Ġdefault ( routine : Ġsuspend ĠCor outine Scope .( Sp ill Transmit ter < T >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransmit ter Ġ= Ġsplit ter . default () ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġlaunch ( start Ġ= ĠCor outine Start . LA ZY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroutine ( transmit ter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransmit ter . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠsetDefault ( task , Ġtransmit ter ) ĊĠĠĠĠĠĠĠ Ġtask . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġcancel Branch ( key : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Task ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġcancel Default () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Default () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġ@ Jvm Name (" receive P aket ") ĊĠĠĠ Ġpublic Ġfun Ġreceive ( key : ĠT , Ġblock : Ġsuspend ĠCor outine Scope .( Extractor ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbranch ( key ) Ġ{ Ġts Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġts . receive All Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġ@ Jvm Name (" reply P aket ") ĊĠĠĠ Ġpublic Ġfun Ġreply ( key : ĠT , Ġblock : Ġsuspend ĠCor outine Scope .( Extractor ) Ġ-> ĠP aket ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbranch ( key ) Ġ{ Ġts Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġts . reply All Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠS > Ġreceive ( ĊĠĠĠĠĠĠĠ Ġkey : ĠT , ĊĠĠĠĠĠĠĠ Ġno inline Ġblock : Ġsuspend ĠCor outine Scope .( S ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠStruct P aket < S >() ĊĠĠĠĠĠĠĠ Ġreceive ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . extract ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( request . item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠQ , Ġre ified ĠR > Ġreply ( ĊĠĠĠĠĠĠĠ Ġkey : ĠT , ĊĠĠĠĠĠĠĠ Ġno inline Ġblock : Ġsuspend ĠCor outine Scope .( Q ) Ġ-> ĠR ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠStruct P aket < Q >() ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠStruct P aket < R >() ĊĠĠĠĠĠĠĠ Ġreply ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . extract ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . item Ġ= Ġblock ( request . item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠQ , Ġre ified ĠR > Ġbar ter ( ĊĠĠĠĠĠĠĠ Ġkey : ĠT , ĊĠĠĠĠĠĠĠ Ġno inline Ġblock : Ġsuspend ĠCor outine Scope .( Bar ter < Q , ĠR >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbranch ( key ) Ġ{ Ġts Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġts . with Bar ter < Q , ĠR > Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠQ > Ġsink ( ĊĠĠĠĠĠĠĠ Ġkey : ĠT , ĊĠĠĠĠĠĠĠ Ġno inline Ġblock : Ġsuspend ĠCor outine Scope .( Sink < Q >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbranch ( key ) Ġ{ Ġts Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġts . with Sink < Q > Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ P aket Tree ĊĠĠĠ Ġpublic Ġfun Ġdrop ( key : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbranch ( key ) Ġ{ Ġts Ġ-> Ġts . drop All () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ P aket Tree Ċ public Ġsuspend Ġfun Ġ< T > Ġdomain ( ĊĠĠĠ Ġtransmit ter : ĠTrans mit ter , ĊĠĠĠ Ġkey Codec : ĠCodec < T >, ĊĠĠĠ Ġinitial : ĠT , ĊĠĠĠ Ġblock : Ġsuspend ĠProtocol Domain < T >. () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġsplit ter Ġ= ĠTrans mit Splitter ( key Codec , Ġinitial , Ġtransmit ter ) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdomain Ġ= ĠProtocol Domain ( kotlin . coroutines . coroutine Context , Ġsplit ter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain . block () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġsplit ter . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ P aket Tree Ċ public Ġsuspend Ġfun Ġnamed Domain ( transmit ter : ĠTrans mit ter , Ġblock : Ġsuspend ĠProtocol Domain < String >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġdomain ( transmit ter , ĠString Codec , Ġ"", Ġblock ) Ċ } Ċ Ċ @ P aket Tree Ċ public Ġsuspend Ġinline Ġfun Ġ< re ified ĠE Ġ: ĠEnum < E >> Ġenum erated Domain ( ĊĠĠĠ Ġtransmit ter : ĠTrans mit ter , ĊĠĠĠ Ġno inline Ġblock : Ġsuspend ĠProtocol Domain < E >. () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġdomain ( transmit ter , ĠEnum Codec (), Ġenum Values < E >() [ 0 ], Ġblock ) Ċ } Ċ Ċ @ P aket Tree Ċ public Ġfun Ġ< T > ĠProtocol Domain < T >. named ( key : ĠT , Ġblock : Ġsuspend ĠProtocol Domain < String >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġbranch ( key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdomain ( it , ĠString Codec , Ġ"", Ġblock ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ P aket Tree Ċ public Ġinline Ġfun Ġ< T , Ġre ified ĠE Ġ: ĠEnum < E >> ĠProtocol Domain < T >. enum erated ( ĊĠĠĠ Ġkey : ĠT , ĊĠĠĠ Ġno inline Ġblock : Ġsuspend ĠProtocol Domain < E >. () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġbranch ( key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdomain ( it , ĠEnum Codec (), Ġenum Values < E >() [ 0 ], Ġblock ) ĊĠĠĠ Ġ} Ċ } Ċ