package Ġcom . github . blue trees 2 . nov pn Ċ Ċ import Ġandroid . content . Context Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . util . concurrent . TimeoutException Ċ Ċ class ĠIP Tables Model Async ( val Ġcontext : ĠContext ?) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġipt ables Combined Model Ġ= ĠIP Tables Combined Model ( Root Shell Model . instance ) ĊĊĠĠĠ Ġval Ġipt ables OK : ĠBoolean Ġget () Ġ= Ġ! ipt ables Hal ted ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġval Ġip 6 tables OK : ĠBoolean Ġget () Ġ= Ġ! ip 6 tables Hal ted ĊĠĠĠ Ġval Ġip 6 tables Reject OK : ĠT ernary Ġget () Ġ= Ġip 6 tables Reject State ĊĊĠĠĠ Ġvar Ġon Completion Listener : Ġ( suspend Ġ() Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġvar ĠonError Listener : Ġ( suspend Ġ( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġipt ables Hal ted Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġip 6 tables Hal ted Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġip 6 tables Reject State Ġ= ĠT ernary . UNKNOWN ĊĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠSequential Scope () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . on Completion Listener Ġ= Ġ{ Ġcause Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cause Ġ! is ĠC ancellation Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Completion Listener ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġactive Model : ĠIP Tables Model I ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġipt ables Hal ted Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables Hal ted Ġ-> Ġipt ables Combined Model . ipt ables ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġipt ables Combined Model ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġlog Error ( e : ĠThrowable , Ġpriority : ĠInt ? Ġ= Ġnull ) Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext ?: return @ with Context ĊĠĠĠĠĠĠĠ Ġwith ( Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRoot Error Ġ-> ĠERROR Ġto Ġcontext . getString ( R . string . log _ root _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTimeout Exception Ġ-> ĠERROR Ġto Ġcontext . getString ( R . string . log _ timeout _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIP Tables Error Ġ-> ĠERROR Ġto Ġcontext . getString ( R . string . log _ ipt ables _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIP 6 Tables Error Ġ-> ĠWARN Ġto Ġcontext . getString ( R . string . log _ ip 6 tables _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠERROR Ġto Ġcontext . getString ( R . string . log _ unknown _ error ) Ġ+ Ġ" Ġ$ e " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( priority Ġ?: Ġit . first , Ġ" Main ", Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġadd Or Reject ( ĊĠĠĠĠĠĠĠ Ġadd : Ġsuspend Ġ( IP Tables Model I ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġreject : Ġsuspend Ġ( IP Tables Model I ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ipt ables Hal ted ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ipt ables Combined Model . ipt ables ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ! is ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġipt ables Hal ted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Listener ?. invoke ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġip 6 Error : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ(! ip 6 tables Hal ted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ipt ables Combined Model . ip 6 tables ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ! is ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables Hal ted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ! is ĠIP 6 Tables Error Ġ|| Ġip 6 tables Reject State Ġ== ĠT ernary . NO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Listener ?. invoke ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 Error Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( ip 6 tables Hal ted Ġ&& Ġip 6 tables Reject State Ġ!= ĠT ernary . NO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreject ( ipt ables Combined Model . ip 6 tables ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables Reject State Ġ= ĠT ernary . YES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ! is ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables Reject State Ġ= ĠT ernary . NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e , ĠLog . VERBOSE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Listener ?. invoke ( ip 6 Error Ġ?: Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġip 6 Error ?: return ĊĠĠĠĠĠĠĠ ĠonError Listener ?. invoke ( ip 6 Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġadd UID ( uid : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Or Reject ({ Ġm Ġ-> Ġm . add UID ( uid ) Ġ}, Ġ{ Ġm Ġ-> Ġm . reject UID ( uid ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġclear And Add UID s ( uid List : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Or Reject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġm Ġ-> Ġm . clear And Add UID s ( uid List ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġm Ġ-> Ġm . clear And Reject UID s ( uid List ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Flags OnError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIP 6 Tables Error Ġ-> Ġip 6 tables Hal ted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġipt ables Hal ted Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsafe Exec ( block : Ġsuspend Ġ() Ġ-> ĠUnit , ĠonError : Ġsuspend Ġ( Throwable ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . cancel () ĊĠĠĠĠĠĠĠ Ġipt ables Hal ted Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġip 6 tables Hal ted Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġip 6 tables Reject State Ġ= ĠT ernary . UNKNOWN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcleanup () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . cancel () ĊĠĠĠĠĠĠĠ Ġipt ables Hal ted Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġip 6 tables Hal ted Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġip 6 tables Reject State Ġ= ĠT ernary . UNKNOWN ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafe Exec ({ Ġipt ables Combined Model . cleanup () Ġ}) Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ! is ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flags OnError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Listener ?. invoke ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġenable () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafe Exec ({ Ġactive Model ?. enable () Ġ}) Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ! is ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flags OnError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠIP 6 Tables Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables Reject State Ġ= ĠT ernary . NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Listener ?. invoke ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġmas quer ade () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafe Exec ({ Ġactive Model ?. mas quer ade () Ġ}) Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ! is ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flags OnError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠIP 6 Tables Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip 6 tables Reject State Ġ!= ĠT ernary . NO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables Reject State Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip 6 tables Ġ= Ġipt ables Combined Model . ip 6 tables ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables . list UID s (). forEach Ġ{ Ġuid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables . reject UID ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables . enable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ernary . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e , ĠLog . VERBOSE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ernary . NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Listener ?. invoke ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġremove UID ( uid : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ipt ables Hal ted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( suspend Ġ{ Ġactive Model ?. remove UID ( uid ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Ġ{ Ġactive Model ?. un Reject UID ( uid ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġblock Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ! is ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flags OnError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠIP 6 Tables Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 6 tables Reject State Ġ= ĠT ernary . UNKNOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Listener ?. invoke ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ