{"version":3,"sources":["jsdelivr-header.js","/npm/music-metadata@11.12.3/lib/matroska/types.js","/npm/music-metadata@11.12.3/lib/ParseError.js","/npm/music-metadata@11.12.3/lib/common/Util.js","/npm/music-metadata@11.12.3/lib/id3v2/ID3v2Token.js","/npm/music-metadata@11.12.3/lib/asf/AsfGuid.js","/npm/music-metadata@11.12.3/lib/asf/AsfUtil.js","/npm/music-metadata@11.12.3/lib/asf/AsfObject.js","/npm/music-metadata@11.12.3/lib/common/BasicParser.js","/npm/music-metadata@11.12.3/lib/asf/AsfParser.js"],"names":[],"mappings":"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","file":"/npm/music-metadata@11.12.3/lib/asf/AsfParser.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v4.62.2 and esbuild v0.28.1.\n * Original file: /npm/music-metadata@11.12.3/lib/asf/AsfParser.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export const TargetType = {\n    10: 'shot',\n    20: 'scene',\n    30: 'track',\n    40: 'part',\n    50: 'album',\n    60: 'edition',\n    70: 'collection'\n};\nexport const TrackType = {\n    video: 0x01,\n    audio: 0x02,\n    complex: 0x03,\n    logo: 0x04,\n    subtitle: 0x11,\n    button: 0x12,\n    control: 0x20\n};\nexport const TrackTypeValueToKeyMap = {\n    [TrackType.video]: 'video',\n    [TrackType.audio]: 'audio',\n    [TrackType.complex]: 'complex',\n    [TrackType.logo]: 'logo',\n    [TrackType.subtitle]: 'subtitle',\n    [TrackType.button]: 'button',\n    [TrackType.control]: 'control'\n};\n","export const makeParseError = (name) => {\n    return class ParseError extends Error {\n        constructor(message) {\n            super(message);\n            this.name = name;\n        }\n    };\n};\n// Concrete error class representing a file type determination failure.\nexport class CouldNotDetermineFileTypeError extends makeParseError('CouldNotDetermineFileTypeError') {\n}\n// Concrete error class representing an unsupported file type.\nexport class UnsupportedFileTypeError extends makeParseError('UnsupportedFileTypeError') {\n}\n// Concrete error class representing unexpected file content.\nclass UnexpectedFileContentError extends makeParseError('UnexpectedFileContentError') {\n    constructor(fileType, message) {\n        super(message);\n        this.fileType = fileType;\n    }\n    // Override toString to include file type information.\n    toString() {\n        return `${this.name} (FileType: ${this.fileType}): ${this.message}`;\n    }\n}\n// Concrete error class representing a field decoding error.\nexport class FieldDecodingError extends makeParseError('FieldDecodingError') {\n}\nexport class InternalParserError extends makeParseError('InternalParserError') {\n}\n// Factory function to create a specific type of UnexpectedFileContentError.\nexport const makeUnexpectedFileContentError = (fileType) => {\n    return class extends UnexpectedFileContentError {\n        constructor(message) {\n            super(fileType, message);\n        }\n    };\n};\n","import { StringType } from 'token-types';\nimport { FieldDecodingError } from '../ParseError.js';\nimport { getUintBE } from 'uint8array-extras';\nexport function getBit(buf, off, bit) {\n    return (buf[off] & (1 << bit)) !== 0;\n}\n/**\n * Find delimiting zero in uint8Array\n * @param uint8Array Uint8Array to find the zero delimiter in\n * @param encoding The string encoding used\n * @return position in uint8Array where zero found, or uint8Array.length if not found\n */\nexport function findZero(uint8Array, encoding) {\n    const len = uint8Array.length;\n    if (encoding === 'utf-16le') {\n        // Look for 0x00 0x00 on 2-byte boundary\n        for (let i = 0; i + 1 < len; i += 2) {\n            if (uint8Array[i] === 0 && uint8Array[i + 1] === 0)\n                return i;\n        }\n        return len;\n    }\n    // latin1 / utf8 / utf16be (caller typically handles utf16be separately or via decode)\n    for (let i = 0; i < len; i++) {\n        if (uint8Array[i] === 0)\n            return i;\n    }\n    return len;\n}\nexport function trimRightNull(x) {\n    const pos0 = x.indexOf('\\0');\n    return pos0 === -1 ? x : x.substring(0, pos0);\n}\nfunction swapBytes(uint8Array) {\n    const l = uint8Array.length;\n    if ((l & 1) !== 0)\n        throw new FieldDecodingError('Buffer length must be even');\n    for (let i = 0; i < l; i += 2) {\n        const a = uint8Array[i];\n        uint8Array[i] = uint8Array[i + 1];\n        uint8Array[i + 1] = a;\n    }\n    return uint8Array;\n}\n/**\n * Decode string\n */\nexport function decodeString(uint8Array, encoding) {\n    // annoying workaround for a double BOM issue\n    // https://github.com/leetreveil/musicmetadata/issues/84\n    if (uint8Array[0] === 0xFF && uint8Array[1] === 0xFE) { // little endian\n        return decodeString(uint8Array.subarray(2), encoding);\n    }\n    if (encoding === 'utf-16le' && uint8Array[0] === 0xFE && uint8Array[1] === 0xFF) {\n        // BOM, indicating big endian decoding\n        if ((uint8Array.length & 1) !== 0)\n            throw new FieldDecodingError('Expected even number of octets for 16-bit unicode string');\n        return decodeString(swapBytes(uint8Array), encoding);\n    }\n    return new StringType(uint8Array.length, encoding).get(uint8Array, 0);\n}\nexport function stripNulls(str) {\n    str = str.replace(/^\\x00+/g, '');\n    str = str.replace(/\\x00+$/g, '');\n    return str;\n}\n/**\n * Read bit-aligned number start from buffer\n * Total offset in bits = byteOffset * 8 + bitOffset\n * @param source Byte buffer\n * @param byteOffset Starting offset in bytes\n * @param bitOffset Starting offset in bits: 0 = lsb\n * @param len Length of number in bits\n * @return Decoded bit aligned number\n */\nexport function getBitAllignedNumber(source, byteOffset, bitOffset, len) {\n    const byteOff = byteOffset + ~~(bitOffset / 8);\n    const bitOff = bitOffset % 8;\n    let value = source[byteOff];\n    value &= 0xff >> bitOff;\n    const bitsRead = 8 - bitOff;\n    const bitsLeft = len - bitsRead;\n    if (bitsLeft < 0) {\n        value >>= (8 - bitOff - len);\n    }\n    else if (bitsLeft > 0) {\n        value <<= bitsLeft;\n        value |= getBitAllignedNumber(source, byteOffset, bitOffset + bitsRead, bitsLeft);\n    }\n    return value;\n}\n/**\n * Read bit-aligned number start from buffer\n * Total offset in bits = byteOffset * 8 + bitOffset\n * @param source Byte Uint8Array\n * @param byteOffset Starting offset in bytes\n * @param bitOffset Starting offset in bits: 0 = most significant bit, 7 is the least significant bit\n * @return True if bit is set\n */\nexport function isBitSet(source, byteOffset, bitOffset) {\n    return getBitAllignedNumber(source, byteOffset, bitOffset, 1) === 1;\n}\nexport function a2hex(str) {\n    const arr = [];\n    for (let i = 0, l = str.length; i < l; i++) {\n        const hex = Number(str.charCodeAt(i)).toString(16);\n        arr.push(hex.length === 1 ? `0${hex}` : hex);\n    }\n    return arr.join(' ');\n}\n/**\n * Convert power ratio to DB\n * ratio: [0..1]\n */\nexport function ratioToDb(ratio) {\n    return 10 * Math.log10(ratio);\n}\n/**\n * Convert dB to ratio\n * db Decibels\n */\nexport function dbToRatio(dB) {\n    return 10 ** (dB / 10);\n}\n/**\n * Convert replay gain to ratio and Decibel\n * @param value string holding a ratio like '0.034' or '-7.54 dB'\n */\nexport function toRatio(value) {\n    const ps = value.split(' ').map(p => p.trim().toLowerCase());\n    if (ps.length >= 1) {\n        const v = Number.parseFloat(ps[0]);\n        return ps.length === 2 && ps[1] === 'db' ? {\n            dB: v,\n            ratio: dbToRatio(v)\n        } : {\n            dB: ratioToDb(v),\n            ratio: v\n        };\n    }\n}\n/**\n * Decode a big-endian unsigned integer from a Uint8Array.\n * Supports dynamic length (1–8 bytes).\n */\nexport function decodeUintBE(uint8Array) {\n    if (uint8Array.length === 0) {\n        throw new Error(\"decodeUintBE: empty Uint8Array\");\n    }\n    const view = new DataView(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength);\n    return getUintBE(view);\n}\n","import * as Token from 'token-types';\nimport * as util from '../common/Util.js';\n/**\n * The picture type according to the ID3v2 APIC frame\n * Ref: http://id3.org/id3v2.3.0#Attached_picture\n */\nexport const AttachedPictureType = {\n    0: 'Other',\n    1: \"32x32 pixels 'file icon' (PNG only)\",\n    2: 'Other file icon',\n    3: 'Cover (front)',\n    4: 'Cover (back)',\n    5: 'Leaflet page',\n    6: 'Media (e.g. label side of CD)',\n    7: 'Lead artist/lead performer/soloist',\n    8: 'Artist/performer',\n    9: 'Conductor',\n    10: 'Band/Orchestra',\n    11: 'Composer',\n    12: 'Lyricist/text writer',\n    13: 'Recording Location',\n    14: 'During recording',\n    15: 'During performance',\n    16: 'Movie/video screen capture',\n    17: 'A bright coloured fish',\n    18: 'Illustration',\n    19: 'Band/artist logotype',\n    20: 'Publisher/Studio logotype'\n};\n/**\n * https://id3.org/id3v2.3.0#Synchronised_lyrics.2Ftext\n */\nexport const LyricsContentType = {\n    other: 0,\n    lyrics: 1,\n    text: 2,\n    movement_part: 3,\n    events: 4,\n    chord: 5,\n    trivia_pop: 6,\n};\nexport const TimestampFormat = {\n    notSynchronized: 0,\n    mpegFrameNumber: 1,\n    milliseconds: 2\n};\n/**\n * 28 bits (representing up to 256MB) integer, the msb is 0 to avoid 'false syncsignals'.\n * 4 * %0xxxxxxx\n */\nexport const UINT32SYNCSAFE = {\n    get: (buf, off) => {\n        return buf[off + 3] & 0x7f | ((buf[off + 2]) << 7) |\n            ((buf[off + 1]) << 14) | ((buf[off]) << 21);\n    },\n    len: 4\n};\n/**\n * ID3v2 header\n * Ref: http://id3.org/id3v2.3.0#ID3v2_header\n * ToDo\n */\nexport const ID3v2Header = {\n    len: 10,\n    get: (buf, off) => {\n        return {\n            // ID3v2/file identifier   \"ID3\"\n            fileIdentifier: new Token.StringType(3, 'ascii').get(buf, off),\n            // ID3v2 versionIndex\n            version: {\n                major: Token.INT8.get(buf, off + 3),\n                revision: Token.INT8.get(buf, off + 4)\n            },\n            // ID3v2 flags\n            flags: {\n                // Unsynchronisation\n                unsynchronisation: util.getBit(buf, off + 5, 7),\n                // Extended header\n                isExtendedHeader: util.getBit(buf, off + 5, 6),\n                // Experimental indicator\n                expIndicator: util.getBit(buf, off + 5, 5),\n                footer: util.getBit(buf, off + 5, 4)\n            },\n            size: UINT32SYNCSAFE.get(buf, off + 6)\n        };\n    }\n};\nexport const ExtendedHeader = {\n    len: 10,\n    get: (buf, off) => {\n        return {\n            // Extended header size\n            size: Token.UINT32_BE.get(buf, off),\n            // Extended Flags\n            extendedFlags: Token.UINT16_BE.get(buf, off + 4),\n            // Size of padding\n            sizeOfPadding: Token.UINT32_BE.get(buf, off + 6),\n            // CRC data present\n            crcDataPresent: util.getBit(buf, off + 4, 31)\n        };\n    }\n};\nexport const TextEncodingToken = {\n    len: 1,\n    get: (uint8Array, off) => {\n        switch (uint8Array[off]) {\n            case 0x00:\n                return { encoding: 'latin1' }; // binary\n            case 0x01:\n                return { encoding: 'utf-16le', bom: true };\n            case 0x02:\n                return { encoding: 'utf-16le', bom: false };\n            case 0x03:\n                return { encoding: 'utf8', bom: false };\n            default:\n                return { encoding: 'utf8', bom: false };\n        }\n    }\n};\n/**\n * Used to read first portion of `SYLT` frame\n */\nexport const TextHeader = {\n    len: 4,\n    get: (uint8Array, off) => {\n        return {\n            encoding: TextEncodingToken.get(uint8Array, off),\n            language: new Token.StringType(3, 'latin1').get(uint8Array, off + 1)\n        };\n    }\n};\n/**\n * Used to read first portion of `SYLT` frame\n */\nexport const SyncTextHeader = {\n    len: 6,\n    get: (uint8Array, off) => {\n        const text = TextHeader.get(uint8Array, off);\n        return {\n            encoding: text.encoding,\n            language: text.language,\n            timeStampFormat: Token.UINT8.get(uint8Array, off + 4),\n            contentType: Token.UINT8.get(uint8Array, off + 5)\n        };\n    }\n};\n","import { parseWindowsGuid, Guid } from 'win-guid';\n/**\n * Ref:\n * - https://tools.ietf.org/html/draft-fleischman-asf-01, Appendix A: ASF GUIDs\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/10_asf_guids.html\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/index.html\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/10_asf_guids.html\n *\n * ASF File Structure:\n * - https://msdn.microsoft.com/en-us/library/windows/desktop/ee663575(v=vs.85).aspx\n *\n * ASF GUIDs:\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/10_asf_guids.html\n * - https://github.com/dji-sdk/FFmpeg/blob/master/libavformat/asf.c\n */\nclass AsfGuid {\n    static fromBin(bin, offset = 0) {\n        return new AsfGuid(AsfGuid.decode(bin, offset));\n    }\n    /**\n     * Decode GUID in format like \"B503BF5F-2EA9-CF11-8EE3-00C00C205365\"\n     * @param objectId Binary GUID\n     * @param offset Read offset in bytes, default 0\n     * @returns GUID as dashed hexadecimal representation\n     */\n    static decode(objectId, offset = 0) {\n        return new Guid(objectId.subarray(offset, offset + 16)).toString();\n    }\n    /**\n     * Decode stream type\n     * @param mediaType Media type GUID\n     * @returns Media type\n     */\n    static decodeMediaType(mediaType) {\n        switch (mediaType.str) {\n            case AsfGuid.AudioMedia.str: return 'audio';\n            case AsfGuid.VideoMedia.str: return 'video';\n            case AsfGuid.CommandMedia.str: return 'command';\n            case AsfGuid.Degradable_JPEG_Media.str: return 'degradable-jpeg';\n            case AsfGuid.FileTransferMedia.str: return 'file-transfer';\n            case AsfGuid.BinaryMedia.str: return 'binary';\n        }\n    }\n    /**\n     * Encode GUID\n     * @param guid GUID like: \"B503BF5F-2EA9-CF11-8EE3-00C00C205365\"\n     * @returns Encoded Binary GUID\n     */\n    static encode(guid) {\n        return parseWindowsGuid(guid);\n    }\n    constructor(str) {\n        this.str = str;\n    }\n    equals(guid) {\n        return this.str === guid.str;\n    }\n    toBin() {\n        return AsfGuid.encode(this.str);\n    }\n}\n// 10.1 Top-level ASF object GUIDs\nAsfGuid.HeaderObject = new AsfGuid(\"75B22630-668E-11CF-A6D9-00AA0062CE6C\");\nAsfGuid.DataObject = new AsfGuid(\"75B22636-668E-11CF-A6D9-00AA0062CE6C\");\nAsfGuid.SimpleIndexObject = new AsfGuid(\"33000890-E5B1-11CF-89F4-00A0C90349CB\");\nAsfGuid.IndexObject = new AsfGuid(\"D6E229D3-35DA-11D1-9034-00A0C90349BE\");\nAsfGuid.MediaObjectIndexObject = new AsfGuid(\"FEB103F8-12AD-4C64-840F-2A1D2F7AD48C\");\nAsfGuid.TimecodeIndexObject = new AsfGuid(\"3CB73FD0-0C4A-4803-953D-EDF7B6228F0C\");\n// 10.2 Header Object GUIDs\nAsfGuid.FilePropertiesObject = new AsfGuid(\"8CABDCA1-A947-11CF-8EE4-00C00C205365\");\nAsfGuid.StreamPropertiesObject = new AsfGuid(\"B7DC0791-A9B7-11CF-8EE6-00C00C205365\");\nAsfGuid.HeaderExtensionObject = new AsfGuid(\"5FBF03B5-A92E-11CF-8EE3-00C00C205365\");\nAsfGuid.CodecListObject = new AsfGuid(\"86D15240-311D-11D0-A3A4-00A0C90348F6\");\nAsfGuid.ScriptCommandObject = new AsfGuid(\"1EFB1A30-0B62-11D0-A39B-00A0C90348F6\");\nAsfGuid.MarkerObject = new AsfGuid(\"F487CD01-A951-11CF-8EE6-00C00C205365\");\nAsfGuid.BitrateMutualExclusionObject = new AsfGuid(\"D6E229DC-35DA-11D1-9034-00A0C90349BE\");\nAsfGuid.ErrorCorrectionObject = new AsfGuid(\"75B22635-668E-11CF-A6D9-00AA0062CE6C\");\nAsfGuid.ContentDescriptionObject = new AsfGuid(\"75B22633-668E-11CF-A6D9-00AA0062CE6C\");\nAsfGuid.ExtendedContentDescriptionObject = new AsfGuid(\"D2D0A440-E307-11D2-97F0-00A0C95EA850\");\nAsfGuid.ContentBrandingObject = new AsfGuid(\"2211B3FA-BD23-11D2-B4B7-00A0C955FC6E\");\nAsfGuid.StreamBitratePropertiesObject = new AsfGuid(\"7BF875CE-468D-11D1-8D82-006097C9A2B2\");\nAsfGuid.ContentEncryptionObject = new AsfGuid(\"2211B3FB-BD23-11D2-B4B7-00A0C955FC6E\");\nAsfGuid.ExtendedContentEncryptionObject = new AsfGuid(\"298AE614-2622-4C17-B935-DAE07EE9289C\");\nAsfGuid.DigitalSignatureObject = new AsfGuid(\"2211B3FC-BD23-11D2-B4B7-00A0C955FC6E\");\nAsfGuid.PaddingObject = new AsfGuid(\"1806D474-CADF-4509-A4BA-9AABCB96AAE8\");\n// 10.3 Header Extension Object GUIDs\nAsfGuid.ExtendedStreamPropertiesObject = new AsfGuid(\"14E6A5CB-C672-4332-8399-A96952065B5A\");\nAsfGuid.AdvancedMutualExclusionObject = new AsfGuid(\"A08649CF-4775-4670-8A16-6E35357566CD\");\nAsfGuid.GroupMutualExclusionObject = new AsfGuid(\"D1465A40-5A79-4338-B71B-E36B8FD6C249\");\nAsfGuid.StreamPrioritizationObject = new AsfGuid(\"D4FED15B-88D3-454F-81F0-ED5C45999E24\");\nAsfGuid.BandwidthSharingObject = new AsfGuid(\"A69609E6-517B-11D2-B6AF-00C04FD908E9\");\nAsfGuid.LanguageListObject = new AsfGuid(\"7C4346A9-EFE0-4BFC-B229-393EDE415C85\");\nAsfGuid.MetadataObject = new AsfGuid(\"C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA\");\nAsfGuid.MetadataLibraryObject = new AsfGuid(\"44231C94-9498-49D1-A141-1D134E457054\");\nAsfGuid.IndexParametersObject = new AsfGuid(\"D6E229DF-35DA-11D1-9034-00A0C90349BE\");\nAsfGuid.MediaObjectIndexParametersObject = new AsfGuid(\"6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7\");\nAsfGuid.TimecodeIndexParametersObject = new AsfGuid(\"F55E496D-9797-4B5D-8C8B-604DFE9BFB24\");\nAsfGuid.CompatibilityObject = new AsfGuid(\"26F18B5D-4584-47EC-9F5F-0E651F0452C9\");\nAsfGuid.AdvancedContentEncryptionObject = new AsfGuid(\"43058533-6981-49E6-9B74-AD12CB86D58C\");\n// 10.4 Stream Properties Object Stream Type GUIDs\nAsfGuid.AudioMedia = new AsfGuid(\"F8699E40-5B4D-11CF-A8FD-00805F5C442B\");\nAsfGuid.VideoMedia = new AsfGuid(\"BC19EFC0-5B4D-11CF-A8FD-00805F5C442B\");\nAsfGuid.CommandMedia = new AsfGuid(\"59DACFC0-59E6-11D0-A3AC-00A0C90348F6\");\nAsfGuid.JFIF_Media = new AsfGuid(\"B61BE100-5B4E-11CF-A8FD-00805F5C442B\");\nAsfGuid.Degradable_JPEG_Media = new AsfGuid(\"35907DE0-E415-11CF-A917-00805F5C442B\");\nAsfGuid.FileTransferMedia = new AsfGuid(\"91BD222C-F21C-497A-8B6D-5AA86BFC0185\");\nAsfGuid.BinaryMedia = new AsfGuid(\"3AFB65E2-47EF-40F2-AC2C-70A90D71D343\");\nAsfGuid.ASF_Index_Placeholder_Object = new AsfGuid(\"D9AADE20-7C17-4F9C-BC28-8555DD98E2A2\");\nexport default AsfGuid;\n","import * as Token from 'token-types';\nimport * as util from '../common/Util.js';\nexport function getParserForAttr(i) {\n    return attributeParsers[i];\n}\nexport function parseUnicodeAttr(uint8Array) {\n    return util.stripNulls(util.decodeString(uint8Array, 'utf-16le'));\n}\nconst attributeParsers = [\n    parseUnicodeAttr,\n    parseByteArrayAttr,\n    parseBoolAttr,\n    parseDWordAttr,\n    parseQWordAttr,\n    parseWordAttr,\n    parseByteArrayAttr\n];\nfunction parseByteArrayAttr(buf) {\n    return new Uint8Array(buf);\n}\nfunction parseBoolAttr(buf, offset = 0) {\n    return parseWordAttr(buf, offset) === 1;\n}\nfunction parseDWordAttr(buf, offset = 0) {\n    return Token.UINT32_LE.get(buf, offset);\n}\nfunction parseQWordAttr(buf, offset = 0) {\n    return Token.UINT64_LE.get(buf, offset);\n}\nfunction parseWordAttr(buf, offset = 0) {\n    return Token.UINT16_LE.get(buf, offset);\n}\n","// ASF Objects\nimport * as Token from 'token-types';\nimport * as util from '../common/Util.js';\nimport AsfGuid from './AsfGuid.js';\nimport { getParserForAttr, parseUnicodeAttr } from './AsfUtil.js';\nimport { AttachedPictureType } from '../id3v2/ID3v2Token.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nexport class AsfContentParseError extends makeUnexpectedFileContentError('ASF') {\n}\n/**\n * Data Type: Specifies the type of information being stored. The following values are recognized.\n */\nexport const DataType = {\n    /**\n     * Unicode string. The data consists of a sequence of Unicode characters.\n     */\n    UnicodeString: 0,\n    /**\n     * BYTE array. The type of data is implementation-specific.\n     */\n    ByteArray: 1,\n    /**\n     * BOOL. The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer. Only 0x0000 or 0x0001 are permitted values.\n     */\n    Bool: 2,\n    /**\n     * DWORD. The data is 4 bytes long and should be interpreted as a 32-bit unsigned integer.\n     */\n    DWord: 3,\n    /**\n     * QWORD. The data is 8 bytes long and should be interpreted as a 64-bit unsigned integer.\n     */\n    QWord: 4,\n    /**\n     * WORD. The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer.\n     */\n    Word: 5\n};\n/**\n * Token for: 3. ASF top-level Header Object\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3\n */\nexport const TopLevelHeaderObjectToken = {\n    len: 30,\n    get: (buf, off) => {\n        return {\n            objectId: AsfGuid.fromBin(buf, off),\n            objectSize: Number(Token.UINT64_LE.get(buf, off + 16)),\n            numberOfHeaderObjects: Token.UINT32_LE.get(buf, off + 24)\n            // Reserved: 2 bytes\n        };\n    }\n};\n/**\n * Token for: 3.1 Header Object (mandatory, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_1\n */\nexport const HeaderObjectToken = {\n    len: 24,\n    get: (buf, off) => {\n        return {\n            objectId: AsfGuid.fromBin(buf, off),\n            objectSize: Number(Token.UINT64_LE.get(buf, off + 16))\n        };\n    }\n};\nexport class State {\n    constructor(header) {\n        this.len = Number(header.objectSize) - HeaderObjectToken.len;\n    }\n    postProcessTag(tags, name, valueType, data) {\n        if (name === 'WM/Picture') {\n            tags.push({ id: name, value: WmPictureToken.fromBuffer(data) });\n        }\n        else {\n            const parseAttr = getParserForAttr(valueType);\n            if (!parseAttr) {\n                throw new AsfContentParseError(`unexpected value headerType: ${valueType}`);\n            }\n            tags.push({ id: name, value: parseAttr(data) });\n        }\n    }\n}\n// ToDo: use ignore type\nexport class IgnoreObjectState extends State {\n    get(_buf, _off) {\n        return null;\n    }\n}\n/**\n * Token for: 3.2: File Properties Object (mandatory, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_2\n */\nexport class FilePropertiesObject extends State {\n    get(buf, off) {\n        return {\n            fileId: AsfGuid.fromBin(buf, off),\n            fileSize: Token.UINT64_LE.get(buf, off + 16),\n            creationDate: Token.UINT64_LE.get(buf, off + 24),\n            dataPacketsCount: Token.UINT64_LE.get(buf, off + 32),\n            playDuration: Token.UINT64_LE.get(buf, off + 40),\n            sendDuration: Token.UINT64_LE.get(buf, off + 48),\n            preroll: Token.UINT64_LE.get(buf, off + 56),\n            flags: {\n                broadcast: util.getBit(buf, off + 64, 24),\n                seekable: util.getBit(buf, off + 64, 25)\n            },\n            // flagsNumeric: Token.UINT32_LE.get(buf, off + 64),\n            minimumDataPacketSize: Token.UINT32_LE.get(buf, off + 68),\n            maximumDataPacketSize: Token.UINT32_LE.get(buf, off + 72),\n            maximumBitrate: Token.UINT32_LE.get(buf, off + 76)\n        };\n    }\n}\nFilePropertiesObject.guid = AsfGuid.FilePropertiesObject;\n/**\n * Token for: 3.3 Stream Properties Object (mandatory, one per stream)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_3\n */\nexport class StreamPropertiesObject extends State {\n    get(buf, off) {\n        return {\n            streamType: AsfGuid.decodeMediaType(AsfGuid.fromBin(buf, off)),\n            errorCorrectionType: AsfGuid.fromBin(buf, off + 8)\n            // ToDo\n        };\n    }\n}\nStreamPropertiesObject.guid = AsfGuid.StreamPropertiesObject;\n/**\n * 3.4: Header Extension Object (mandatory, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_4\n */\nexport class HeaderExtensionObject {\n    constructor() {\n        this.len = 22;\n    }\n    get(buf, off) {\n        const view = new DataView(buf.buffer, off);\n        return {\n            reserved1: AsfGuid.fromBin(buf, off),\n            reserved2: view.getUint16(16, true),\n            extensionDataSize: view.getUint16(18, true)\n        };\n    }\n}\nHeaderExtensionObject.guid = AsfGuid.HeaderExtensionObject;\n/**\n * 3.5: The Codec List Object provides user-friendly information about the codecs and formats used to encode the content found in the ASF file.\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_5\n */\nconst CodecListObjectHeader = {\n    len: 20,\n    get: (buf, off) => {\n        const view = new DataView(buf.buffer, off);\n        return {\n            entryCount: view.getUint16(16, true)\n        };\n    }\n};\nasync function readString(tokenizer) {\n    const length = await tokenizer.readNumber(Token.UINT16_LE);\n    return (await tokenizer.readToken(new Token.StringType(length * 2, 'utf-16le'))).replace('\\0', '');\n}\n/**\n * 3.5: Read the Codec-List-Object, which provides user-friendly information about the codecs and formats used to encode the content found in the ASF file.\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_5\n */\nexport async function readCodecEntries(tokenizer) {\n    const codecHeader = await tokenizer.readToken(CodecListObjectHeader);\n    const entries = [];\n    for (let i = 0; i < codecHeader.entryCount; ++i) {\n        entries.push(await readCodecEntry(tokenizer));\n    }\n    return entries;\n}\nasync function readInformation(tokenizer) {\n    const length = await tokenizer.readNumber(Token.UINT16_LE);\n    const buf = new Uint8Array(length);\n    await tokenizer.readBuffer(buf);\n    return buf;\n}\n/**\n * Read Codec-Entries\n * @param tokenizer\n */\nasync function readCodecEntry(tokenizer) {\n    const type = await tokenizer.readNumber(Token.UINT16_LE);\n    return {\n        type: {\n            videoCodec: (type & 0x0001) === 0x0001,\n            audioCodec: (type & 0x0002) === 0x0002\n        },\n        codecName: await readString(tokenizer),\n        description: await readString(tokenizer),\n        information: await readInformation(tokenizer)\n    };\n}\n/**\n * 3.10 Content Description Object (optional, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_10\n */\nexport class ContentDescriptionObjectState extends State {\n    get(buf, off) {\n        const tags = [];\n        const view = new DataView(buf.buffer, off);\n        let pos = 10;\n        for (let i = 0; i < ContentDescriptionObjectState.contentDescTags.length; ++i) {\n            const length = view.getUint16(i * 2, true);\n            if (length > 0) {\n                const tagName = ContentDescriptionObjectState.contentDescTags[i];\n                const end = pos + length;\n                tags.push({ id: tagName, value: parseUnicodeAttr(buf.subarray(off + pos, off + end)) });\n                pos = end;\n            }\n        }\n        return tags;\n    }\n}\nContentDescriptionObjectState.guid = AsfGuid.ContentDescriptionObject;\nContentDescriptionObjectState.contentDescTags = ['Title', 'Author', 'Copyright', 'Description', 'Rating'];\n/**\n * 3.11 Extended Content Description Object (optional, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_11\n */\nexport class ExtendedContentDescriptionObjectState extends State {\n    get(buf, off) {\n        const tags = [];\n        const view = new DataView(buf.buffer, off);\n        const attrCount = view.getUint16(0, true);\n        let pos = 2;\n        for (let i = 0; i < attrCount; i += 1) {\n            const nameLen = view.getUint16(pos, true);\n            pos += 2;\n            const name = parseUnicodeAttr(buf.subarray(off + pos, off + pos + nameLen));\n            pos += nameLen;\n            const valueType = view.getUint16(pos, true);\n            pos += 2;\n            const valueLen = view.getUint16(pos, true);\n            pos += 2;\n            const value = buf.subarray(off + pos, off + pos + valueLen);\n            pos += valueLen;\n            this.postProcessTag(tags, name, valueType, value);\n        }\n        return tags;\n    }\n}\nExtendedContentDescriptionObjectState.guid = AsfGuid.ExtendedContentDescriptionObject;\n/**\n * 4.1 Extended Stream Properties Object (optional, 1 per media stream)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/04_objects_in_the_asf_header_extension_object.html#4_1\n */\nexport class ExtendedStreamPropertiesObjectState extends State {\n    get(buf, off) {\n        const view = new DataView(buf.buffer, off);\n        return {\n            startTime: Token.UINT64_LE.get(buf, off),\n            endTime: Token.UINT64_LE.get(buf, off + 8),\n            dataBitrate: view.getInt32(12, true),\n            bufferSize: view.getInt32(16, true),\n            initialBufferFullness: view.getInt32(20, true),\n            alternateDataBitrate: view.getInt32(24, true),\n            alternateBufferSize: view.getInt32(28, true),\n            alternateInitialBufferFullness: view.getInt32(32, true),\n            maximumObjectSize: view.getInt32(36, true),\n            flags: {\n                reliableFlag: util.getBit(buf, off + 40, 0),\n                seekableFlag: util.getBit(buf, off + 40, 1),\n                resendLiveCleanpointsFlag: util.getBit(buf, off + 40, 2)\n            },\n            // flagsNumeric: Token.UINT32_LE.get(buf, off + 64),\n            streamNumber: view.getInt16(42, true),\n            streamLanguageId: view.getInt16(44, true),\n            averageTimePerFrame: view.getInt32(52, true),\n            streamNameCount: view.getInt32(54, true),\n            payloadExtensionSystems: view.getInt32(56, true),\n            streamNames: [], // ToDo\n            streamPropertiesObject: null\n        };\n    }\n}\nExtendedStreamPropertiesObjectState.guid = AsfGuid.ExtendedStreamPropertiesObject;\n/**\n * 4.7  Metadata Object (optional, 0 or 1)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/04_objects_in_the_asf_header_extension_object.html#4_7\n */\nexport class MetadataObjectState extends State {\n    get(uint8Array, off) {\n        const tags = [];\n        const view = new DataView(uint8Array.buffer, off);\n        const descriptionRecordsCount = view.getUint16(0, true);\n        let pos = 2;\n        for (let i = 0; i < descriptionRecordsCount; i += 1) {\n            pos += 4;\n            const nameLen = view.getUint16(pos, true);\n            pos += 2;\n            const dataType = view.getUint16(pos, true);\n            pos += 2;\n            const dataLen = view.getUint32(pos, true);\n            pos += 4;\n            const name = parseUnicodeAttr(uint8Array.subarray(off + pos, off + pos + nameLen));\n            pos += nameLen;\n            const data = uint8Array.subarray(off + pos, off + pos + dataLen);\n            pos += dataLen;\n            this.postProcessTag(tags, name, dataType, data);\n        }\n        return tags;\n    }\n}\nMetadataObjectState.guid = AsfGuid.MetadataObject;\n// 4.8\tMetadata Library Object (optional, 0 or 1)\nexport class MetadataLibraryObjectState extends MetadataObjectState {\n}\nMetadataLibraryObjectState.guid = AsfGuid.MetadataLibraryObject;\n/**\n * Ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd757977(v=vs.85).aspx\n */\nexport class WmPictureToken {\n    static fromBuffer(buffer) {\n        const pic = new WmPictureToken(buffer.length);\n        return pic.get(buffer, 0);\n    }\n    constructor(len) {\n        this.len = len;\n    }\n    get(buffer, offset) {\n        const view = new DataView(buffer.buffer, offset);\n        const typeId = view.getUint8(0);\n        const size = view.getInt32(1, true);\n        let index = 5;\n        while (view.getUint16(index) !== 0) {\n            index += 2;\n        }\n        const format = new Token.StringType(index - 5, 'utf-16le').get(buffer, 5);\n        while (view.getUint16(index) !== 0) {\n            index += 2;\n        }\n        const description = new Token.StringType(index - 5, 'utf-16le').get(buffer, 5);\n        return {\n            type: AttachedPictureType[typeId],\n            format,\n            description,\n            size,\n            data: buffer.slice(index + 4)\n        };\n    }\n}\n","export class BasicParser {\n    /**\n     * Initialize parser with output (metadata), input (tokenizer) & parsing options (options).\n     * @param {INativeMetadataCollector} metadata Output\n     * @param {ITokenizer} tokenizer Input\n     * @param {IOptions} options Parsing options\n     */\n    constructor(metadata, tokenizer, options) {\n        this.metadata = metadata;\n        this.tokenizer = tokenizer;\n        this.options = options;\n    }\n}\n","import initDebug from 'debug';\nimport { TrackType } from '../type.js';\nimport AsfGuid from './AsfGuid.js';\nimport * as AsfObject from './AsfObject.js';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { AsfContentParseError } from './AsfObject.js';\nconst debug = initDebug('music-metadata:parser:ASF');\nconst headerType = 'asf';\n/**\n * Windows Media Metadata Usage Guidelines\n * - Ref: https://msdn.microsoft.com/en-us/library/ms867702.aspx\n *\n * Ref:\n * - https://tools.ietf.org/html/draft-fleischman-asf-01\n * - https://hwiegman.home.xs4all.nl/fileformats/asf/ASF_Specification.pdf\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/index.html\n * - https://msdn.microsoft.com/en-us/library/windows/desktop/ee663575(v=vs.85).aspx\n */\nexport class AsfParser extends BasicParser {\n    async parse() {\n        const header = await this.tokenizer.readToken(AsfObject.TopLevelHeaderObjectToken);\n        if (!header.objectId.equals(AsfGuid.HeaderObject)) {\n            throw new AsfContentParseError(`expected asf header; but was not found; got: ${header.objectId.str}`);\n        }\n        await this.parseObjectHeader(header.numberOfHeaderObjects);\n    }\n    async parseObjectHeader(numberOfObjectHeaders) {\n        let tags;\n        do {\n            // Parse common header of the ASF Object (3.1)\n            const header = await this.tokenizer.readToken(AsfObject.HeaderObjectToken);\n            // Parse data part of the ASF Object\n            debug('header GUID=%s', header.objectId.str);\n            switch (header.objectId.str) {\n                case AsfObject.FilePropertiesObject.guid.str: { // 3.2\n                    const fpo = await this.tokenizer.readToken(new AsfObject.FilePropertiesObject(header));\n                    this.metadata.setFormat('duration', Number(fpo.playDuration / BigInt(1000)) / 10000 - Number(fpo.preroll) / 1000);\n                    this.metadata.setFormat('bitrate', fpo.maximumBitrate);\n                    break;\n                }\n                case AsfObject.StreamPropertiesObject.guid.str: { // 3.3\n                    const spo = await this.tokenizer.readToken(new AsfObject.StreamPropertiesObject(header));\n                    this.metadata.setFormat('container', `ASF/${spo.streamType}`);\n                    break;\n                }\n                case AsfObject.HeaderExtensionObject.guid.str: { // 3.4\n                    const extHeader = await this.tokenizer.readToken(new AsfObject.HeaderExtensionObject());\n                    await this.parseExtensionObject(extHeader.extensionDataSize);\n                    break;\n                }\n                case AsfObject.ContentDescriptionObjectState.guid.str: // 3.10\n                    tags = await this.tokenizer.readToken(new AsfObject.ContentDescriptionObjectState(header));\n                    await this.addTags(tags);\n                    break;\n                case AsfObject.ExtendedContentDescriptionObjectState.guid.str: // 3.11\n                    tags = await this.tokenizer.readToken(new AsfObject.ExtendedContentDescriptionObjectState(header));\n                    await this.addTags(tags);\n                    break;\n                case AsfGuid.CodecListObject.str: {\n                    const codecs = await AsfObject.readCodecEntries(this.tokenizer);\n                    codecs.forEach(codec => {\n                        this.metadata.addStreamInfo({\n                            type: codec.type.videoCodec ? TrackType.video : TrackType.audio,\n                            codecName: codec.codecName\n                        });\n                    });\n                    const audioCodecs = codecs.filter(codec => codec.type.audioCodec).map(codec => codec.codecName).join('/');\n                    this.metadata.setFormat('codec', audioCodecs);\n                    break;\n                }\n                case AsfGuid.StreamBitratePropertiesObject.str:\n                    // ToDo?\n                    await this.tokenizer.ignore(header.objectSize - AsfObject.HeaderObjectToken.len);\n                    break;\n                case AsfGuid.PaddingObject.str:\n                    // ToDo: register bytes pad\n                    debug('Padding: %s bytes', header.objectSize - AsfObject.HeaderObjectToken.len);\n                    await this.tokenizer.ignore(header.objectSize - AsfObject.HeaderObjectToken.len);\n                    break;\n                default:\n                    this.metadata.addWarning(`Ignore ASF-Object-GUID: ${header.objectId.str}`);\n                    debug('Ignore ASF-Object-GUID: %s', header.objectId.str);\n                    await this.tokenizer.readToken(new AsfObject.IgnoreObjectState(header));\n            }\n        } while (--numberOfObjectHeaders);\n        // done\n    }\n    async addTags(tags) {\n        await Promise.all(tags.map(({ id, value }) => this.metadata.addTag(headerType, id, value)));\n    }\n    async parseExtensionObject(extensionSize) {\n        do {\n            // Parse common header of the ASF Object (3.1)\n            const header = await this.tokenizer.readToken(AsfObject.HeaderObjectToken);\n            const remaining = header.objectSize - AsfObject.HeaderObjectToken.len;\n            if (remaining < 0) {\n                throw new AsfContentParseError(`Invalid ASF header object size: ${header.objectSize}`);\n            }\n            // Parse data part of the ASF Object\n            switch (header.objectId.str) {\n                case AsfObject.ExtendedStreamPropertiesObjectState.guid.str: // 4.1\n                    // ToDo: extended stream header properties are ignored\n                    await this.tokenizer.readToken(new AsfObject.ExtendedStreamPropertiesObjectState(header));\n                    break;\n                case AsfObject.MetadataObjectState.guid.str: { // 4.7\n                    const moTags = await this.tokenizer.readToken(new AsfObject.MetadataObjectState(header));\n                    await this.addTags(moTags);\n                    break;\n                }\n                case AsfObject.MetadataLibraryObjectState.guid.str: { // 4.8\n                    const mlTags = await this.tokenizer.readToken(new AsfObject.MetadataLibraryObjectState(header));\n                    await this.addTags(mlTags);\n                    break;\n                }\n                case AsfGuid.PaddingObject.str:\n                    // ToDo: register bytes pad\n                    await this.tokenizer.ignore(remaining);\n                    break;\n                case AsfGuid.CompatibilityObject.str:\n                    await this.tokenizer.ignore(remaining);\n                    break;\n                case AsfGuid.ASF_Index_Placeholder_Object.str:\n                    await this.tokenizer.ignore(remaining);\n                    break;\n                default:\n                    this.metadata.addWarning(`Ignore ASF-Object-GUID: ${header.objectId.str}`);\n                    // console.log(\"Ignore ASF-Object-GUID: %s\", header.objectId.str);\n                    await this.tokenizer.readToken(new AsfObject.IgnoreObjectState(header));\n                    break;\n            }\n            extensionSize -= header.objectSize;\n        } while (extensionSize > 0);\n    }\n}\n"]}