/* Ċ Ġ* Ġ( c ) ĠCopyright Ġ 2 0 2 1 Ġby ĠE inar ĠSa uk as . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ċ Ġ* ĠĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ċ Ġ* ĠĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ċ Ġ* ĠĠĠĠĠĠ Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* ĠĠĠĠ Ġ* ĠThe Ġname Ġof Ġits Ġauthor Ġmay Ġnot Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ċ Ġ* ĠĠĠĠĠĠ Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND Ċ Ġ* ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED Ċ Ġ* ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE Ċ Ġ* ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL Ġ< COPY RIGHT ĠHOLDER > ĠBE ĠLIABLE ĠFOR ĠANY Ċ Ġ* ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ċ Ġ* Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; Ċ Ġ* ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND Ċ Ġ* ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ċ Ġ* Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS Ċ Ġ* ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġzx 0 Ċ Ċ class ĠCompress or Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġoutput : ĠByteArray Ġ= ĠByteArray ( 0 ) ĊĠĠĠ Ġprivate Ġvar Ġoutput Index Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġinput Index Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġbit Index Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġbit Mask Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdiff Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdelta Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġback track Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġfun Ġread Bytes ( n : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinput Index Ġ+= Ġn ĊĠĠĠĠĠĠĠ Ġdiff Ġ+= Ġn ĊĠĠĠĠĠĠĠ Ġif Ġ( delta Ġ< Ġdiff ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Ġ= Ġdiff ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Byte ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput [ output Index ++] Ġ= Ġvalue . to Byte () ĊĠĠĠĠĠĠĠ Ġdiff -- ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Bit ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( back track ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ output Index Ġ- Ġ 1 ] Ġ= Ġ( output [ output Index Ġ- Ġ 1 ] Ġ+ Ġ 1 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback track Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bit Mask Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbit Mask Ġ= Ġ 1 2 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbit Index Ġ= Ġoutput Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ bit Index ] Ġ= Ġ( output [ bit Index ] Ġ+ Ġbit Mask ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit Mask Ġ= Ġbit Mask Ġshr Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Inter l aced E li as Gamma ( value : ĠInt , Ġbackwards Mode : ĠBoolean , Ġinvert Mode : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ<= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġi Ġshl Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġi Ġ= Ġi Ġshr Ġ 2 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bit ( if Ġ( back wards Mode ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bit ( if Ġ( invert Mode Ġ== Ġ( value Ġand Ġi Ġ== Ġ 0 )) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġi Ġshr Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwrite Bit ( if Ġ(! back wards Mode ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompress ( optimal : ĠBlock , Ġinput : ĠByteArray , Ġskip : ĠInt , Ġbackwards Mode : ĠBoolean , Ġinvert Mode : ĠBoolean ): ĠPair < ByteArray , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Offset Ġ= ĠINITIAL _ OFFSET ĊĊĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġand Ġallocate Ġoutput Ġbuffer ĊĠĠĠĠĠĠĠ Ġoutput Ġ= ĠByteArray (( optimal . bits Ġ+ Ġ 2 5 ) Ġ/ Ġ 8 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġun - reverse Ġoptimal Ġsequence ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent : ĠBlock ? Ġ= Ġoptimal ĊĠĠĠĠĠĠĠ Ġvar Ġprev : ĠBlock ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġcurrent . chain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . chain Ġ= Ġprev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġinitialize Ġdata ĊĠĠĠĠĠĠĠ Ġdiff Ġ= Ġoutput . size Ġ- Ġinput . size Ġ+ Ġskip ĊĠĠĠĠĠĠĠ Ġdelta Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinput Index Ġ= Ġskip ĊĠĠĠĠĠĠĠ Ġoutput Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġbit Mask Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġback track Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// Ġgenerate Ġoutput ĊĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġprev !!. chain ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġcurrent . index Ġ- Ġprev !!. index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( current . offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġliterals Ġindicator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bit ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġliterals Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Inter l aced E li as Gamma ( length , Ġbackwards Mode , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġliterals Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( input [ input Index ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Bytes ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Offset Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġfrom Ġlast Ġoffset Ġindicator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bit ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġfrom Ġlast Ġoffset Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Inter l aced E li as Gamma ( length , Ġbackwards Mode , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Bytes ( length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġfrom Ġnew Ġoffset Ġindicator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bit ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġfrom Ġnew Ġoffset ĠM SB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Inter l aced E li as Gamma (( current . offset Ġ- Ġ 1 ) Ġ/ Ġ 1 2 8 Ġ+ Ġ 1 , Ġbackwards Mode , Ġinvert Mode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġfrom Ġnew Ġoffset ĠL SB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte (( if Ġ( back wards Mode ) Ġ( current . offset Ġ- Ġ 1 ) Ġ% Ġ 1 2 8 Ġelse Ġ 1 2 7 Ġ- Ġ(( current . offset Ġ- Ġ 1 ) Ġ% Ġ 1 2 8 ))* 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġfrom Ġnew Ġoffset Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback track Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Inter l aced E li as Gamma ( length Ġ- Ġ 1 , Ġbackwards Mode , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Bytes ( length ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Offset Ġ= Ġcurrent . offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . chain ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġend Ġmarker ĊĠĠĠĠĠĠĠ Ġwrite Bit ( 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Inter l aced E li as Gamma ( 2 5 6 , Ġbackwards Mode , Ġinvert Mode ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( output , Ġdelta ) ĊĠĠĠ Ġ} Ċ }