F      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  Safe-Inferred Safe-Inferredconverting list of bytes to  value unsynchronisation between s unsychronisation (just unSyncInteger . wordsToInteger)  converting  value to list of bytes synchronisation between s sychronisation (just integerToWords 4 . syncInteger)  Safe-Inferred           Safe-Inferred SIZE BYTES DThe ID3v2 tag size is stored as a 32 bit synchsafe integer (section I 6.2), making a total of 28 effective bits (representing up to 256MB). AThe ID3v2 tag size is the sum of the byte length of the extended D header, the padding and the frames after unsynchronisation. If a % footer is present this equals to (' total size' - 20) bytes, otherwise  (' total size' - 10) bytes. MEANING OF FLAGS   ) ID3v2 flags %abcd0000 EThe version is followed by the ID3v2 flags field, of which currently  four flags are used: a - Unsynchronisation  Bit 7 in the ' ID3v2 flags' indicates whether or not E unsynchronisation is applied on all frames (see section 6.1 for * details); a set bit indicates usage. b - Extended header >The second bit (bit 6) indicates whether or not the header is I followed by an extended header. The extended header is described in B section 3.2. A set bit indicates the presence of an extended  header. c - Experimental indicator $The third bit (bit 5) is used as an 'experimental indicator'. This H flag SHALL always be set when the tag is in an experimental stage. d - Footer present CBit 4 indicates that a footer (section 3.4) is present at the very C end of the tag. A set bit indicates the presence of a footer. EAll the other flags MUST be cleared. If one of these undefined flags E are set, the tag might not be readable for a parser that does not  know the flags function. id3v2 version  major version . revision number ID3v2 HEADER OVERVIEW DThe first part of the ID3v2 tag is the 10 byte tag header, laid out  as follows:    ID3v2/file identifier "ID3" ' ID3v2 version $04 00 * ID3v2 flags %abcd0000 * ID3v2 size 4 * %0xxxxxxx ,The first three bytes of the tag are always "ID3", to indicate that I this is an ID3v2 tag, directly followed by the two version bytes. The F first byte of ID3v2 version is its major version, while the second D byte is its revision number. In this case this is ID3v2.4.0. All G revisions are backwards compatible while major versions are not. If F software with ID3v2.4.0 and below support should encounter version 9 five or higher it should simply ignore the whole tag. id3v2 version: [major version, revision number] header flags as Bool values full size of tag  !"#  !"# !"# !"#  Safe-Inferred$EXTENDED HEADER OVERVIEW (optional) BThe extended header contains information that can provide further H insight in the structure of the tag, but is not vital to the correct @ parsing of the tag information; hence the extended header is  optional.   * Extended header size 4 * %0xxxxxxx $ Number of flag bytes $01 $ Extended Flags $xx  Where the 'Extended header size'# is the size of the whole extended H header, stored as a 32 bit synchsafe integer. An extended header can 3 thus never have a size of fewer than six bytes.  size of extended header  is this tag an update?  CRC data, if present  Are tag restrictions present? $, extFlags_ :: ExtFlags -- ^ flags >Forming empty value to return, if there is no Extended Header $    %&'()$%&'()$%&'() $    %&'() Safe-Inferred9*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a8*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aM*]ZXVUSRQPNKJIHGCB@=<;:98765410/-+^_[\[Y\W[YWT[OY\[OLMY[OY\[DEYFA>?A[O\23.,`a*J]ZXVUSRQPNKJIHGCB@=<;:98765410/-+^_[\[Y\W[YWT[OY\[OLMY[OY\[DEYFA>?A[O\23.,`a Safe-InferredhFrame status flags iFrame format flags l Frame Header n frame ID o frame Size p frame Flags t frame Header uframe Information Value 9bcdefghijklmnopqrstuvwxyz{|}~0bcdefghijklmnopqrstuvwxyz{|}~0rstuvwxyzqlmnop{|}~kjfghidebc-bcdefghijklmnopqrstuvwxyz{|}~ Safe-Inferred None(Parsers state flags from tag' s header current position in tag ' , frFlags :: [Bool]} -- ^ current frame flags current frame size ,Just a synonim for one item of input stream Returns  from . Updates  with given function. Sets  with given value.  Decrements .  Incremets . Returns  from . Updates  with given function. Sets  with given value.  Decrements .  Incremets .  Wrapper for  reiterative parsers.  Mnemonic: if  > 0 then continue else stop Wrapper for atomic parsers.  Increases  and decreases .  p2 parses a list of elements with individual parser p. = Cannot fail, since an empty list is a valid return value.  Unlike default many , stops if  became 0. !Parse a non-empty list of items.  p end% parses a possibly-empty sequence of p's, terminated by a end.  'manyTill1\' p end'! parses a non-empty sequence of p's, terminated by a end. 3Parse a list of items separated by discarded junk. =Parse a non-empty list of items separated by discarded junk. ' count n p'G parses a precise number of items, n, using the parser p, in sequence.  n p'G parses a precise number of items, n, using the parser p, in sequence.  Hybrid of  and  'sepBy\'' Parses one value (as [Token]) till termination symbol Parses a character-encoding code0, a one-byte value that should be 0, 1, 2, or 3 %Parses one value and returns it as a  %Parses one value and returns it as a  CParses 3 bytes of language value (as a String) and returns a pair (Language , value) Takes a list of  s and applies them by turns.  Parses given . Parses given list of s.  Parses given  ByteString. Same as  but argument is simple . Parses upper-case letters (as ) Parses digit-symbol (as )  Parses any . 'parseSize n unsynchDecode'# parses n bytes, doing decoding of unsynchronized> data when unsynchDecode is True, and returns the represented  value. 8!773! None NoneParses any Frame Header Parses any Frame  NoneParses Extended Header as $ structure " parser for b flag - ' # parser for c flag - CRC data $ parser for d flag - restrictions flags : TODO: Properly read these flags into a data structure... "#$"#$ None Parses id3v2 Header  ID3v2 FOOTER (optional) ETo speed up the process of locating an ID3v2 tag when searching from G the end of a file, a footer can be added to the tag. It is REQUIRED D to add a footer to an appended tag, i.e. a tag located after all H audio data. The footer is a copy of the header, but with a different  identifier.   ID3v2 identifier "3DI" ' ID3v2 version $04 00 * ID3v2 flags %abcd0000 * ID3v2 size 4 * %0xxxxxxx %&'(%&'( Safe-Inferred  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~NoneNone)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]^_`abcdefgNoneNoneNone hi   hiNoneF)*+,-./0123456789:;<=>?@ABCDEjklmnopqrstuvwxFGHIJKLMNO PQRSTUVWXYZ[\]^_`abcdefg  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~y  !"#$$%&&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrssttuuvwxyzz{|}~            5 !"#$%&'()*+,-./0 1 2 3 4 5 6 7 8+9:+9;+9<+9=+9>+9?+9@+9A+9B+9C+9D+9E+9F+9G+9H+9I+9J+9J+9K+9L+9M+9N+9O+9P+9Q+9R+9R+ST+,U.VW./X./Y./Z./[./\./]./^./_./`.ab.ac.ad.ae.af.ag.ah.ai.aj.ak.al.am.an.ao.ap.aq.ar.as.at.au.vw.vx.vy.vz{|}~}~}~}~}~}~}~}~}~}~}}}}} idiii-0.1.3.2ID3.Type.FlagsID3.Parser.UnSyncID3.Type.UnparseID3.Type.HeaderID3.Type.ExtHeaderID3.Type.FrameInfoID3.Type.Frame ID3.Type.TagID3.Parser.GeneralID3.Parser.NativeFramesID3.Parser.FrameID3.Parser.ExtHeaderID3.Parser.HeaderID3.Parser.Tag ID3.ReadTag ID3.WriteTag ID3.SimpleID3.Type ID3.ParserID3 flagsToWord8wordsToInteger unSyncInteger unSynchroniseintegerToWords syncInteger synchroniseHasSizesize updateSizeInfStrParsedunparseTagSizeTagFlags TagVersion ID3Header tagVersion_ tagFlags_tagSize_emptyID3Header initID3Header tagVersiontagFlagstagSize unsynchFlagextendedHeaderFlagexperimentalFlag footerFlag anyFlagsOn showTagFlags ID3ExtHeaderinitID3ExtHeaderextSizeisUpdatecrcDatarestrictionsPresent FrameInfoUnknown frameDataTCMPisPartASPISIGNPRIVownerId privateDataGRIDENCRCOMROWNEUSERPOSSLINKAENCRBUFPOPMemailratingPCNTcounterGEOBAPICmimepicTypepicDataRVRBEQU2RVA2COMMSYLT timeFormatcontentUSLTlangSYTCMLLTETCOMCDItocDataWXXXURLurlTXXXdescrTextenctextUFIDownerid encodeAllinfoTextContent FormatFlags StatusFlags FrameFlags statusFlags_ formatFlags_ FrameSizeFrameID FrameHeaderfrID_frSize_frFlags_ FrameNameID3Frame frHeader_frInfo_ emptyID3Frame initID3FramefrHeaderfrInfo textContentemptyFrameHeaderinitFrameHeaderfrIDfrSizefrFlagsemptyFrameFlagsinitFrameFlags statusFlags formatFlagsframeDiscardFlagfileDiscardFlag readOnlyFlaganyStatusFlagsOn showBinaryshowStatusFlags groupPartFlagcompressedFlag encryptedFlagunsychronisedFlagdataLengthIdFlaganyFormatFlagsOnshowFormatFlags initFrameID3Tag tagHeader tagExtHeader tagFramestagFramesOrder tagPadding emptyID3Tag initID3TagheaderversionsetSize getFullSize getActualSize framesSize footerSizeextHSizepaddingflags extHeaderframes framesOrderframegetFramesetFrame sortFramesSize TagParser CharEncodingStState id3TagVersion headerFlagstagPoscurSizeToken initStaterun tagVersionGet tagVersionSetflagsGetflagsSetposGet posUpdateposSetposDecposIncsizeGet sizeUpdatesizeSetsizeDecsizeIncifSizewithSizemany'many1' manyTill' manyTill1'sepBy'sepBy1'countcount' countSepBy'encPackparseUntilWord8NullparseUntilWord16NullnonNull parseEncoding parseString parseNumber parseLanguageparsersword8word8s byteStringstringupperdigitanyWord8err parseSizetextInfourlInfo frameInfo parseFramesanyFrameHeaderanyFrameframeID frameSize frameFlagsframeStatusFlagsframeFormatFlagsparseExtHeader parseHeader parseFooterparseTag parseTag_hReadTagreadTag hWriteTagwriteTagTag getArtist setArtistgetTitlesetTitlegetAlbumsetAlbumgetYearsetYeargetTracksetTrack integer-gmpGHC.Integer.TypeInteger $fParsedInf $fShowInf $fParsedStr$fParsedInteger$fParsedTagFlags$fParsedID3Header$fShowID3HeaderextSize_ isUpdate_crcData_restrictionsPresent_emptyID3ExtHeader$fParsedID3ExtHeader$fShowID3ExtHeader$fParsedFrameInfo$fParsedFormatFlags$fParsedStatusFlags$fParsedFrameFlags$fShowFrameFlags$fParsedFrameHeader$fShowFrameHeader$fParsedID3Frame$fShowID3Frame$fHasSizeID3Frame$fParsedID3Tag $fShowID3Tag$fHasSizeID3TagbaseGHC.BaseString polyparse-1.8'Text.ParserCombinators.Poly.StateParserParser$fShowStparseBparseCparseD parseHeader_ parseVersion parseFlags parseTagSizeControl.Applicative ApplicativeoptionalliftA3liftA2liftA<**><**><*>puremanysome<|>empty AlternativegetConstConst unwrapMonad WrapMonad WrappedMonad unwrapArrow WrapArrow WrappedArrow getZipListZipList Data.Functor<$><$!Text.ParserCombinators.Poly.State runParserreparsestGetstQuerystUpdatesatisfyeofnextonFailP Text.ParserCombinators.Poly.Base manyFinally' manyFinallybracket bracketSepsepBy1sepBymany1uptoexactlyindentoneOf adjustErrBadfailBaddiscardapplyoneOf' adjustErrcommit Commitment PolyParse"Text.ParserCombinators.Poly.ResultSuccessFailure CommittedResult getFrameText setFrameTextdata-accessor-0.2.2.3 Data.AccessormodAputAgetA=:<..>setValgetValaccessorAccessorData.Accessor.MonadStatePrivate%:%=Data.Accessor.Basic^:^.^=