package Ġde . trusted . anchor . server . service . proof Ċ Ċ import Ġde . trusted . anchor . server . base . Binary Helper Ċ import Ġorg . bouncycastle . util . en coders . Hex Ċ import Ġjava . io . Random Access File Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠĠ 1 , ĠĠ 2 Ġ= Ġ 0 Ċ Ġ* ĠĠ 3 , ĠĠ 4 Ġ= Ġ 1 Ċ Ġ* ĠĠ 5 , ĠĠ 6 Ġ= Ġ 3 Ċ Ġ* ĠĠ 7 , ĠĠ 8 Ġ= Ġ 4 Ċ Ġ* ĠĠ 9 , Ġ 1 0 Ġ= Ġ 7 Ċ Ġ* Ġ 1 1 , Ġ 1 2 Ġ= Ġ 8 Ċ Ġ* Ġ 1 3 , Ġ 1 4 Ġ= Ġ 1 0 Ċ Ġ* Ġ 1 5 , Ġ 1 6 Ġ= Ġ 1 1 Ċ Ġ* Ġ 1 7 , Ġ 1 8 Ġ= Ġ 1 5 Ċ Ġ* Ġ 1 9 , Ġ 2 0 Ġ= Ġ 1 6 Ċ Ġ* Ġ 2 1 , Ġ 2 2 Ġ= Ġ 1 8 Ċ Ġ* Ġ 2 3 , Ġ 2 4 Ġ= Ġ 1 9 Ċ Ġ* Ġ 2 5 , Ġ 2 6 Ġ= Ġ 2 2 Ċ Ġ* Ġ 2 7 , Ġ 2 8 Ġ= Ġ 2 3 Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* Ġin kl . ĠK not en Ċ Ġ* ĠĠ 1 , ĠĠ 2 Ġ= Ġ 0 Ċ Ġ* ĠĠ 3 , ĠĠ 4 Ġ= Ġ 3 Ċ Ġ* ĠĠ 5 , ĠĠ 6 Ġ= Ġ 7 Ċ Ġ* ĠĠ 7 , ĠĠ 8 Ġ= Ġ 1 0 Ċ Ġ* ĠĠ 9 , Ġ 1 0 Ġ= Ġ 1 5 Ċ Ġ* Ġ 1 1 , Ġ 1 2 Ġ= Ġ 1 8 Ċ Ġ* Ġ 1 3 , Ġ 1 4 Ġ= Ġ 2 2 Ċ Ġ* Ġ 1 5 , Ġ 1 6 Ġ= Ġ 1 1 Ċ Ġ* Ġ 1 7 , Ġ 1 8 Ġ= Ġ 1 5 Ċ Ġ* Ġ 1 9 , Ġ 2 0 Ġ= Ġ 1 6 Ċ Ġ* Ġ 2 1 , Ġ 2 2 Ġ= Ġ 1 8 Ċ Ġ* Ġ 2 3 , Ġ 2 4 Ġ= Ġ 1 9 Ċ Ġ* Ġ 2 5 , Ġ 2 6 Ġ= Ġ 2 2 Ċ Ġ* Ġ 2 7 , Ġ 2 8 Ġ= Ġ 2 3 Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠĠ 1 , ĠĠ 2 Ġ= Ġ 0 Ċ Ġ* ĠĠ 5 , ĠĠ 6 Ġ= Ġ 3 Ċ Ġ* ĠĠ 9 , Ġ 1 0 Ġ= Ġ 7 Ċ Ġ* Ġ 1 3 , Ġ 1 4 Ġ= Ġ 1 0 Ċ Ġ* Ġ 1 7 , Ġ 1 8 Ġ= Ġ 1 5 Ċ Ġ* Ġ 2 1 , Ġ 2 2 Ġ= Ġ 1 8 Ċ Ġ* Ġ 2 5 , Ġ 2 6 Ġ= Ġ 2 2 Ċ Ġ*/ ĊĊ Ċ class ĠIncrement al Proof Reader ( filepath : ĠString ) Ġ: ĠAuto Closeable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġr af Ġ= ĠRandom Access File ( filepath , Ġ" r ") ĊĠĠĠ Ġprivate Ġval ĠappName Buffer Ġ= ĠByteArray ( 8 ) ĊĠĠĠ Ġprivate Ġval Ġhash Buffer Ġ= ĠByteArray ( 3 2 ) ĊĊĠĠĠ Ġprivate Ġvar Ġread Pointer : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmax Full tree Width Ġ= Ġread Hash Count () ĊĊĠĠĠ Ġval Ġread Hashes : ĠMutable List < Hash Value > Ġ= ĠLinkedList () ĊĊĠĠĠ Ġfun Ġread Next Hash (): ĠHash Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġread Hash () ĊĠĠĠĠĠĠĠ Ġread Hashes . add ( hash ) ĊĠĠĠĠĠĠĠ Ġif Ġ(++ read Pointer Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Binary Helper . is Power Of Two ( read Pointer )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Pro ofs Recursive ( read Pointer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubtree Width Ġ= ĠBinary Helper . find Big gest Binary Tree ( read Pointer Ġ- Ġmax Full tree Width , Ġmax Full tree Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Pro ofs Recursive ( sub tree Width Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhash ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Last Pro ofs () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile length Ġ= Ġr af . length () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( raf . file Pointer Ġ< Ġ( file length Ġ- Ġ 3 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Hashes . add ( read Proof ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġread Pointer Ġ< Ġmax Full tree Width ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Pro ofs Recursive ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġread Hashes . add ( read Proof ()) ĊĠĠĠĠĠĠĠ Ġread Pro ofs Recursive ( value Ġ/ Ġ 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġr af . seek ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Proof Head (): ĠPro of Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 2 Ġbyte Ġhash Ġ+ Ġ 4 Ġbyte Ġsize ĊĠĠĠĠĠĠĠ Ġr af . seek ( raf . length () Ġ- Ġ 3 6 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġread Proof () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Hash Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġr af . seek ( raf . length () Ġ- Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġhash Count Ġ= Ġr af . readInt () ĊĠĠĠĠĠĠĠ Ġr af . seek ( 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġhash Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Hash (): ĠHash Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsum Ġof Ġbytes : Ġ 8 Ġ+ Ġ 8 Ġ+ Ġ 4 Ġ+ Ġ 3 2 Ġ= Ġ 5 2 ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġr af . read Long () ĊĠĠĠĠĠĠĠ Ġr af . read ( appName Buffer ) ĊĠĠĠĠĠĠĠ Ġval Ġevent Id Ġ= Ġr af . readInt () ĊĠĠĠĠĠĠĠ Ġr af . read ( hash Buffer ) ĊĠĠĠĠĠĠĠ Ġreturn ĠHash ( id , ĠString ( appName Buffer , ĠStandard Charsets . US _ ASCII ), Ġevent Id , Ġhash Buffer . clone ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Proof (): ĠPro of Ġ{ ĊĠĠĠĠĠĠĠ Ġr af . read ( hash Buffer ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPro of ( hash Buffer . clone ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġr af . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠHash ( ĊĠĠĠ Ġval Ġid : ĠLong , ĊĠĠĠ Ġval ĠappName : ĠString , ĊĠĠĠ Ġval Ġevent Id : ĠInt , ĊĠĠĠ Ġoverride Ġval Ġhash : ĠByteArray Ċ ) Ġ: ĠHash Value Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Hash ( id =$ id , ĠappName ='$ appName ', Ġevent Id =$ eventId , Ġhash =${ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( Hex . encode ( hash ), ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġ}) " ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠPro of ( ĊĠĠĠ Ġoverride Ġval Ġhash : ĠByteArray Ċ ) Ġ: ĠHash Value Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Proof ( hash =${ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( Hex . encode ( hash ), ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġ}) " ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠHash Value Ġ{ ĊĠĠĠ Ġval Ġhash : ĠByteArray Ċ }