package Ġrep 2 recall . db Ċ Ċ import Ġcom . github . gue par do apps . k ul id . UL ID Ċ import Ġcom . github . sal om on br ys . kot son . fromJson Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . google . gson . Json Element Ċ import Ġcom . t alan labs . av at arg ener ator . Avatar Ċ import Ġcom . t alan labs . av at arg ener ator . Ident icon Avatar Ċ import Ġorg . jetbrains . ex posed . dao . Entity Ċ import Ġorg . jetbrains . ex posed . dao . Entity Class Ċ import Ġorg . jetbrains . ex posed . dao . id . Entity ID Ċ import Ġorg . jetbrains . ex posed . dao . id . Id Table Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġorg . jetbrains . ex posed . sql . Sql Expression Builder . eq Ċ import Ġorg . jetbrains . ex posed . sql . Sql Expression Builder . greater Ċ import Ġorg . jetbrains . ex posed . sql . Sql Expression Builder . greater Eq Ċ import Ġorg . jetbrains . ex posed . sql . Sql Expression Builder . isNull Ċ import Ġorg . jetbrains . ex posed . sql . Sql Expression Builder . less Ċ import Ġorg . jetbrains . ex posed . sql . Sql Expression Builder . less Eq Ċ import Ġorg . jetbrains . ex posed . sql . Sql Expression Builder . like Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . joda . time . Duration Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . nio . file . Path Ċ import Ġjava . security . Secure Random Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ Ċ val Ġgson : ĠGson Ġ= ĠGson Builder () Ċ // ĠĠĠĠĠĠĠ Ġ. serialize Null s () ĊĠĠĠĠĠĠĠ Ġ. create () Ċ Ċ val Ġrand Ġ= ĠSecure Random () Ċ Ċ fun Ġrandom 6 4 ( size : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġval Ġba Ġ= ĠByteArray ( size ) ĊĠĠĠ Ġrand . next Bytes ( ba ) ĊĠĠĠ Ġreturn ĠString ( Base 6 4 . get Encoder (). encode ( ba )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( Regex ("^ = + "), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( Regex (" = +$ "), Ġ"") Ċ } Ċ Ċ fun Ġrandom File ( suffix : ĠString , Ġpath : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġfilename Ġ= Ġ"${ random 6 4 ( 1 6 ). sanitize Filename ()} $ suffix " ĊĠĠĠ Ġwhile Ġ( Path . of ( path , Ġfilename ). to File (). exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfilename Ġ= Ġ"${ random 6 4 ( 1 6 ). sanitize Filename ()} $ suffix " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfilename Ċ } Ċ Ċ val Ġavatar Builder : ĠAvatar Ġ= ĠIdent icon Avatar . new Avatar Builder (). build () Ċ Ċ fun ĠString . sanitize Filename (): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġs Ġ= ĠStringBuilder () ĊĠĠĠ Ġfor Ġ( c Ġin Ġto CharArray ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'.' Ġ|| ĠCharacter . is Java Identifier Part ( c )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . append ( c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġs . toString () Ċ } Ċ Ċ fun ĠString . avatar (): ĠBufferedImage Ġ{ ĊĠĠĠ Ġval Ġs Ġ= Ġif Ġ( isBlank ()) Ġrandom 6 4 ( 1 6 ) Ġelse Ġthis ĊĠĠĠ Ġvar Ġh Ġ= Ġ 1 1 2 5 8 9 9 9 0 6 8 4 2 5 9 7 L Ġ// Ġprime ĊĠĠĠ Ġfor Ġ( c Ġin Ġs . toCharArray ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġ 3 1 * h Ġ+ Ġc . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġavatar Builder . create ( h ) Ċ } Ċ Ċ abstract Ġclass ĠInit Table ( name : ĠString Ġ= Ġ"") : ĠId Table < String >( name ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġid Ġ= Ġvarchar (" id ", Ġ 2 6 ). entityId () ĊĠĠĠ Ġopen Ġfun Ġinit () Ġ{} Ċ } Ċ Ċ abstract Ġclass ĠSer Entity ( id : ĠEntity ID < String >): ĠEntity < String >( id ) Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġserialize (): ĠAny Ċ } Ċ Ċ abstract Ġclass ĠU L ID Entity Class < Entity : Ser Entity >( table : ĠInit Table ): ĠEntity Class < String , ĠEntity >( table ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġnew ( id : ĠString ?, Ġinit : ĠEntity . () Ġ-> ĠUnit ) Ġ= Ġsuper . new ( id Ġ?: ĠU L ID . random (), Ġinit ) ĊĠĠĠ Ġoverride Ġfun Ġnew ( init : ĠEntity . () Ġ-> ĠUnit ) Ġ= Ġnew ( null , Ġinit ) Ċ } Ċ Ċ fun ĠSer Entity . filter Key ( select : ĠSet < String >) Ġ= Ġgson . fromJson < Map < String , ĠJson Element >>( gson . toJson ( serialize ())) ĊĠĠĠĠĠĠĠ Ġ. entries ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġselect . contains ( it . key ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. associate Ġ{ Ġit . key Ġto Ġit . value Ġ} Ċ Ċ data Ġclass ĠQuery Split ( ĊĠĠĠĠĠĠĠ Ġval Ġand : ĠList < Query Split Part >, ĊĠĠĠĠĠĠĠ Ġval Ġor : ĠList < Query Split Part >, ĊĠĠĠĠĠĠĠ Ġval Ġnot : ĠList < Query Split Part > Ċ ) Ċ Ċ data Ġclass ĠQuery Split Part ( ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġop : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString Ċ ) Ċ Ċ object ĠQuery Util Ġ{ ĊĠĠĠ Ġfun Ġparse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġops : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Op : Ġ( Query Split Part ) Ġ-> ĠOp < Boolean > ĊĠĠĠ Ġ): ĠOp < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġand Ġ= Ġmutable ListOf < Query Split Part >() ĊĠĠĠĠĠĠĠ Ġval Ġor Ġ= Ġmutable ListOf < Query Split Part >() ĊĠĠĠĠĠĠĠ Ġval Ġnot Ġ= Ġmutable ListOf < Query Split Part >() ĊĊĠĠĠĠĠĠĠ Ġsplit By ( q , Ġ" Ġ"). map Ġ{ Ġseg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġls Ġ= Ġand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġseg ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( seg . get OrNull ( 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'-' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġls Ġ= Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġseg . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' ?' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġls Ġ= Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġseg . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis App ended Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( op Ġin Ġops ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġps Ġ= Ġsplit By ( value , Ġop ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is App ended Ġ&& Ġps . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġls . add ( Query Split Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġps [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop Ġ= Ġop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġun quote ( ps [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis App ended Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is App ended ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġls . add ( Query Split Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġun quote ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġse gs Ġ= ĠQuery Split ( and , Ġor , Ġnot ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnot Cond Ġ= Ġse gs . not . map Ġ{ Ġparse Op ( it ) Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġit . reduce Ġ{ Ġacc , Ġop Ġ-> Ġacc Ġand Ġop Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġnot ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġand Cond Ġ= Ġse gs . and . map Ġ{ Ġparse Op ( it ) Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġit . reduce Ġ{ Ġacc , Ġop Ġ-> Ġacc Ġand Ġop Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġand Cond Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Cond ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Cond Ġand Ġnot Cond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġand Cond ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġse gs . or . map Ġ{ Ġparse Op ( it ) Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġit . reduce Ġ{ Ġacc , Ġop Ġ-> Ġacc Ġor Ġop Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġor Cond Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġand Cond ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Cond Ġor Ġand Cond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġor Cond ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠOp . TRUE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" comp Id String ") ĊĠĠĠ Ġfun Ġcomp ( p : ĠQuery Split Part , Ġc : ĠColumn < Entity ID < String >>) Ġ= Ġwhen ( p . op ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"< " Ġ-> Ġc Ġless Ġp . value ĊĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġc Ġless Eq Ġp . value ĊĠĠĠĠĠĠĠ Ġ" >" Ġ-> Ġc Ġgreater Ġp . value ĊĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġc Ġgreater Eq Ġp . value ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġc Ġeq Ġp . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" comp Id String Nullable ") ĊĠĠĠ Ġfun Ġcomp ( p : ĠQuery Split Part , Ġc : ĠColumn < Entity ID < String > ?> ) Ġ= Ġif Ġ( p . value Ġ== Ġ" NULL ") Ġc . isNull () Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġwhen ( p . op ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ"< " Ġ-> Ġc Ġless Ġp . value Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġc Ġless Eq Ġp . value Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" >" Ġ-> Ġc Ġgreater Ġp . value Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġc Ġgreater Eq Ġp . value Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġc Ġeq Ġp . value Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġc Ġeq Ġp . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" comp String ") ĊĠĠĠ Ġfun Ġcomp ( p : ĠQuery Split Part , Ġc : ĠColumn < String >) Ġ= Ġwhen ( p . op ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"< " Ġ-> Ġc Ġless Ġp . value ĊĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġc Ġless Eq Ġp . value ĊĠĠĠĠĠĠĠ Ġ" >" Ġ-> Ġc Ġgreater Ġp . value ĊĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġc Ġgreater Eq Ġp . value ĊĠĠĠĠĠĠĠ Ġ"~ " Ġ-> Ġc Ġlike Ġp . value ĊĠĠĠĠĠĠĠ Ġ"=" Ġ-> Ġc Ġeq Ġp . value ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġc Ġlike Ġ"% ${ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . value . replace ( Regex ("[ _% ] "), Ġ"[ \$ & ]") ĊĠĠĠĠĠĠĠ Ġ} %" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" comp String Nullable ") ĊĠĠĠ Ġfun Ġcomp ( p : ĠQuery Split Part , Ġc : ĠColumn < String ?> ) Ġ= Ġif Ġ( p . value Ġ== Ġ" NULL ") Ġc . isNull () Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( p . op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< " Ġ-> Ġc Ġless Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġc Ġless Eq Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" >" Ġ-> Ġc Ġgreater Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġc Ġgreater Eq Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"~ " Ġ-> Ġc Ġlike Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"=" Ġ-> Ġc Ġeq Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġc Ġlike Ġ"% ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . value . replace ( Regex ("[ _% ] "), Ġ"[ \$ & ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} %" ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" comp Int Nullable ") ĊĠĠĠ Ġfun Ġcomp ( p : ĠQuery Split Part , Ġc : ĠColumn < Int ?> ) Ġ= Ġp . value . toInt OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( p . op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< " Ġ-> Ġc Ġless Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġc Ġless Eq Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" >" Ġ-> Ġc Ġgreater Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġc Ġgreater Eq Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġc Ġeq Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ?: Ġif Ġ( p . value Ġ== Ġ" NULL ") Ġ{ ĊĠĠĠĠĠĠĠ Ġc . isNull () ĊĠĠĠ Ġ} Ġelse ĠOp . FALSE ĊĊĠĠĠ Ġ@ Jvm Name (" comp DateTime Nullable ") ĊĠĠĠ Ġfun Ġcomp ( p : ĠQuery Split Part , Ġc : ĠColumn < DateTime ?> ) Ġ= Ġparse Time ( p . value )?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( p . op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< " Ġ-> Ġc Ġless Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġc Ġless Eq Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" >" Ġ-> Ġc Ġgreater Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġc Ġgreater Eq Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġc Ġless Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ?: Ġif Ġ( p . value Ġ== Ġ" NULL ") Ġ{ ĊĠĠĠĠĠĠĠ Ġc . isNull () ĊĠĠĠ Ġ} Ġelse ĠOp . FALSE ĊĊĠĠĠ Ġfun Ġcomp ( p : ĠQuery Split Part ): ĠOp < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġq Ġ= Ġcomp ( p , ĠNote Attr Table . value ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġp . key ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Note Attr Table . key Ġeq Ġun quote ( it )) Ġand Ġq ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ( q Ġor Ġcomp ( p , ĠTag Table . name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsplit By ( q : ĠString , Ġsplit ter : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġget Regex ( splitter ). to Pattern () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matcher ( q ) ĊĠĠĠĠĠĠĠ Ġval Ġmatches Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( m . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatches . add ( m . group ( 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmatches . toList (). filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Regex ( splitter : ĠString ): ĠRegex Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPattern . quote ( splitter ) ĊĠĠĠĠĠĠĠ Ġreturn ĠRegex (" (?: ^ |$ p )(( ?: \" (?: [^ \"] + )* \" |' (?: [^ '] + )* ' |[ ^ $ p ])+ )") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun quote ( s : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( s . length Ġ> Ġ 1 Ġ&& Ġs [ 0 ] Ġ== Ġ'"' Ġ&& Ġs [ s . length Ġ- Ġ 1 ] Ġ== Ġ'" ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġs . substring ( 1 , Ġs . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Time ( s : ĠString ): ĠDateTime ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRegex (" (? < sign > [- + ]) ?( ?< n > \\ d +( ?: \\. \\ d + )? )( ?< u >[ y wd h ]| min | mo )? ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. match Ent ire ( s )?. let Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Ġ= Ġm . groups [" sign "] ?. let Ġ{ Ġif ( it . value Ġ== Ġ"- ") Ġ- 1 Ġelse Ġ 1 Ġ} Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġ( m . groups [" u "] ?. let Ġ{ Ġwhen ( it . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" y " Ġ-> ĠDuration . standard Days ( 3 6 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" w " Ġ-> ĠDuration . standard Days ( 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" d " Ġ-> ĠDuration . standard Days ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" min " Ġ-> ĠDuration . standard Minutes ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mo " Ġ-> ĠDuration . standard Days ( 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDuration . standard Hours ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ} Ġ?: ĠDuration . standard Hours ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multipliedBy ( m . groups [" n "] !!. value . to Long () Ġ* Ġsign ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDateTime . now (). plus ( duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠRegex (" (? < y > \\ d { 4 }) [- /]( ?< mo > \\ d { 2 }) (?: [- /]( ?< d > \\ d { 2 })) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. match Ent ire ( s )?. let Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDateTime ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . groups [" y "] !!. value . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . groups [" mo "] !!. value . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . groups [" d "] ?. value ?. toInt () Ġ?: Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }