package Ġj dr . ex ia . model . dao Ċ Ċ import Ġj dr . ex ia . O LE BO _ VERSION _ CODE Ċ import Ġj dr . ex ia . localization . ST _ WARNING _ MISSING _ CONF _ FILES Ċ import Ġj dr . ex ia . localization . ST _ WARNING _ PREVIOUS _ VERSION _ FILE Ċ import Ġj dr . ex ia . localization . String Locale Ċ import Ġj dr . ex ia . main Ċ import Ġj dr . ex ia . system . O LE BO _ DIRECTORY Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util .* Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip File Ċ import Ġjava . util . zip . Zip OutputStream Ċ import Ġkotlin . io . path . Path Ċ import Ġkotlin . io . path . div Ċ import Ġkotlin . system . exit Process Ċ Ċ const Ġval ĠOLE BO _ MAN IFEST _ EXTENSION Ġ= Ġ" o _ manifest " Ċ const Ġval ĠOLE BO _ MAN IFEST _ NAME Ġ= Ġ" manifest .$ O LE BO _ MAN IFEST _ EXTENSION " Ċ Ċ /** Ċ Ġ* ĠGet Ġthe Ġpath Ġof ĠOle bo Ċ Ġ*/ Ċ val Ġjar Path : ĠString ĊĠĠĠ Ġget () Ġ= ĠFile (:: main :: class . java . protection Domain . code Source . location . to URI ()). absolute Path Ċ Ċ private Ġval ĠFile . property ĊĠĠĠ Ġget () Ġ= ĠProperties (). apply Ġ{ ĊĠĠĠĠĠĠĠ ĠinputStream (). use ( this :: load ) ĊĠĠĠ Ġ} Ċ Ċ suspend Ġfun Ġzip O le bo Directory ( file Destination : ĠFile ) Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġole bo Directory Ġ= ĠFile ( O LE BO _ DIRECTORY ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Temp Zip Ġ= ĠFile . create TempFile (" O le bo ", Ġ". ole bo ") ĊĊĠĠĠĠĠĠĠ ĠZip OutputStream ( Buffered OutputStream ( File OutputStream ( output Temp Zip ))). use Ġ{ Ġz os Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile . create TempFile (" o _ manifest _", Ġnull ). apply Ġfile @{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Property (" version ", ĠOLE BO _ VERSION _ CODE . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ file . output Stream (). use Ġ{ Ġstore ( it , Ġ"") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz os . put Next Entry ( Zip Entry ( O LE BO _ MAN IFEST _ NAME )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . inputStream (). use Ġ{ Ġit . copy To ( zos ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġole bo Directory . walk Top Down (). forEach Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip FileName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . absolute Path . remove Prefix ( ole bo Directory . absolute Path ). remove Prefix ( File . separator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ('\\ ', Ġ'/') ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( zip FileName . isNotBlank () Ġ&& Ġfile . name Without Extension Ġ!= Ġ" ole bo _ updater " Ġ&& Ġfile . extension Ġ!= ĠOLE BO _ MAN IFEST _ EXTENSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠZip Entry ("$ zip FileName ${ ( if Ġ( file . isDirectory ) Ġ"/" Ġelse Ġ"") }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz os . put Next Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . inputStream (). use Ġ{ Ġit . copy To ( zos ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file Destination . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Destination . delete Re cursively () ĊĊĠĠĠĠĠĠĠ Ġoutput Temp Zip . copy Re cursively ( file Destination ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġload O le bo Zip Data ( zip File : ĠFile ) Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ ĠZip File ( zip File ). use Ġ{ Ġzip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( zip . entries (). as Sequence (). toList ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . none Ġ{ Ġit . name Ġ== Ġ" db /${ DAO . DATABASE _ NAME }" Ġ} Ġ|| Ġthis . none Ġ{ Ġit . name Ġ== ĠOLE BO _ MAN IFEST _ NAME Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Catch ing ĠString Locale [ ST _ WARNING _ MISSING _ CONF _ FILES ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . find Ġ{ Ġit . name Ġ== ĠOLE BO _ MAN IFEST _ NAME Ġ} ?. let Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip . getInputStream ( entry ). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Version Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperties (). apply Ġ{ Ġload ( stream ) Ġ}. getProperty (" version ", Ġ 0 . toString ()). toInt OrNull () Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manifest Version Ġ>= ĠOLE BO _ VERSION _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Catch ing ĠString Locale [ ST _ WARNING _ PREVIOUS _ VERSION _ FILE ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . filter Ġ{ Ġit . name Ġ!= ĠOLE BO _ MAN IFEST _ NAME Ġ}. forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile String Ġ= Ġentry . name . remove Suffix ('/ '. toString ()). split ('/ '). let Ġ{ Ġsplit Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit Name . drop Last ( 1 ). join ToString ('/ '. toString ()). replace ('/', ĠFile . separator Char ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOLE BO _ DIRECTORY Ġ+ Ġit Ġ+ Ġ( if Ġ( it . isNotBlank ()) ĠFile . separator Ġelse Ġ"") Ġ+ Ġsplit Name . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( file String ). mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip . getInputStream ( entry ). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( file String ). output Stream (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . copy To ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġreset () Ġ= ĠFile ( O LE BO _ DIRECTORY ). let Ġ{ ĊĠĠĠ Ġif Ġ( it . exists ()) ĊĠĠĠĠĠĠĠ Ġit . delete Re cursively () ĊĠĠĠ Ġit . mkdir s () Ċ } Ċ Ċ fun Ġrestart ( status : ĠInt Ġ= Ġ 0 ): ĠNothing Ġ{ ĊĠĠĠ ĠRuntime . get Runtime (). exec ( Path ( jar Path ). parent . parent Ġ/ Ġ" O le bo . exe ") ĊĠĠĠ Ġexit Process ( status ) Ċ } Ċ Ċ private Ġfun ĠRuntime . exec ( path : ĠPath ): ĠProcess Ġ= Ġthis . exec ( path . toString ())