package Ġae . hit b . pro ctf . drone _ r acing Ċ Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . nio . file .* Ċ import Ġkotlin . concurrent . thread Ċ Ċ const Ġval ĠTIME _ LIMIT _ MILLISECONDS Ġ= Ġ 1 0 0 Ċ Ċ class ĠCode Runner Ġ{ ĊĠĠĠ Ġfun Ġrun Code ( class Filename : ĠString , Ġparams : ĠMap < String , ĠString >, Ġm aze : ĠString ): ĠRun Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass Bytes Ġ= ĠFiles . read All Bytes ( Paths . get ( class Filename )) ĊĠĠĠĠĠĠĠ Ġval Ġclass Loader Ġ= ĠByteArray ClassLoader ( map Of (" Code " Ġto Ġclass Bytes )) ĊĠĠĠĠĠĠĠ Ġvar Ġmoves Count = ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġoutput Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġexception : ĠThrowable ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġset Params ( params ); ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Thread Ġ= Ġthread ( start Ġ= Ġfalse , Ġis Daemon Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġclass Loader . load Class (" Code ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset M aze Ġ= Ġklass . getMethod (" set M aze ", ĠString :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset M aze . invoke ( null , Ġm aze ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Ġ= Ġklass . getMethod (" main ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain . invoke ( null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Moves Count Ġ= Ġklass . getMethod (" get Moves Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmoves Count Ġ= Ġget Moves Count . invoke ( null ) Ġas ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Output Ġ= Ġklass . getMethod (" getOutput ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= Ġget Output . invoke ( null ) Ġas ĠString ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis On Top Right Cell Ġ= Ġklass . getMethod (" is On Top Right Cell ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġis On Top Right Cell . invoke ( null ) Ġas ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Thread . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( System . currentTimeMillis () Ġ- ĠstartTime Ġ< ĠTIME _ LIMIT _ MILLISECONDS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Ġcode Thread . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Thread Ġis Ġdead . ĠLong Ġlive Ġthe Ġthread !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( code Thread . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Thread . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRun Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" Your Ġcode Ġhas Ġbeen Ġinterrupted Ġbecause Ġit Ġneeds Ġmore Ġthan Ġ$ TIME _ LIMIT _ MILLISECONDS Ġmilliseconds " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Params ( params ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( exception Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRun Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġget ErrorMessage ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRun Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġsuccess , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ= Ġmoves Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= Ġoutput ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget ErrorMessage ( exception : ĠThrowable ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault ErrorMessage Ġ= Ġ" Exception Ġoccurred " ĊĠĠĠĠĠĠĠ Ġif Ġ( exception Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdefault ErrorMessage ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInvocation TargetException Ġ-> Ġexception . cause ?. message Ġ?: Ġexception . message Ġ?: Ġdefault ErrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexception . message Ġ?: Ġdefault ErrorMessage ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Params ( params : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( param Ġin Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . setProperty ( param . key , Ġparam . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Params ( params : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( param Ġin Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . setProperty ( param . key , Ġ"") ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠRun Result ( ĊĠĠĠ Ġval Ġsuccess : ĠBoolean , ĊĠĠĠ Ġval Ġscore : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġval Ġerror : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval ĠerrorMessage : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval Ġoutput : ĠString Ġ= Ġ"" Ċ ) ĊĊ Ċ class ĠByteArray ClassLoader ( private Ġval Ġclass Bytes : ĠMap < String , ĠByteArray >): ĠClassLoader () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfind Class ( name : ĠString ?): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( class Bytes . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Class Bytes Ġ= Ġclass Bytes [ name ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdefine Class ( null , Ġthis Class Bytes , Ġ 0 , Ġthis Class Bytes . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . find Class ( name ) ĊĠĠĠ Ġ} Ċ }