/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . google . android . ex op layer 2 . extractor . iv f Ċ Ċ import Ġcom . google . android . ex op layer 2 . C Ċ import Ġcom . google . android . ex op layer 2 . Parser Exception Ċ import Ġcom . google . android . ex op layer 2 . extractor . Extractor Input Ċ import Ġcom . google . android . ex op layer 2 . extractor . iv f . bean .* Ċ import Ġcom . google . android . ex op layer 2 . util . Par s able ByteArray Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠProvides Ġmethods Ġthat Ġpeek Ġdata Ġfrom Ġan Ġ[ Extractor Input ] Ġand Ġreturn Ġwhether Ġthe Ġinput Ċ Ġ* Ġappears Ġto Ġbe Ġin ĠMP 4 Ġformat . Ċ Ġ*/ Ċ /* Ġpackage Ġ*/ Ċ internal Ġobject ĠIV FS n iffer Ġ{ ĊĠĠĠ Ġ/** ĠBrand Ġstored Ġin Ġthe Ġf typ Ġatom Ġfor ĠQuick Time Ġmedia . Ġ Ġ*/ ĊĠĠĠ Ġconst Ġval ĠB RAND _ QU ICK TIME Ġ= Ġ 0 x 7 1 7 4 2 0 2 0 ĊĊĠĠĠ Ġ/** ĠBrand Ġstored Ġin Ġthe Ġf typ Ġatom Ġfor ĠHE IC Ġmedia . Ġ Ġ*/ ĊĠĠĠ Ġconst Ġval ĠB RAND _ HE IC Ġ= Ġ 0 x 6 8 6 5 6 9 6 3 ĊĊĠĠĠ Ġ/** ĠThe Ġmaximum Ġnumber Ġof Ġbytes Ġto Ġpeek Ġwhen Ġsn iff ing . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠSEARCH _ LENGTH Ġ= Ġ 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠ Ġprivate Ġval ĠCOMP AT IBLE _ B RAN DS Ġ= Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠ 0 x 6 9 7 3 6 f 6 d , Ġ Ġ// Ġis om ĊĠĠĠĠĠĠĠĠ 0 x 6 9 7 3 6 f 3 2 , Ġ Ġ// Ġiso 2 ĊĠĠĠĠĠĠĠĠ 0 x 6 9 7 3 6 f 3 3 , Ġ Ġ// Ġiso 3 ĊĠĠĠĠĠĠĠĠ 0 x 6 9 7 3 6 f 3 4 , Ġ Ġ// Ġiso 4 ĊĠĠĠĠĠĠĠĠ 0 x 6 9 7 3 6 f 3 5 , Ġ Ġ// Ġiso 5 ĊĠĠĠĠĠĠĠĠ 0 x 6 9 7 3 6 f 3 6 , Ġ Ġ// Ġiso 6 ĊĠĠĠĠĠĠĠĠ 0 x 6 9 7 3 6 f 3 9 , Ġ Ġ// Ġiso 9 ĊĠĠĠĠĠĠĠĠ 0 x 6 1 7 6 6 3 3 1 , Ġ Ġ// Ġav c 1 ĊĠĠĠĠĠĠĠĠ 0 x 6 8 7 6 6 3 3 1 , Ġ Ġ// Ġh vc 1 ĊĠĠĠĠĠĠĠĠ 0 x 6 8 6 5 7 6 3 1 , Ġ Ġ// Ġhe v 1 ĊĠĠĠĠĠĠĠĠ 0 x 6 1 7 6 3 0 3 1 , Ġ Ġ// Ġav 0 1 ĊĠĠĠĠĠĠĠĠ 0 x 6 d 7 0 3 4 3 1 , Ġ Ġ// Ġmp 4 1 ĊĠĠĠĠĠĠĠĠ 0 x 6 d 7 0 3 4 3 2 , Ġ Ġ// Ġmp 4 2 ĊĠĠĠĠĠĠĠĠ 0 x 3 3 6 7 3 2 6 1 , Ġ Ġ// Ġ 3 g 2 a ĊĠĠĠĠĠĠĠĠ 0 x 3 3 6 7 3 2 6 2 , Ġ Ġ// Ġ 3 g 2 b ĊĠĠĠĠĠĠĠĠ 0 x 3 3 6 7 7 2 3 6 , Ġ Ġ// Ġ 3 gr 6 ĊĠĠĠĠĠĠĠĠ 0 x 3 3 6 7 7 3 3 6 , Ġ Ġ// Ġ 3 gs 6 ĊĠĠĠĠĠĠĠĠ 0 x 3 3 6 7 6 5 3 6 , Ġ Ġ// Ġ 3 ge 6 ĊĠĠĠĠĠĠĠĠ 0 x 3 3 6 7 6 7 3 6 , Ġ Ġ// Ġ 3 gg 6 ĊĠĠĠĠĠĠĠĠ 0 x 4 d 3 4 5 6 2 0 , Ġ Ġ// ĠM 4 V [ space ] ĊĠĠĠĠĠĠĠĠ 0 x 4 d 3 4 4 1 2 0 , Ġ Ġ// ĠM 4 A [ space ] ĊĠĠĠĠĠĠĠĠ 0 x 6 6 3 4 7 6 2 0 , Ġ Ġ// Ġf 4 v [ space ] ĊĠĠĠĠĠĠĠĠ 0 x 6 b 6 4 6 4 6 9 , Ġ Ġ// Ġk ddi ĊĠĠĠĠĠĠĠĠ 0 x 4 d 3 4 5 6 5 0 , Ġ Ġ// ĠM 4 VP ĊĠĠĠĠĠĠĠ ĠB RAND _ QU ICK TIME , Ġ Ġ// Ġqt [ space ][ space ] ĊĠĠĠĠĠĠĠĠ 0 x 4 d 5 3 4 e 5 6 , Ġ Ġ// ĠMS NV , ĠS ony ĠP SP ĊĠĠĠĠĠĠĠĠ 0 x 6 4 6 2 7 9 3 1 , Ġ Ġ// Ġd by 1 , ĠDol by ĠVision ĊĠĠĠĠĠĠĠĠ 0 x 6 9 7 3 6 d 6 c , Ġ Ġ// Ġis ml ĊĠĠĠĠĠĠĠĠ 0 x 7 0 6 9 6 6 6 6 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġdata Ġpeek ed Ġfrom Ġthe Ġcurrent Ġposition Ġin Ġ` input ` Ġis Ġconsistent Ġwith Ġthe ĊĠĠĠĠ Ġ* Ġinput Ġbeing Ġa Ġfragment ed ĠMP 4 Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĠThe Ġextractor Ġinput Ġfrom Ġwhich Ġto Ġpeek Ġdata . ĠThe Ġpeek Ġposition Ġwill Ġbe Ġmodified . ĊĠĠĠĠ Ġ* Ġ@ return ĠWhether Ġthe Ġinput Ġappears Ġto Ġbe Ġin Ġthe Ġfragment ed ĠMP 4 Ġformat . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠIf Ġan Ġerror Ġoccurs Ġreading Ġfrom Ġthe Ġinput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġsn iff Fragment ed ( input : ĠExtract or Input ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsn iff Internal ( input , Ġfragment ed Ġ= Ġtrue , Ġaccept He ic Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġdata Ġpeek ed Ġfrom Ġthe Ġcurrent Ġposition Ġin Ġ` input ` Ġis Ġconsistent Ġwith Ġthe ĊĠĠĠĠ Ġ* Ġinput Ġbeing Ġan Ġun fragment ed ĠMP 4 Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĠThe Ġextractor Ġinput Ġfrom Ġwhich Ġto Ġpeek Ġdata . ĠThe Ġpeek Ġposition Ġwill Ġbe Ġmodified . ĊĠĠĠĠ Ġ* Ġ@ return ĠWhether Ġthe Ġinput Ġappears Ġto Ġbe Ġin Ġthe Ġun fragment ed ĠMP 4 Ġformat . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠIf Ġan Ġerror Ġoccurs Ġreading Ġfrom Ġthe Ġinput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġsn iff Un fragment ed ( input : ĠExtract or Input ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsn iff Internal ( input , Ġ Ġ/* Ġfragment ed = Ġ*/ false , Ġ Ġ/* Ġaccept He ic = Ġ*/ false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġdata Ġpeek ed Ġfrom Ġthe Ġcurrent Ġposition Ġin Ġ` input ` Ġis Ġconsistent Ġwith Ġthe ĊĠĠĠĠ Ġ* Ġinput Ġbeing Ġan Ġun fragment ed ĠMP 4 Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĠThe Ġextractor Ġinput Ġfrom Ġwhich Ġto Ġpeek Ġdata . ĠThe Ġpeek Ġposition Ġwill Ġbe Ġmodified . ĊĠĠĠĠ Ġ* Ġ@ param Ġaccept He ic ĠWhether Ġ` true ` Ġshould Ġbe Ġreturned Ġfor ĠHE IC Ġphotos . ĊĠĠĠĠ Ġ* Ġ@ return ĠWhether Ġthe Ġinput Ġappears Ġto Ġbe Ġin Ġthe Ġun fragment ed ĠMP 4 Ġformat . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠIf Ġan Ġerror Ġoccurs Ġreading Ġfrom Ġthe Ġinput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġsn iff Un fragment ed ( input : ĠExtract or Input , Ġaccept He ic : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsn iff Internal ( input , Ġ Ġ/* Ġfragment ed = Ġ*/ false , Ġaccept He ic ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġsn iff Internal ( ĊĠĠĠĠĠĠĠ Ġinput : ĠExtract or Input , ĊĠĠĠĠĠĠĠ Ġfragment ed : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġaccept He ic : ĠBoolean ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Length Ġ= Ġinput . length ĊĠĠĠĠĠĠĠ Ġvar Ġbytes To Search Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( input Length Ġ== ĠC . LENGTH _ UN SET . to Long () Ġ|| Ġinput Length Ġ> ĠSEARCH _ LENGTH ) ĠSEARCH _ LENGTH Ġelse Ġinput Length ) Ġas ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠPar s able ByteArray ( 6 4 ) ĊĠĠĠĠĠĠĠ Ġvar Ġbytes Se ar ched Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( bytes Se ar ched Ġ< Ġbytes To Search ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġan Ġatom Ġheader . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġheader Size Ġ= ĠAtom . FULL _ HEADER _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . reset ( header Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġinput . peek Fully ( buffer . data , Ġ 0 , Ġheader Size , Ġ Ġ/* Ġallow EndOf Input = Ġ*/ true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe 've Ġreached Ġthe Ġend Ġof Ġthe Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġatom Size Ġ= Ġbuffer . read Unsigned Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġatom Type Ġ= Ġbuffer . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( atom Size Ġ== ĠAtom . DEFIN ES _ LARGE _ SIZE . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġlarge Ġatom Ġsize . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Size Ġ= ĠAtom . LONG _ HEADER _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . peek Fully ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . data , ĠAtom . FULL _ HEADER _ SIZE , ĠAtom . LONG _ HEADER _ SIZE Ġ- ĠAtom . FULL _ HEADER _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . set Limit ( Atom . LONG _ HEADER _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatom Size Ġ= Ġbuffer . read Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( atom Size Ġ== ĠAtom . EXT END S _ TO _ END _ SIZE . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġatom Ġextends Ġto Ġthe Ġend Ġof Ġthe Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile End Position Ġ= Ġinput . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file End Position Ġ!= ĠC . LENGTH _ UN SET . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatom Size Ġ= Ġfile End Position Ġ- Ġinput . peek Position Ġ+ Ġheader Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( atom Size Ġ< Ġheader Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġfile Ġis Ġinvalid Ġbecause Ġthe Ġatom Ġsize Ġis Ġtoo Ġsmall Ġfor Ġits Ġheader . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Se ar ched Ġ+= Ġheader Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( atom Type Ġ== ĠAtom . TYPE _ iv fh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse IV FH ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse IV FH ( input : ĠExtract or Input ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenter Reading Atom Header State () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( parser State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ READ ING _ ATOM _ HEADER Ġ-> Ġif Ġ(! read Atom Header ( input )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ READ ING _ ATOM _ PAYLOAD Ġ-> Ġread Atom Payload ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠParser Ġstates . ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ READ ING _ ATOM _ HEADER Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ READ ING _ ATOM _ PAYLOAD Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ READ ING _ END Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġvar Ġparser State Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġatom Type Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġatom Size : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġatom Header Bytes Read Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġatom Data : ĠPar s able ByteArray ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġatom Header : ĠPar s able ByteArray Ġ= ĠPar s able ByteArray ( Atom . LONG _ HEADER _ SIZE ) ĊĠĠĠ Ġprivate Ġval Ġcontainer Atoms : ĠArray Deque < Atom . Container Atom > Ġ= ĠArray Deque () ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread Atom Header ( input : ĠExtract or Input ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( input . position Ġ>= Ġinput . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( atom Header Bytes Read Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġstandard Ġlength Ġatom Ġheader . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! input . read Fully ( atom Header . data , Ġ 0 , ĠAtom . FULL _ HEADER _ SIZE , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatom Header Bytes Read Ġ= ĠAtom . FULL _ HEADER _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatom Header . position Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatom Size Ġ= Ġatom Header . read Unsigned Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatom Type Ġ= Ġatom Header . readInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( atom Size Ġ== ĠAtom . DEFIN ES _ LARGE _ SIZE . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġlarge Ġsize . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Bytes Remaining Ġ= ĠAtom . LONG _ HEADER _ SIZE Ġ- ĠAtom . FULL _ HEADER _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . read Fully ( atom Header . data , ĠAtom . FULL _ HEADER _ SIZE , Ġheader Bytes Remaining ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatom Header Bytes Read Ġ+= Ġheader Bytes Remaining ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatom Size Ġ= Ġatom Header . read Unsigned Long To Long () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( atom Size Ġ== ĠAtom . EXT END S _ TO _ END _ SIZE . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġatom Ġextends Ġto Ġthe Ġend Ġof Ġthe Ġfile . ĠNote Ġthat Ġif Ġthe Ġatom Ġis Ġwithin Ġa Ġcontainer Ġwe Ġcan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwork Ġout Ġits Ġsize Ġeven Ġif Ġthe Ġinput Ġlength Ġis Ġunknown . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġend Position Ġ= Ġinput . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Position Ġ== ĠC . LENGTH _ UN SET . to Long () Ġ&& Ġ! container Atoms . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Position Ġ= Ġcontainer Atoms . peek ()?. end Position Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Position Ġ!= ĠC . LENGTH _ UN SET . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatom Size Ġ= Ġend Position Ġ- Ġinput . position Ġ+ Ġatom Header Bytes Read ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( atom Size Ġ< Ġatom Header Bytes Read ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParser Exception (" Atom Ġsize Ġless Ġthan Ġheader Ġlength Ġ( unsupported ). ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġatom Position Ġ= Ġinput . position Ġ- Ġatom Header Bytes Read ĊĊĠĠĠĠĠĠĠ Ġif Ġ( atom Type Ġ== ĠAtom . TYPE _ iv fh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Position Ġ= Ġinput . position Ġ+ Ġatom Size Ġ- ĠAtom . FULL _ HEADER _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Atoms . push ( Atom . Container Atom ( atom Type , Ġend Position )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( atom Size Ġ== Ġatom Header Bytes Read . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Atom Ended ( end Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġreading Ġthe Ġfirst Ġchild Ġatom . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenter Reading Atom Header State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( should Parse Leaf Atom ( atom Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( atom Header Bytes Read Ġ!= ĠAtom . FULL _ HEADER _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParser Exception (" Leaf Ġatom Ġdefines Ġextended Ġatom Ġsize Ġ( unsupported ). ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( atom Size Ġ> ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParser Exception (" Leaf Ġatom Ġwith Ġlength Ġ> Ġ 2 1 4 7 4 8 3 6 4 7 Ġ( unsupported ). ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġatom Data Ġ= ĠPar s able ByteArray ( atom Size . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( atom Header . data , Ġ 0 , Ġatom Data . data , Ġ 0 , ĠAtom . FULL _ HEADER _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . atom Data Ġ= Ġatom Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparser State Ġ= ĠSTATE _ READ ING _ ATOM _ PAYLOAD ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( atom Size Ġ> ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParser Exception (" Skipping Ġatom Ġwith Ġlength Ġ> Ġ 2 1 4 7 4 8 3 6 4 7 Ġ( unsupported ). ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatom Data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparser State Ġ= ĠSTATE _ READ ING _ ATOM _ PAYLOAD ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Parser Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess Atom Ended ( atom End Position : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! container Atoms . isEmpty () Ġ&& Ġcontainer Atoms . peek ()?. end Position Ġ== Ġatom End Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Container Atom Read ( container Atoms . pop ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġenter Reading Atom Header State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Parser Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġon Leaf Atom Read ( leaf : ĠAtom . Leaf Atom , Ġinput Position : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! container Atoms . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Atoms . peek ()?. add ( leaf ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġif lt : ĠIV F File Lookup Table Box ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġiv fi : ĠIV F Init Box ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġiv fm : ĠIV F Meta Box ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġid fi List : ĠArrayList < IV F Data File Index Box > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġval Ġim fi List : ĠArrayList < IV F Media File Index Box > Ġ= ĠArrayList () ĊĊĠĠĠ Ġ@ Throws ( Parser Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġon Container Atom Read ( container : ĠAtom . Container Atom ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( container . type Ġ== ĠAtom . TYPE _ iv fh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġim fi List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid fi List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv fi Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif lt Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv fm Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . leaf Children . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAtom . TYPE _ if lt Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif lt Ġ= Ġparse IF LT ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAtom . TYPE _ id fi Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid fi List . add ( parse ID FI ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAtom . TYPE _ im fi Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġim fi List . add ( parse IM FI ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAtom . TYPE _ iv fi Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv fi Ġ= Ġparse IV FI ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAtom . TYPE _ iv fm Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv fm Ġ= Ġparse IV FM ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! container Atoms . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Atoms . peek ()?. add ( container ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse IV FM ( atom : ĠAtom . Leaf Atom ): ĠIV F Meta Box Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġatom . data ĊĠĠĠĠĠĠĠ Ġdata . position Ġ= ĠAtom . FULL _ HEADER _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġiv f Meta Box Ġ= ĠIV F Meta Box ( atom . type ) ĊĠĠĠĠĠĠĠ Ġiv f Meta Box . meta Count Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġiv f Meta Box . meta Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġdata . read Null Terminated String () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġdata . read Null Terminated String () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv f Meta Box . entries [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġiv f Meta Box ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§£æŀĲ im fi Ġ ĠIV F ĠMedia ĠFile ĠIndex ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse IM FI ( atom : ĠAtom . Leaf Atom ): ĠIV F Media File Index Box Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġatom . data ĊĠĠĠĠĠĠĠ Ġdata . position Ġ= ĠAtom . HEADER _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= ĠAtom . parse Full Atom Version ( data . readInt ()) ĊĠĠĠĠĠĠĠ Ġval Ġiv f Media File Index Box Ġ= ĠIV F Media File Index Box ( atom . type ) ĊĠĠĠĠĠĠĠ Ġiv f Media File Index Box . fileName Ġ= Ġdata . read Null Terminated String () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġiv f Media File Index Box . mime Ġ= Ġdata . read Null Terminated String () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġiv f Media File Index Box . header Index Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠ Ġiv f Media File Index Box . time Scale Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠ Ġiv f Media File Index Box . index Count Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġiv f Media File Index Box . index Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġif Ġ( version Ġ== Ġ 0 ) Ġdata . readInt (). to Long () Ġelse Ġdata . read Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv f Media File Index Box . entries [ index ] Ġ= Ġduration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġiv f Media File Index Box ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§£æŀĲ id fi ĠIV F ĠData ĠFile ĠIndex Ġbox ï¼Į æĸĩä»¶ åĲį ä¸İ ĠI FLT Ġ ç´¢å¼ķ æĺłå°Ħ åħ³ç³» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse ID FI ( atom : ĠAtom . Leaf Atom ): ĠIV F Data File Index Box Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġatom . data ĊĠĠĠĠĠĠĠ Ġdata . position Ġ= ĠAtom . FULL _ HEADER _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġiv f Data File Index Box Ġ= ĠIV F Data File Index Box ( atom . type ) ĊĠĠĠĠĠĠĠ Ġiv f Data File Index Box . fileName Ġ= Ġdata . read Null Terminated String () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġiv f Data File Index Box . mime Ġ= Ġdata . read Null Terminated String () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġiv f Data File Index Box . index Count Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġiv f Data File Index Box . index Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv f Data File Index Box . entries . append ( index , Ġdata . readInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġiv f Data File Index Box ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§£æŀĲ iv fi ĠIV F ĠInit ĠBox ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse IV FI ( atom : ĠAtom . Leaf Atom ): ĠIV F Init Box Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġatom . data ĊĠĠĠĠĠĠĠ Ġdata . position Ġ= ĠAtom . FULL _ HEADER _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġiv f Init Box Ġ= ĠIV F Init Box ( atom . type ) ĊĠĠĠĠĠĠĠ Ġiv f Init Box . init Script FileName Ġ= Ġdata . read Null Terminated String () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġiv f Init Box . config FileName Ġ= Ġdata . read Null Terminated String () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġreturn Ġiv f Init Box ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§£æŀĲ if lt Ġ ĠIV F ĠFile ĠLook - up ĠTable Ġbox ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse IF LT ( atom : ĠAtom . Leaf Atom ): ĠIV F File Lookup Table Box Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġatom . data ĊĠĠĠĠĠĠĠ Ġdata . position Ġ= ĠAtom . HEADER _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= ĠAtom . parse Full Atom Version ( data . readInt ()) ĊĠĠĠĠĠĠĠ Ġval Ġiv f File Lookup Table Box Ġ= ĠIV F File Lookup Table Box ( atom . type ) ĊĠĠĠĠĠĠĠ Ġiv f File Lookup Table Box . entry Count Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġiv f File Lookup Table Box . entry Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġif Ġ( version Ġ== Ġ 0 ) Ġdata . readInt (). to Long () Ġelse Ġdata . read Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġif Ġ( version Ġ== Ġ 0 ) Ġdata . readInt (). to Long () Ġelse Ġdata . read Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv f File Lookup Table Box . entries [ offset ] Ġ= Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġiv f File Lookup Table Box ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread Atom Payload ( input : ĠExtract or Input ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġatom Payload Size Ġ= Ġatom Size . toInt () Ġ- Ġatom Header Bytes Read ĊĠĠĠĠĠĠĠ Ġval Ġatom Data Ġ= Ġatom Data ĊĠĠĠĠĠĠĠ Ġif Ġ( atom Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . read Fully ( atom Data . data , ĠAtom . FULL _ HEADER _ SIZE , Ġatom Payload Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Leaf Atom Read ( Atom . Leaf Atom ( atom Type , Ġatom Data ), Ġinput . position ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . skip Fully ( atom Payload Size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprocess Atom Ended ( input . position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenter Reading Atom Header State () Ġ{ ĊĠĠĠĠĠĠĠ Ġparser State Ġ= ĠSTATE _ READ ING _ ATOM _ HEADER ĊĠĠĠĠĠĠĠ Ġatom Header Bytes Read Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Parse Leaf Atom ( atom Type : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġatom Type Ġ== ĠAtom . TYPE _ iv fi Ġ|| Ġatom Type Ġ== ĠAtom . TYPE _ iv fm Ġ|| Ġatom Type Ġ== ĠAtom . TYPE _ if lt Ġ|| Ġatom Type Ġ== ĠAtom . TYPE _ id fi Ġ|| Ġatom Type Ġ== ĠAtom . TYPE _ im fi ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġ` brand ` Ġis Ġan Ġf typ Ġatom Ġbrand Ġthat Ġis Ġcompatible Ġwith Ġthe ĠMP 4 Ġextract ors . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Compatible Brand ( brand : ĠInt , Ġaccept He ic : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( brand Ġ ush r Ġ 8 Ġ== Ġ 0 x 0 0 3 3 6 7 7 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBrand Ġstarts Ġwith Ġ' 3 gp '. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( brand Ġ== ĠB RAND _ HE IC Ġ&& Ġaccept He ic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( compatible Brand Ġin ĠCOMP AT IBLE _ B RAN DS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compatible Brand Ġ== Ġbrand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ }