package Ġme . anno . mesh . sim s Ċ Ċ import Ġme . anno . io . files . File Reference . Companion . getReference Ċ import Ġme . anno . io . files . Signature Ċ import Ġme . anno . utils . OS Ċ import Ġme . anno . utils . OS . desktop Ċ import Ġorg . apache . logging . log 4 j . Log Manager Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ Ċ object ĠSim s 3 Reader Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠLOGGER Ġ= ĠLog Manager . getLogger ( Sim s 3 Reader :: class ) ĊĊĠĠĠ Ġ// Ġit Ġwould Ġbe Ġinteresting Ġto Ġread Ġfiles Ġfrom Ġthe ĠSim s ĊĠĠĠ Ġ// Ġa ) Ġwe Ġcould Ġsupport Ġexisting Ġcustom Ġcontent ĊĠĠĠ Ġ// Ġb ) Ġwe Ġcould Ġsupport Ġmeshes Ġfrom ĠThe ĠSim s Ġ-> Ġn ah , Ġtoo Ġmany ĠGB Ġto Ġread , Ġand Ġit 's Ġpretty Ġcomplex Ġany ways ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġextensions : ĊĠĠĠĠĠĠĠ Ġ// Ġ. package Ġ= Ġgeneral Ġcollection ĊĠĠĠĠĠĠĠ Ġ// Ġ. world Ġ= Ġworld ĊĠĠĠĠĠĠĠ Ġ// Ġ. dbc Ġ= Ġcollection Ġof Ġarch ives Ġin Ġsingle Ġfile ĊĊĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= Ġget Reference ( OS . documents , Ġ" Electron ic ĠAr ts / Die ĠSim s Ġ 3 ") ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġref Ġ= Ġget Reference ( folder ," Thumb nails / Object Thumb nails . package ") ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġref Ġ= Ġget Reference ( folder , Ġ" S aves / F ior a . sim s 3 / Fr ance _ 0 x 0 8 5 9 db 5 0 . n hd ") ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġget Reference ( folder , Ġ" S aves / F ior a . sim s 3 / Fr ance _ 0 x 0 8 5 9 db 5 0 Export DB . package ") ĊĊĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġget Reference ( desktop , Ġ" Sim s ") ĊĠĠĠĠĠĠĠ Ġdst . try Mk dirs () ĊĠĠĠĠĠĠĠ Ġ// Ġdst . list Children ()?. map Ġ{ Ġit . delete () Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠDB PP Ġwould Ġbe Ġencrypted Ġdata ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġref . read ByteBuffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. order ( Byte Order . LIT TLE _ ENDIAN ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmagic Ġ= Ġinput . int ĊĠĠĠĠĠĠĠ Ġif Ġ( magic Ġ!= Ġb gra (' D ', Ġ' B ', Ġ' P ', Ġ' F ')) Ġthrow ĠIOException (" Incorrect Ġmagic : Ġ$ magic ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmajor Ġ= Ġinput . int ĊĠĠĠĠĠĠĠ Ġval Ġminor Ġ= Ġinput . int ĊĠĠĠĠĠĠĠ ĠLOGGER . info (" Version : Ġ$ major .$ minor ") ĊĊĠĠĠĠĠĠĠ Ġinput . skip ( 2 4 ) ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Entries Ġ= Ġinput . int ĊĠĠĠĠĠĠĠ Ġinput . skip ( 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Of Index InBytes Ġ= Ġinput . int ĊĠĠĠĠĠĠĠ Ġinput . skip ( 1 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġindex Version Ġ= Ġinput . int ĊĠĠĠĠĠĠĠ Ġif Ġ( index Version Ġ!= Ġ 3 ) ĠLOGGER . warn (" Unknown Ġindex Ġversion : Ġ$ index Version ") ĊĠĠĠĠĠĠĠ Ġval Ġindex Position Ġ= Ġinput . int ĊĊĠĠĠĠĠĠĠ ĠLOGGER . info ("# entries : Ġ$ numberOf Entries , Ġsize : Ġ$ size Of Index InBytes , Ġposition : Ġ$ index Position ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Position Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . position ( index Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Type Ġ= Ġinput . int ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġindex Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġheader Ġdefines Ġwhat Ġdata Ġis Ġthe Ġsame Ġfor Ġall Ġentries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġn Ġentries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĠIndex Header ( input , Ġindex Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinv Index Type Ġ= Ġindex Type . inv () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= ĠArray ( numberOf Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Entry ( input , Ġinv Index Type , Ġheader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( entries . max Of Ġ{ Ġit . mem Size Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . limit ( entry . chunk Offset Ġ+ Ġentry . file Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . position ( entry . chunk Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Buffer Ġ= Ġif Ġ( entry . compressed Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . compressed Ġ!= Ġ 0 xffff ) ĠLOGGER . warn (" Unexpected Ġvalue Ġfor Ġcompressed , Ġ${ entry . compressed } Ġ! in ĠlistOf ( 0 , Ġ 0 xffff )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . limit ( entry . mem Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun compress ( input , Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġcontent Ġnormally , Ġdoes Ġnot Ġhappen Ġin Ġour Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġextension Ġ= ĠSignature . find Name ( output Buffer ) Ġ?: Ġ" bin " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( 0 Ġuntil Ġoutput Buffer . remaining ()). all Ġ{ Ġoutput Buffer [ it ] Ġ== Ġ 0 . to Byte () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension Ġ= Ġ" null " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . compressed Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension Ġ= Ġ" c .$ extension " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref 2 Ġ= Ġget Reference ( dst , Ġentry . chunk Offset . toString ( 1 6 ) Ġ+ Ġ".$ extension ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref 2 . write Bytes ( output Buffer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttp :// sim sw iki . info / wiki . php ? title = Sim s _ 3 : Packed File Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġwhen Ġ( entry . resourceType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 AE 6 C 6 7 Ġ-> Ġ" bone " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 B 2 D 8 8 2 Ġ-> Ġ" dds " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 B 5 5 2 EA Ġ-> Ġ" speed Ġtree Ġresource " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 5 A 1 8 4 9 Ġ-> Ġ" body Ġgeometry " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 6 6 0 3 8 C Ġ-> Ġ" name Ġmap " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 6 6 1 2 3 3 Ġ-> Ġ" object Ġgeometry " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 A 5 2 7 DB Ġ-> Ġ" audio Ġsn r " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 D 0 E 7 5 D Ġ-> Ġ" material " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 D 0 E 7 6 B Ġ-> Ġ" skin " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 D 1 0 F 3 4 Ġ-> Ġ" object Ġlo ds " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 EE F 6 3 A Ġ-> Ġ" audio Ġsns Ġ( fx / music )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 0 1 9 9 7 2 Ġ-> Ġ" scene Ġgraph " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 1 D 7 E 8 C Ġ-> Ġ" speed Ġtree Ġdata " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 5 C 9 0 A 6 Ġ-> Ġ" css " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 5 C 9 5 B 6 Ġ-> Ġ" xml Ġfor Ġui " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 5 ED 6 F 4 Ġ-> Ġ" out fit Ġas Ġxml " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 9 E 3 3 3 B Ġ-> Ġ" voice Ġmix " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 C 9 EFF 2 Ġ-> Ġ" audio Ġsub mix " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 D 5 DF 1 3 Ġ-> Ġ" animation Ġsequences " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 DC 3 4 3 F Ġ-> Ġ" object Ġinformation Ġ( type , Ġscripts )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 3 2 6 0 E 3 Ġ-> Ġ" animation Ġtrack Ġmask " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 3 3 4 0 6 C Ġ-> Ġ" xml Ġresource , Ġincl . Ġtuning " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 3 A 1 4 3 5 Ġ-> Ġ" texture Ġcomp ositor " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 4 1 ACC 9 Ġ-> Ġ" fabric Ġcomp ositor " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 4 A EE CB Ġ-> Ġ" cas Ġpart Ġdata " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 5 4 7 9 6 A Ġ-> Ġ" skin Ġtone " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 5 5 5 BA 8 Ġ-> Ġ" hair Ġtone " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 5 5 E 0 A 6 Ġ-> Ġ" bone Ġdelta Ġ/ Ġslot Ġadjust s " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 5 8 B 0 8 A Ġ-> Ġ" face Ġbl ends " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 B 3 3 DD F Ġ-> Ġ" interaction Ġtuning Ġas Ġxml " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 B 4 C 6 1 D Ġ-> Ġ" params Ġfor Ġlight ing " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 D 8 4 3 C 2 Ġ-> Ġ" comp ositor Ġcache Ġentry " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 3 D 8 6 EA 4 Ġ-> Ġ" world Ġlot Ġinformation " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 1 8 FE 2 A Ġ-> Ġ" catalog Ġf ence " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġmany Ġmore ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" not Ġyet Ġregistered " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ type Ġ$ entry ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġconfirmed Ġto Ġwork Ġmostly Ġcorrect : ĊĠĠĠĠ Ġ* ĠI Ġhave Ġd ds Ġfiles , Ġwhich Ġwere Ġcorrectly Ġread ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġun compress ( input : ĠByteBuffer , Ġoutput : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġun compress Ġcontent ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġinput . get () Ġ// Ġ 0 x 1 0 Ġ/ Ġ 0 x 2 0 Ġ/ Ġ 0 x 8 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( input . get () Ġ!= Ġ 0 xF B . to Byte ()) Ġthrow ĠIOException (" Expected Ġ 0 xF B ") ĊĠĠĠĠĠĠĠ Ġinput . skip ( if Ġ( type . toInt (). has Flag ( 0 x 8 0 )) Ġ 4 Ġelse Ġ 3 ) Ġ// Ġfile Ġsize ĊĠĠĠĠĠĠĠ Ġwhile Ġ( input . has Remaining ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġcontrol Ġcharacter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġ 0 - 3 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġhow Ġmany Ġ/ Ġfrom Ġwhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġ 0 - n Ġchars Ġfrom Ġsource , Ġand Ġappend Ġto Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġ 0 - n Ġchars Ġfrom Ġsomewhere Ġin Ġoutput Ġto Ġend Ġof Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġinput . get (). toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Plain Text : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnum To Copy : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcopy Offset : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Ġ< Ġ 0 x 8 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte 1 Ġ= Ġinput . get (). toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Plain Text Ġ= Ġcontrol . and ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum To Copy Ġ= Ġ( control . and ( 0 x 1 c ) Ġshr Ġ 2 ) Ġ+ Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Offset Ġ= Ġ( control . and ( 0 x 6 0 ) Ġshl Ġ 3 ) Ġ+ Ġbyte 1 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Ġ< Ġ 0 xC 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte 1 Ġ= Ġinput . get (). toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte 2 Ġ= Ġinput . get (). toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Plain Text Ġ= Ġbyte 1 . and ( 0 xc 0 ). shr ( 6 ). and ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum To Copy Ġ= Ġcontrol . and ( 0 x 3 f ) Ġ+ Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Offset Ġ= Ġ( byte 1 . and ( 0 x 3 f ) Ġshl Ġ 8 ) Ġ+ Ġbyte 2 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Ġ< Ġ 0 xE 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb 1 Ġ= Ġinput . get (). toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb 2 Ġ= Ġinput . get (). toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb 3 Ġ= Ġinput . get (). toInt (). and ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Plain Text Ġ= Ġcontrol . and ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum To Copy Ġ= Ġ( control . and ( 0 xc ). sh l ( 6 )) Ġ+ Ġb 3 Ġ+ Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Offset Ġ= Ġcontrol . and ( 0 x 1 0 ). sh l ( 1 2 ) Ġ+ Ġb 1 . sh l ( 8 ) Ġ+ Ġb 2 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Ġ< Ġ 0 xFC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Plain Text Ġ= Ġcontrol . and ( 0 x 1 f ). sh l ( 2 ) Ġ+ Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum To Copy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Plain Text Ġ= Ġcontrol . and ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum To Copy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Plain Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . put ( input . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Offset Ġ= Ġ- copy Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 0 Ġ= Ġoutput . position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num To Copy Ġ+ Ġoutput . position () Ġ> Ġoutput . limit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum To Copy Ġ= Ġoutput . remaining () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum To Copy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . put ( output . get ( p 0 Ġ+ Ġcopy Offset Ġ+ Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn (" too Ġmany Ġbytes , Ġand Ġ${ input . remaining ()} Ġinput Ġbytes Ġremaining ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum To Copy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . put ( output . get ( p 0 Ġ+ Ġcopy Offset Ġ+ Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( output . has Remaining ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn (" Missing Ġ${ output . remaining ()} Ġbytes ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . flip () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠIndex Header ( val Ġinput : ĠByteBuffer , Ġval Ġmask : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresource Type : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 1 )) Ġinput . int Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġresource Group : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 2 )) Ġinput . int Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġinstance Hi : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 4 )) Ġinput . int Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġinstance Lo : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 8 )) Ġinput . int Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġchunk Offset : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 1 6 )) Ġinput . int Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠfileSize : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 3 2 )) Ġinput . int . and ( 0 x 7 fffffff ) Ġelse Ġ 0 Ġ// Ġhighest Ġbit Ġhas Ġunknown Ġmeaning ĊĠĠĠĠĠĠĠ Ġval Ġmem Size : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 6 4 )) Ġinput . int Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġcompressed : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 1 2 8 )) Ġinput . int . and ( 0 xffff ) Ġelse Ġ 0 Ġ// Ġhigh Ġpart Ġis Ġunknown ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠIndex Entry ( val Ġinput : ĠByteBuffer , Ġval Ġmask : ĠInt , Ġbase : ĠIndex Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresource Type : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 1 )) Ġinput . int Ġelse Ġbase . resourceType ĊĠĠĠĠĠĠĠ Ġval Ġresource Group : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 2 )) Ġinput . int Ġelse Ġbase . resource Group ĊĠĠĠĠĠĠĠ Ġval Ġinstance Hi : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 4 )) Ġinput . int Ġelse Ġbase . instance Hi ĊĠĠĠĠĠĠĠ Ġval Ġinstance Lo : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 8 )) Ġinput . int Ġelse Ġbase . instance Lo ĊĠĠĠĠĠĠĠ Ġval Ġchunk Offset : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 1 6 )) Ġinput . int Ġelse Ġbase . chunk Offset ĊĠĠĠĠĠĠĠ Ġval ĠfileSize : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 3 2 )) Ġinput . int . and ( 0 x 7 fffffff ) Ġelse Ġbase . file Size ĊĠĠĠĠĠĠĠ Ġval Ġmem Size : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 6 4 )) Ġinput . int Ġelse Ġbase . mem Size ĊĠĠĠĠĠĠĠ Ġval Ġcompressed : ĠInt Ġ= Ġif Ġ( mask . has Flag ( 1 2 8 )) Ġinput . int . and ( 0 xffff ) Ġelse Ġbase . compressed ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" type Ġ$ resourceType , Ġgroup : Ġ$ resource Group , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" i - hi : Ġ${ instance Hi . to UInt (). toString ( 1 6 )}, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" i - lo : Ġ${ instance Lo . to UInt (). toString ( 1 6 )}, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" offset : Ġ${ chunk Offset . toString ( 1 6 )}, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" file - size : Ġ$ file Size , Ġmem - size : Ġ$ mem Size , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" compressed : Ġ$ compressed " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Str ( i : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . shr ( 2 4 ). and ( 2 5 5 ). to Char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . shr ( 1 6 ). and ( 2 5 5 ). to Char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . shr ( 8 ). and ( 2 5 5 ). to Char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . and ( 2 5 5 ). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠInt . has Flag ( flag : ĠInt ) Ġ= Ġ( this Ġand Ġflag ) Ġ== Ġflag ĊĊĠĠĠ Ġfun ĠByteBuffer . skip ( n : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġposition ( position () Ġ+ Ġn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġb gra ( b : ĠChar , Ġg : ĠChar , Ġr : ĠChar , Ġa : ĠChar ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( a . code Ġshl Ġ 2 4 ) Ġor Ġ( r . code Ġshl Ġ 1 6 ) Ġor Ġ( g . code Ġshl Ġ 8 ) Ġor Ġb . code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġarg b ( a : ĠChar , Ġr : ĠChar , Ġg : ĠChar , Ġb : ĠChar ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( a . code Ġshl Ġ 2 4 ) Ġor Ġ( r . code Ġshl Ġ 1 6 ) Ġor Ġ( g . code Ġshl Ġ 8 ) Ġor Ġb . code ĊĠĠĠ Ġ} Ċ Ċ }