xz-compat 1.1.3 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/lzma/sync/LzmaDecoder.d.cts +9 -8
- package/dist/cjs/lzma/sync/LzmaDecoder.d.ts +9 -8
- package/dist/cjs/lzma/sync/LzmaDecoder.js +3 -3
- package/dist/cjs/lzma/sync/LzmaDecoder.js.map +1 -1
- package/dist/cjs/lzma/sync/RangeDecoder.d.cts +3 -2
- package/dist/cjs/lzma/sync/RangeDecoder.d.ts +3 -2
- package/dist/cjs/lzma/sync/RangeDecoder.js +11 -5
- package/dist/cjs/lzma/sync/RangeDecoder.js.map +1 -1
- package/dist/esm/lzma/sync/LzmaDecoder.d.ts +9 -8
- package/dist/esm/lzma/sync/LzmaDecoder.js +4 -4
- package/dist/esm/lzma/sync/LzmaDecoder.js.map +1 -1
- package/dist/esm/lzma/sync/RangeDecoder.d.ts +3 -2
- package/dist/esm/lzma/sync/RangeDecoder.js +6 -6
- package/dist/esm/lzma/sync/RangeDecoder.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Decodes LZMA1 compressed data from a buffer.
|
|
5
5
|
* All operations are synchronous.
|
|
6
6
|
*/
|
|
7
|
+
import { type BufferLike } from 'extract-base-iterator';
|
|
7
8
|
import { type OutputSink } from '../types.js';
|
|
8
9
|
/**
|
|
9
10
|
* Synchronous LZMA1 decoder
|
|
@@ -69,16 +70,16 @@ export declare class LzmaDecoder {
|
|
|
69
70
|
flushOutWindow(): void;
|
|
70
71
|
/**
|
|
71
72
|
* Decode LZMA data with streaming output (no buffer accumulation)
|
|
72
|
-
* @param input - Compressed input buffer
|
|
73
|
+
* @param input - Compressed input buffer or BufferList
|
|
73
74
|
* @param inputOffset - Offset into input buffer
|
|
74
75
|
* @param outSize - Expected output size
|
|
75
76
|
* @param solid - If true, preserve state from previous decode
|
|
76
77
|
* @returns Number of bytes written to sink
|
|
77
78
|
*/
|
|
78
|
-
decodeWithSink(input:
|
|
79
|
+
decodeWithSink(input: BufferLike, inputOffset: number, outSize: number, solid?: boolean): number;
|
|
79
80
|
/**
|
|
80
81
|
* Decode LZMA data directly into caller's buffer (zero-copy)
|
|
81
|
-
* @param input - Compressed input buffer
|
|
82
|
+
* @param input - Compressed input buffer or BufferList
|
|
82
83
|
* @param inputOffset - Offset into input buffer
|
|
83
84
|
* @param outSize - Expected output size
|
|
84
85
|
* @param output - Pre-allocated output buffer to write to
|
|
@@ -86,16 +87,16 @@ export declare class LzmaDecoder {
|
|
|
86
87
|
* @param solid - If true, preserve state from previous decode
|
|
87
88
|
* @returns Number of bytes written
|
|
88
89
|
*/
|
|
89
|
-
decodeToBuffer(input:
|
|
90
|
+
decodeToBuffer(input: BufferLike, inputOffset: number, outSize: number, output: Buffer, outputOffset: number, solid?: boolean): number;
|
|
90
91
|
/**
|
|
91
92
|
* Decode LZMA data
|
|
92
|
-
* @param input - Compressed input buffer
|
|
93
|
+
* @param input - Compressed input buffer or BufferList
|
|
93
94
|
* @param inputOffset - Offset into input buffer
|
|
94
95
|
* @param outSize - Expected output size
|
|
95
96
|
* @param solid - If true, preserve state from previous decode
|
|
96
97
|
* @returns Decompressed data
|
|
97
98
|
*/
|
|
98
|
-
decode(input:
|
|
99
|
+
decode(input: BufferLike, inputOffset: number, outSize: number, solid?: boolean): Buffer;
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
101
102
|
* Decode LZMA1 data synchronously
|
|
@@ -104,12 +105,12 @@ export declare class LzmaDecoder {
|
|
|
104
105
|
* self-describing data (like XZ), but here we accept raw LZMA with properties
|
|
105
106
|
* specified separately. Pure JS implementation is used for LZMA1.
|
|
106
107
|
*
|
|
107
|
-
* @param input - Compressed data (without 5-byte properties header)
|
|
108
|
+
* @param input - Compressed data (without 5-byte properties header) or BufferList
|
|
108
109
|
* @param properties - 5-byte LZMA properties
|
|
109
110
|
* @param outSize - Expected output size
|
|
110
111
|
* @param outputSink - Optional output sink with write callback for streaming (returns bytes written)
|
|
111
112
|
* @returns Decompressed data (or bytes written if outputSink provided)
|
|
112
113
|
*/
|
|
113
|
-
export declare function decodeLzma(input:
|
|
114
|
+
export declare function decodeLzma(input: BufferLike, properties: Buffer | Uint8Array, outSize: number, outputSink?: {
|
|
114
115
|
write(buffer: Buffer): void;
|
|
115
116
|
}): Buffer | number;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Decodes LZMA1 compressed data from a buffer.
|
|
5
5
|
* All operations are synchronous.
|
|
6
6
|
*/
|
|
7
|
+
import { type BufferLike } from 'extract-base-iterator';
|
|
7
8
|
import { type OutputSink } from '../types.js';
|
|
8
9
|
/**
|
|
9
10
|
* Synchronous LZMA1 decoder
|
|
@@ -69,16 +70,16 @@ export declare class LzmaDecoder {
|
|
|
69
70
|
flushOutWindow(): void;
|
|
70
71
|
/**
|
|
71
72
|
* Decode LZMA data with streaming output (no buffer accumulation)
|
|
72
|
-
* @param input - Compressed input buffer
|
|
73
|
+
* @param input - Compressed input buffer or BufferList
|
|
73
74
|
* @param inputOffset - Offset into input buffer
|
|
74
75
|
* @param outSize - Expected output size
|
|
75
76
|
* @param solid - If true, preserve state from previous decode
|
|
76
77
|
* @returns Number of bytes written to sink
|
|
77
78
|
*/
|
|
78
|
-
decodeWithSink(input:
|
|
79
|
+
decodeWithSink(input: BufferLike, inputOffset: number, outSize: number, solid?: boolean): number;
|
|
79
80
|
/**
|
|
80
81
|
* Decode LZMA data directly into caller's buffer (zero-copy)
|
|
81
|
-
* @param input - Compressed input buffer
|
|
82
|
+
* @param input - Compressed input buffer or BufferList
|
|
82
83
|
* @param inputOffset - Offset into input buffer
|
|
83
84
|
* @param outSize - Expected output size
|
|
84
85
|
* @param output - Pre-allocated output buffer to write to
|
|
@@ -86,16 +87,16 @@ export declare class LzmaDecoder {
|
|
|
86
87
|
* @param solid - If true, preserve state from previous decode
|
|
87
88
|
* @returns Number of bytes written
|
|
88
89
|
*/
|
|
89
|
-
decodeToBuffer(input:
|
|
90
|
+
decodeToBuffer(input: BufferLike, inputOffset: number, outSize: number, output: Buffer, outputOffset: number, solid?: boolean): number;
|
|
90
91
|
/**
|
|
91
92
|
* Decode LZMA data
|
|
92
|
-
* @param input - Compressed input buffer
|
|
93
|
+
* @param input - Compressed input buffer or BufferList
|
|
93
94
|
* @param inputOffset - Offset into input buffer
|
|
94
95
|
* @param outSize - Expected output size
|
|
95
96
|
* @param solid - If true, preserve state from previous decode
|
|
96
97
|
* @returns Decompressed data
|
|
97
98
|
*/
|
|
98
|
-
decode(input:
|
|
99
|
+
decode(input: BufferLike, inputOffset: number, outSize: number, solid?: boolean): Buffer;
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
101
102
|
* Decode LZMA1 data synchronously
|
|
@@ -104,12 +105,12 @@ export declare class LzmaDecoder {
|
|
|
104
105
|
* self-describing data (like XZ), but here we accept raw LZMA with properties
|
|
105
106
|
* specified separately. Pure JS implementation is used for LZMA1.
|
|
106
107
|
*
|
|
107
|
-
* @param input - Compressed data (without 5-byte properties header)
|
|
108
|
+
* @param input - Compressed data (without 5-byte properties header) or BufferList
|
|
108
109
|
* @param properties - 5-byte LZMA properties
|
|
109
110
|
* @param outSize - Expected output size
|
|
110
111
|
* @param outputSink - Optional output sink with write callback for streaming (returns bytes written)
|
|
111
112
|
* @returns Decompressed data (or bytes written if outputSink provided)
|
|
112
113
|
*/
|
|
113
|
-
export declare function decodeLzma(input:
|
|
114
|
+
export declare function decodeLzma(input: BufferLike, properties: Buffer | Uint8Array, outSize: number, outputSink?: {
|
|
114
115
|
write(buffer: Buffer): void;
|
|
115
116
|
}): Buffer | number;
|
|
@@ -343,7 +343,7 @@ var LzmaDecoder = /*#__PURE__*/ function() {
|
|
|
343
343
|
};
|
|
344
344
|
/**
|
|
345
345
|
* Decode LZMA data with streaming output (no buffer accumulation)
|
|
346
|
-
* @param input - Compressed input buffer
|
|
346
|
+
* @param input - Compressed input buffer or BufferList
|
|
347
347
|
* @param inputOffset - Offset into input buffer
|
|
348
348
|
* @param outSize - Expected output size
|
|
349
349
|
* @param solid - If true, preserve state from previous decode
|
|
@@ -454,7 +454,7 @@ var LzmaDecoder = /*#__PURE__*/ function() {
|
|
|
454
454
|
};
|
|
455
455
|
/**
|
|
456
456
|
* Decode LZMA data directly into caller's buffer (zero-copy)
|
|
457
|
-
* @param input - Compressed input buffer
|
|
457
|
+
* @param input - Compressed input buffer or BufferList
|
|
458
458
|
* @param inputOffset - Offset into input buffer
|
|
459
459
|
* @param outSize - Expected output size
|
|
460
460
|
* @param output - Pre-allocated output buffer to write to
|
|
@@ -569,7 +569,7 @@ var LzmaDecoder = /*#__PURE__*/ function() {
|
|
|
569
569
|
};
|
|
570
570
|
/**
|
|
571
571
|
* Decode LZMA data
|
|
572
|
-
* @param input - Compressed input buffer
|
|
572
|
+
* @param input - Compressed input buffer or BufferList
|
|
573
573
|
* @param inputOffset - Offset into input buffer
|
|
574
574
|
* @param outSize - Expected output size
|
|
575
575
|
* @param solid - If true, preserve state from previous decode
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/xz-compat/src/lzma/sync/LzmaDecoder.ts"],"sourcesContent":["/**\n * Synchronous LZMA1 Decoder\n *\n * Decodes LZMA1 compressed data from a buffer.\n * All operations are synchronous.\n */\n\nimport { allocBufferUnsafe, bufferFrom } from 'extract-base-iterator';\nimport {\n getLenToPosState,\n initBitModels,\n kEndPosModelIndex,\n kMatchMinLen,\n kNumAlignBits,\n kNumFullDistances,\n kNumLenToPosStates,\n kNumLitContextBitsMax,\n kNumPosSlotBits,\n kNumPosStatesBitsMax,\n kNumStates,\n kStartPosModelIndex,\n type OutputSink,\n parseProperties,\n stateIsCharState,\n stateUpdateChar,\n stateUpdateMatch,\n stateUpdateRep,\n stateUpdateShortRep,\n} from '../types.ts';\nimport { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDecoder.ts';\n\n/**\n * Length decoder for match/rep lengths\n */\nclass LenDecoder {\n private choice: Uint16Array;\n private lowCoder: BitTreeDecoder[];\n private midCoder: BitTreeDecoder[];\n private highCoder: BitTreeDecoder;\n private numPosStates: number;\n\n constructor() {\n this.choice = initBitModels(null, 2);\n this.lowCoder = [];\n this.midCoder = [];\n this.highCoder = new BitTreeDecoder(8);\n this.numPosStates = 0;\n }\n\n create(numPosStates: number): void {\n for (; this.numPosStates < numPosStates; this.numPosStates++) {\n this.lowCoder[this.numPosStates] = new BitTreeDecoder(3);\n this.midCoder[this.numPosStates] = new BitTreeDecoder(3);\n }\n }\n\n init(): void {\n initBitModels(this.choice);\n for (let i = this.numPosStates - 1; i >= 0; i--) {\n this.lowCoder[i].init();\n this.midCoder[i].init();\n }\n this.highCoder.init();\n }\n\n decode(rangeDecoder: RangeDecoder, posState: number): number {\n if (rangeDecoder.decodeBit(this.choice, 0) === 0) {\n return this.lowCoder[posState].decode(rangeDecoder);\n }\n if (rangeDecoder.decodeBit(this.choice, 1) === 0) {\n return 8 + this.midCoder[posState].decode(rangeDecoder);\n }\n return 16 + this.highCoder.decode(rangeDecoder);\n }\n}\n\n/**\n * Single literal decoder (decodes one byte)\n */\nclass LiteralDecoder2 {\n private decoders: Uint16Array;\n\n constructor() {\n this.decoders = initBitModels(null, 0x300);\n }\n\n init(): void {\n initBitModels(this.decoders);\n }\n\n decodeNormal(rangeDecoder: RangeDecoder): number {\n let symbol = 1;\n do {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n\n decodeWithMatchByte(rangeDecoder: RangeDecoder, matchByte: number): number {\n let symbol = 1;\n do {\n const matchBit = (matchByte >> 7) & 1;\n matchByte <<= 1;\n const bit = rangeDecoder.decodeBit(this.decoders, ((1 + matchBit) << 8) + symbol);\n symbol = (symbol << 1) | bit;\n if (matchBit !== bit) {\n while (symbol < 0x100) {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n }\n break;\n }\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n}\n\n/**\n * Literal decoder (array of single decoders)\n */\nclass LiteralDecoder {\n private numPosBits: number;\n private numPrevBits: number;\n private posMask: number;\n private coders: (LiteralDecoder2 | undefined)[];\n\n constructor() {\n this.numPosBits = 0;\n this.numPrevBits = 0;\n this.posMask = 0;\n this.coders = [];\n }\n\n create(numPosBits: number, numPrevBits: number): void {\n if (this.coders.length > 0 && this.numPrevBits === numPrevBits && this.numPosBits === numPosBits) {\n return;\n }\n this.numPosBits = numPosBits;\n this.posMask = (1 << numPosBits) - 1;\n this.numPrevBits = numPrevBits;\n this.coders = [];\n }\n\n init(): void {\n for (let i = 0; i < this.coders.length; i++) {\n if (this.coders[i]) {\n this.coders[i]?.init();\n }\n }\n }\n\n getDecoder(pos: number, prevByte: number): LiteralDecoder2 {\n const index = ((pos & this.posMask) << this.numPrevBits) + ((prevByte & 0xff) >>> (8 - this.numPrevBits));\n let decoder = this.coders[index];\n if (!decoder) {\n decoder = new LiteralDecoder2();\n this.coders[index] = decoder;\n }\n return decoder;\n }\n}\n\n/**\n * Output window (sliding dictionary)\n */\nclass OutWindow {\n private buffer: Buffer;\n private windowSize: number;\n private pos: number;\n private sink?: {\n write(buffer: Buffer): void;\n };\n private streamPos: number;\n\n constructor(sink?: OutputSink) {\n this.buffer = allocBufferUnsafe(0); // Replaced by create() before use\n this.windowSize = 0;\n this.pos = 0;\n this.sink = sink;\n this.streamPos = 0;\n }\n\n create(windowSize: number): void {\n if (!this.buffer || this.windowSize !== windowSize) {\n this.buffer = allocBufferUnsafe(windowSize);\n }\n this.windowSize = windowSize;\n this.pos = 0;\n this.streamPos = 0;\n }\n\n init(solid: boolean): void {\n if (!solid) {\n this.pos = 0;\n this.streamPos = 0;\n }\n }\n\n putByte(b: number): void {\n this.buffer[this.pos++] = b;\n if (this.pos >= this.windowSize) {\n if (this.sink) {\n this.flush();\n this.pos = 0;\n this.streamPos = 0; // Reset streamPos after wrap to track new data from pos 0\n } else {\n this.pos = 0;\n }\n }\n }\n\n flush(): void {\n const size = this.pos - this.streamPos;\n if (size > 0 && this.sink) {\n // Use bufferFrom to create a COPY, not a view - the buffer is reused after wrapping\n const chunk = bufferFrom(this.buffer.slice(this.streamPos, this.streamPos + size));\n this.sink.write(chunk);\n this.streamPos = this.pos;\n }\n }\n\n getByte(distance: number): number {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n return this.buffer[pos];\n }\n\n copyBlock(distance: number, len: number): void {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n for (let i = 0; i < len; i++) {\n if (pos >= this.windowSize) {\n pos = 0;\n }\n this.putByte(this.buffer[pos++]);\n }\n }\n\n /**\n * Copy decoded data to output buffer\n */\n copyTo(output: Buffer, outputOffset: number, count: number): void {\n const srcPos = this.pos - count;\n if (srcPos < 0) {\n // Wrap around case - data spans end and beginning of buffer\n const firstPart = -srcPos;\n this.buffer.copy(output, outputOffset, this.windowSize + srcPos, this.windowSize);\n this.buffer.copy(output, outputOffset + firstPart, 0, count - firstPart);\n } else {\n this.buffer.copy(output, outputOffset, srcPos, srcPos + count);\n }\n }\n}\n\n/**\n * Synchronous LZMA1 decoder\n */\nexport class LzmaDecoder {\n private outWindow: OutWindow;\n private rangeDecoder: RangeDecoder;\n\n // Probability models\n private isMatchDecoders: Uint16Array;\n private isRepDecoders: Uint16Array;\n private isRepG0Decoders: Uint16Array;\n private isRepG1Decoders: Uint16Array;\n private isRepG2Decoders: Uint16Array;\n private isRep0LongDecoders: Uint16Array;\n private posSlotDecoder: BitTreeDecoder[];\n private posDecoders: Uint16Array;\n private posAlignDecoder: BitTreeDecoder;\n private lenDecoder: LenDecoder;\n private repLenDecoder: LenDecoder;\n private literalDecoder: LiteralDecoder;\n\n // Properties\n private dictionarySize: number;\n private dictionarySizeCheck: number;\n private posStateMask: number;\n\n // State (preserved across solid calls)\n private state: number;\n private rep0: number;\n private rep1: number;\n private rep2: number;\n private rep3: number;\n private prevByte: number;\n private totalPos: number;\n\n constructor(outputSink?: OutputSink) {\n this.outWindow = new OutWindow(outputSink);\n this.rangeDecoder = new RangeDecoder();\n\n this.isMatchDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.isRepDecoders = initBitModels(null, kNumStates);\n this.isRepG0Decoders = initBitModels(null, kNumStates);\n this.isRepG1Decoders = initBitModels(null, kNumStates);\n this.isRepG2Decoders = initBitModels(null, kNumStates);\n this.isRep0LongDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.posSlotDecoder = [];\n this.posDecoders = initBitModels(null, kNumFullDistances - kEndPosModelIndex);\n this.posAlignDecoder = new BitTreeDecoder(kNumAlignBits);\n this.lenDecoder = new LenDecoder();\n this.repLenDecoder = new LenDecoder();\n this.literalDecoder = new LiteralDecoder();\n\n for (let i = 0; i < kNumLenToPosStates; i++) {\n this.posSlotDecoder[i] = new BitTreeDecoder(kNumPosSlotBits);\n }\n\n this.dictionarySize = -1;\n this.dictionarySizeCheck = -1;\n this.posStateMask = 0;\n\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n }\n\n /**\n * Set dictionary size\n */\n setDictionarySize(dictionarySize: number): boolean {\n if (dictionarySize < 0) return false;\n if (this.dictionarySize !== dictionarySize) {\n this.dictionarySize = dictionarySize;\n this.dictionarySizeCheck = Math.max(dictionarySize, 1);\n this.outWindow.create(Math.max(this.dictionarySizeCheck, 1 << 12));\n }\n return true;\n }\n\n /**\n * Set lc, lp, pb properties\n */\n setLcLpPb(lc: number, lp: number, pb: number): boolean {\n if (lc > kNumLitContextBitsMax || lp > 4 || pb > kNumPosStatesBitsMax) {\n return false;\n }\n const numPosStates = 1 << pb;\n this.literalDecoder.create(lp, lc);\n this.lenDecoder.create(numPosStates);\n this.repLenDecoder.create(numPosStates);\n this.posStateMask = numPosStates - 1;\n return true;\n }\n\n /**\n * Set decoder properties from 5-byte buffer\n */\n setDecoderProperties(properties: Buffer | Uint8Array): boolean {\n const props = parseProperties(properties);\n if (!this.setLcLpPb(props.lc, props.lp, props.pb)) return false;\n return this.setDictionarySize(props.dictionarySize);\n }\n\n /**\n * Initialize probability tables\n */\n private initProbabilities(): void {\n initBitModels(this.isMatchDecoders);\n initBitModels(this.isRepDecoders);\n initBitModels(this.isRepG0Decoders);\n initBitModels(this.isRepG1Decoders);\n initBitModels(this.isRepG2Decoders);\n initBitModels(this.isRep0LongDecoders);\n initBitModels(this.posDecoders);\n this.literalDecoder.init();\n for (let i = kNumLenToPosStates - 1; i >= 0; i--) {\n this.posSlotDecoder[i].init();\n }\n this.lenDecoder.init();\n this.repLenDecoder.init();\n this.posAlignDecoder.init();\n }\n\n /**\n * Reset probabilities only (for LZMA2 state reset)\n */\n resetProbabilities(): void {\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n }\n\n /**\n * Reset dictionary position (for LZMA2 dictionary reset)\n */\n resetDictionary(): void {\n this.outWindow.init(false);\n this.totalPos = 0;\n }\n\n /**\n * Feed uncompressed data into the dictionary (for LZMA2 uncompressed chunks)\n * This updates the sliding window so subsequent LZMA chunks can reference this data.\n */\n feedUncompressed(data: Buffer): void {\n for (let i = 0; i < data.length; i++) {\n this.outWindow.putByte(data[i]);\n }\n this.totalPos += data.length;\n if (data.length > 0) {\n this.prevByte = data[data.length - 1];\n }\n }\n\n /**\n * Flush any remaining data in the OutWindow to the sink\n */\n flushOutWindow(): void {\n this.outWindow.flush();\n }\n\n /**\n * Decode LZMA data with streaming output (no buffer accumulation)\n * @param input - Compressed input buffer\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written to sink\n */\n decodeWithSink(input: Buffer, inputOffset: number, outSize: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n this.outWindow.init(true);\n }\n\n let outPos = 0;\n let cumPos = this.totalPos;\n\n while (outPos < outSize) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n outPos++;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break;\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n outPos++;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos;\n }\n\n /**\n * Decode LZMA data directly into caller's buffer (zero-copy)\n * @param input - Compressed input buffer\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param output - Pre-allocated output buffer to write to\n * @param outputOffset - Offset in output buffer to start writing\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written\n */\n decodeToBuffer(input: Buffer, inputOffset: number, outSize: number, output: Buffer, outputOffset: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n // Solid mode: preserve dictionary state but reinitialize range decoder\n this.outWindow.init(true);\n }\n\n let outPos = outputOffset;\n const outEnd = outputOffset + outSize;\n let cumPos = this.totalPos;\n\n while (outPos < outEnd) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n output[outPos++] = this.prevByte;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break; // End marker\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n output[outPos++] = b;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos - outputOffset;\n }\n\n /**\n * Decode LZMA data\n * @param input - Compressed input buffer\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Decompressed data\n */\n decode(input: Buffer, inputOffset: number, outSize: number, solid = false): Buffer {\n const output = allocBufferUnsafe(outSize);\n this.decodeToBuffer(input, inputOffset, outSize, output, 0, solid);\n return output;\n }\n}\n\n/**\n * Decode LZMA1 data synchronously\n *\n * Note: LZMA1 is a low-level format. Native bindings (lzma-native) expect\n * self-describing data (like XZ), but here we accept raw LZMA with properties\n * specified separately. Pure JS implementation is used for LZMA1.\n *\n * @param input - Compressed data (without 5-byte properties header)\n * @param properties - 5-byte LZMA properties\n * @param outSize - Expected output size\n * @param outputSink - Optional output sink with write callback for streaming (returns bytes written)\n * @returns Decompressed data (or bytes written if outputSink provided)\n */\nexport function decodeLzma(input: Buffer, properties: Buffer | Uint8Array, outSize: number, outputSink?: { write(buffer: Buffer): void }): Buffer | number {\n const decoder = new LzmaDecoder(outputSink as OutputSink);\n decoder.setDecoderProperties(properties);\n if (outputSink) {\n // Zero-copy mode: write to sink during decode\n const bytesWritten = decoder.decodeWithSink(input, 0, outSize, false);\n decoder.flushOutWindow();\n return bytesWritten;\n }\n // Buffering mode: pre-allocated buffer, direct writes (zero-copy)\n return decoder.decode(input, 0, outSize, false);\n}\n"],"names":["LzmaDecoder","decodeLzma","LenDecoder","choice","initBitModels","lowCoder","midCoder","highCoder","BitTreeDecoder","numPosStates","create","init","i","decode","rangeDecoder","posState","decodeBit","LiteralDecoder2","decoders","decodeNormal","symbol","decodeWithMatchByte","matchByte","matchBit","bit","LiteralDecoder","numPosBits","numPrevBits","posMask","coders","length","getDecoder","pos","prevByte","index","decoder","OutWindow","sink","buffer","allocBufferUnsafe","windowSize","streamPos","solid","putByte","b","flush","size","chunk","bufferFrom","slice","write","getByte","distance","copyBlock","len","copyTo","output","outputOffset","count","srcPos","firstPart","copy","outputSink","outWindow","RangeDecoder","isMatchDecoders","kNumStates","kNumPosStatesBitsMax","isRepDecoders","isRepG0Decoders","isRepG1Decoders","isRepG2Decoders","isRep0LongDecoders","posSlotDecoder","posDecoders","kNumFullDistances","kEndPosModelIndex","posAlignDecoder","kNumAlignBits","lenDecoder","repLenDecoder","literalDecoder","kNumLenToPosStates","kNumPosSlotBits","dictionarySize","dictionarySizeCheck","posStateMask","state","rep0","rep1","rep2","rep3","totalPos","setDictionarySize","Math","max","setLcLpPb","lc","lp","pb","kNumLitContextBitsMax","setDecoderProperties","properties","props","parseProperties","initProbabilities","resetProbabilities","resetDictionary","feedUncompressed","data","flushOutWindow","decodeWithSink","input","inputOffset","outSize","setInput","outPos","cumPos","decoder2","stateIsCharState","stateUpdateChar","stateUpdateShortRep","kMatchMinLen","stateUpdateRep","stateUpdateMatch","posSlot","getLenToPosState","kStartPosModelIndex","numDirectBits","reverseDecodeFromArray","decodeDirectBits","reverseDecode","Error","decodeToBuffer","outEnd","bytesWritten"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/xz-compat/src/lzma/sync/LzmaDecoder.ts"],"sourcesContent":["/**\n * Synchronous LZMA1 Decoder\n *\n * Decodes LZMA1 compressed data from a buffer.\n * All operations are synchronous.\n */\n\nimport { allocBufferUnsafe, type BufferLike, bufferFrom } from 'extract-base-iterator';\nimport {\n getLenToPosState,\n initBitModels,\n kEndPosModelIndex,\n kMatchMinLen,\n kNumAlignBits,\n kNumFullDistances,\n kNumLenToPosStates,\n kNumLitContextBitsMax,\n kNumPosSlotBits,\n kNumPosStatesBitsMax,\n kNumStates,\n kStartPosModelIndex,\n type OutputSink,\n parseProperties,\n stateIsCharState,\n stateUpdateChar,\n stateUpdateMatch,\n stateUpdateRep,\n stateUpdateShortRep,\n} from '../types.ts';\nimport { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDecoder.ts';\n\n/**\n * Length decoder for match/rep lengths\n */\nclass LenDecoder {\n private choice: Uint16Array;\n private lowCoder: BitTreeDecoder[];\n private midCoder: BitTreeDecoder[];\n private highCoder: BitTreeDecoder;\n private numPosStates: number;\n\n constructor() {\n this.choice = initBitModels(null, 2);\n this.lowCoder = [];\n this.midCoder = [];\n this.highCoder = new BitTreeDecoder(8);\n this.numPosStates = 0;\n }\n\n create(numPosStates: number): void {\n for (; this.numPosStates < numPosStates; this.numPosStates++) {\n this.lowCoder[this.numPosStates] = new BitTreeDecoder(3);\n this.midCoder[this.numPosStates] = new BitTreeDecoder(3);\n }\n }\n\n init(): void {\n initBitModels(this.choice);\n for (let i = this.numPosStates - 1; i >= 0; i--) {\n this.lowCoder[i].init();\n this.midCoder[i].init();\n }\n this.highCoder.init();\n }\n\n decode(rangeDecoder: RangeDecoder, posState: number): number {\n if (rangeDecoder.decodeBit(this.choice, 0) === 0) {\n return this.lowCoder[posState].decode(rangeDecoder);\n }\n if (rangeDecoder.decodeBit(this.choice, 1) === 0) {\n return 8 + this.midCoder[posState].decode(rangeDecoder);\n }\n return 16 + this.highCoder.decode(rangeDecoder);\n }\n}\n\n/**\n * Single literal decoder (decodes one byte)\n */\nclass LiteralDecoder2 {\n private decoders: Uint16Array;\n\n constructor() {\n this.decoders = initBitModels(null, 0x300);\n }\n\n init(): void {\n initBitModels(this.decoders);\n }\n\n decodeNormal(rangeDecoder: RangeDecoder): number {\n let symbol = 1;\n do {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n\n decodeWithMatchByte(rangeDecoder: RangeDecoder, matchByte: number): number {\n let symbol = 1;\n do {\n const matchBit = (matchByte >> 7) & 1;\n matchByte <<= 1;\n const bit = rangeDecoder.decodeBit(this.decoders, ((1 + matchBit) << 8) + symbol);\n symbol = (symbol << 1) | bit;\n if (matchBit !== bit) {\n while (symbol < 0x100) {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n }\n break;\n }\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n}\n\n/**\n * Literal decoder (array of single decoders)\n */\nclass LiteralDecoder {\n private numPosBits: number;\n private numPrevBits: number;\n private posMask: number;\n private coders: (LiteralDecoder2 | undefined)[];\n\n constructor() {\n this.numPosBits = 0;\n this.numPrevBits = 0;\n this.posMask = 0;\n this.coders = [];\n }\n\n create(numPosBits: number, numPrevBits: number): void {\n if (this.coders.length > 0 && this.numPrevBits === numPrevBits && this.numPosBits === numPosBits) {\n return;\n }\n this.numPosBits = numPosBits;\n this.posMask = (1 << numPosBits) - 1;\n this.numPrevBits = numPrevBits;\n this.coders = [];\n }\n\n init(): void {\n for (let i = 0; i < this.coders.length; i++) {\n if (this.coders[i]) {\n this.coders[i]?.init();\n }\n }\n }\n\n getDecoder(pos: number, prevByte: number): LiteralDecoder2 {\n const index = ((pos & this.posMask) << this.numPrevBits) + ((prevByte & 0xff) >>> (8 - this.numPrevBits));\n let decoder = this.coders[index];\n if (!decoder) {\n decoder = new LiteralDecoder2();\n this.coders[index] = decoder;\n }\n return decoder;\n }\n}\n\n/**\n * Output window (sliding dictionary)\n */\nclass OutWindow {\n private buffer: Buffer;\n private windowSize: number;\n private pos: number;\n private sink?: {\n write(buffer: Buffer): void;\n };\n private streamPos: number;\n\n constructor(sink?: OutputSink) {\n this.buffer = allocBufferUnsafe(0); // Replaced by create() before use\n this.windowSize = 0;\n this.pos = 0;\n this.sink = sink;\n this.streamPos = 0;\n }\n\n create(windowSize: number): void {\n if (!this.buffer || this.windowSize !== windowSize) {\n this.buffer = allocBufferUnsafe(windowSize);\n }\n this.windowSize = windowSize;\n this.pos = 0;\n this.streamPos = 0;\n }\n\n init(solid: boolean): void {\n if (!solid) {\n this.pos = 0;\n this.streamPos = 0;\n }\n }\n\n putByte(b: number): void {\n this.buffer[this.pos++] = b;\n if (this.pos >= this.windowSize) {\n if (this.sink) {\n this.flush();\n this.pos = 0;\n this.streamPos = 0; // Reset streamPos after wrap to track new data from pos 0\n } else {\n this.pos = 0;\n }\n }\n }\n\n flush(): void {\n const size = this.pos - this.streamPos;\n if (size > 0 && this.sink) {\n // Use bufferFrom to create a COPY, not a view - the buffer is reused after wrapping\n const chunk = bufferFrom(this.buffer.slice(this.streamPos, this.streamPos + size));\n this.sink.write(chunk);\n this.streamPos = this.pos;\n }\n }\n\n getByte(distance: number): number {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n return this.buffer[pos];\n }\n\n copyBlock(distance: number, len: number): void {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n for (let i = 0; i < len; i++) {\n if (pos >= this.windowSize) {\n pos = 0;\n }\n this.putByte(this.buffer[pos++]);\n }\n }\n\n /**\n * Copy decoded data to output buffer\n */\n copyTo(output: Buffer, outputOffset: number, count: number): void {\n const srcPos = this.pos - count;\n if (srcPos < 0) {\n // Wrap around case - data spans end and beginning of buffer\n const firstPart = -srcPos;\n this.buffer.copy(output, outputOffset, this.windowSize + srcPos, this.windowSize);\n this.buffer.copy(output, outputOffset + firstPart, 0, count - firstPart);\n } else {\n this.buffer.copy(output, outputOffset, srcPos, srcPos + count);\n }\n }\n}\n\n/**\n * Synchronous LZMA1 decoder\n */\nexport class LzmaDecoder {\n private outWindow: OutWindow;\n private rangeDecoder: RangeDecoder;\n\n // Probability models\n private isMatchDecoders: Uint16Array;\n private isRepDecoders: Uint16Array;\n private isRepG0Decoders: Uint16Array;\n private isRepG1Decoders: Uint16Array;\n private isRepG2Decoders: Uint16Array;\n private isRep0LongDecoders: Uint16Array;\n private posSlotDecoder: BitTreeDecoder[];\n private posDecoders: Uint16Array;\n private posAlignDecoder: BitTreeDecoder;\n private lenDecoder: LenDecoder;\n private repLenDecoder: LenDecoder;\n private literalDecoder: LiteralDecoder;\n\n // Properties\n private dictionarySize: number;\n private dictionarySizeCheck: number;\n private posStateMask: number;\n\n // State (preserved across solid calls)\n private state: number;\n private rep0: number;\n private rep1: number;\n private rep2: number;\n private rep3: number;\n private prevByte: number;\n private totalPos: number;\n\n constructor(outputSink?: OutputSink) {\n this.outWindow = new OutWindow(outputSink);\n this.rangeDecoder = new RangeDecoder();\n\n this.isMatchDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.isRepDecoders = initBitModels(null, kNumStates);\n this.isRepG0Decoders = initBitModels(null, kNumStates);\n this.isRepG1Decoders = initBitModels(null, kNumStates);\n this.isRepG2Decoders = initBitModels(null, kNumStates);\n this.isRep0LongDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.posSlotDecoder = [];\n this.posDecoders = initBitModels(null, kNumFullDistances - kEndPosModelIndex);\n this.posAlignDecoder = new BitTreeDecoder(kNumAlignBits);\n this.lenDecoder = new LenDecoder();\n this.repLenDecoder = new LenDecoder();\n this.literalDecoder = new LiteralDecoder();\n\n for (let i = 0; i < kNumLenToPosStates; i++) {\n this.posSlotDecoder[i] = new BitTreeDecoder(kNumPosSlotBits);\n }\n\n this.dictionarySize = -1;\n this.dictionarySizeCheck = -1;\n this.posStateMask = 0;\n\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n }\n\n /**\n * Set dictionary size\n */\n setDictionarySize(dictionarySize: number): boolean {\n if (dictionarySize < 0) return false;\n if (this.dictionarySize !== dictionarySize) {\n this.dictionarySize = dictionarySize;\n this.dictionarySizeCheck = Math.max(dictionarySize, 1);\n this.outWindow.create(Math.max(this.dictionarySizeCheck, 1 << 12));\n }\n return true;\n }\n\n /**\n * Set lc, lp, pb properties\n */\n setLcLpPb(lc: number, lp: number, pb: number): boolean {\n if (lc > kNumLitContextBitsMax || lp > 4 || pb > kNumPosStatesBitsMax) {\n return false;\n }\n const numPosStates = 1 << pb;\n this.literalDecoder.create(lp, lc);\n this.lenDecoder.create(numPosStates);\n this.repLenDecoder.create(numPosStates);\n this.posStateMask = numPosStates - 1;\n return true;\n }\n\n /**\n * Set decoder properties from 5-byte buffer\n */\n setDecoderProperties(properties: Buffer | Uint8Array): boolean {\n const props = parseProperties(properties);\n if (!this.setLcLpPb(props.lc, props.lp, props.pb)) return false;\n return this.setDictionarySize(props.dictionarySize);\n }\n\n /**\n * Initialize probability tables\n */\n private initProbabilities(): void {\n initBitModels(this.isMatchDecoders);\n initBitModels(this.isRepDecoders);\n initBitModels(this.isRepG0Decoders);\n initBitModels(this.isRepG1Decoders);\n initBitModels(this.isRepG2Decoders);\n initBitModels(this.isRep0LongDecoders);\n initBitModels(this.posDecoders);\n this.literalDecoder.init();\n for (let i = kNumLenToPosStates - 1; i >= 0; i--) {\n this.posSlotDecoder[i].init();\n }\n this.lenDecoder.init();\n this.repLenDecoder.init();\n this.posAlignDecoder.init();\n }\n\n /**\n * Reset probabilities only (for LZMA2 state reset)\n */\n resetProbabilities(): void {\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n }\n\n /**\n * Reset dictionary position (for LZMA2 dictionary reset)\n */\n resetDictionary(): void {\n this.outWindow.init(false);\n this.totalPos = 0;\n }\n\n /**\n * Feed uncompressed data into the dictionary (for LZMA2 uncompressed chunks)\n * This updates the sliding window so subsequent LZMA chunks can reference this data.\n */\n feedUncompressed(data: Buffer): void {\n for (let i = 0; i < data.length; i++) {\n this.outWindow.putByte(data[i]);\n }\n this.totalPos += data.length;\n if (data.length > 0) {\n this.prevByte = data[data.length - 1];\n }\n }\n\n /**\n * Flush any remaining data in the OutWindow to the sink\n */\n flushOutWindow(): void {\n this.outWindow.flush();\n }\n\n /**\n * Decode LZMA data with streaming output (no buffer accumulation)\n * @param input - Compressed input buffer or BufferList\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written to sink\n */\n decodeWithSink(input: BufferLike, inputOffset: number, outSize: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n this.outWindow.init(true);\n }\n\n let outPos = 0;\n let cumPos = this.totalPos;\n\n while (outPos < outSize) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n outPos++;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break;\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n outPos++;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos;\n }\n\n /**\n * Decode LZMA data directly into caller's buffer (zero-copy)\n * @param input - Compressed input buffer or BufferList\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param output - Pre-allocated output buffer to write to\n * @param outputOffset - Offset in output buffer to start writing\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written\n */\n decodeToBuffer(input: BufferLike, inputOffset: number, outSize: number, output: Buffer, outputOffset: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n // Solid mode: preserve dictionary state but reinitialize range decoder\n this.outWindow.init(true);\n }\n\n let outPos = outputOffset;\n const outEnd = outputOffset + outSize;\n let cumPos = this.totalPos;\n\n while (outPos < outEnd) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n output[outPos++] = this.prevByte;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break; // End marker\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n output[outPos++] = b;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos - outputOffset;\n }\n\n /**\n * Decode LZMA data\n * @param input - Compressed input buffer or BufferList\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Decompressed data\n */\n decode(input: BufferLike, inputOffset: number, outSize: number, solid = false): Buffer {\n const output = allocBufferUnsafe(outSize);\n this.decodeToBuffer(input, inputOffset, outSize, output, 0, solid);\n return output;\n }\n}\n\n/**\n * Decode LZMA1 data synchronously\n *\n * Note: LZMA1 is a low-level format. Native bindings (lzma-native) expect\n * self-describing data (like XZ), but here we accept raw LZMA with properties\n * specified separately. Pure JS implementation is used for LZMA1.\n *\n * @param input - Compressed data (without 5-byte properties header) or BufferList\n * @param properties - 5-byte LZMA properties\n * @param outSize - Expected output size\n * @param outputSink - Optional output sink with write callback for streaming (returns bytes written)\n * @returns Decompressed data (or bytes written if outputSink provided)\n */\nexport function decodeLzma(input: BufferLike, properties: Buffer | Uint8Array, outSize: number, outputSink?: { write(buffer: Buffer): void }): Buffer | number {\n const decoder = new LzmaDecoder(outputSink as OutputSink);\n decoder.setDecoderProperties(properties);\n if (outputSink) {\n // Zero-copy mode: write to sink during decode\n const bytesWritten = decoder.decodeWithSink(input, 0, outSize, false);\n decoder.flushOutWindow();\n return bytesWritten;\n }\n // Buffering mode: pre-allocated buffer, direct writes (zero-copy)\n return decoder.decode(input, 0, outSize, false);\n}\n"],"names":["LzmaDecoder","decodeLzma","LenDecoder","choice","initBitModels","lowCoder","midCoder","highCoder","BitTreeDecoder","numPosStates","create","init","i","decode","rangeDecoder","posState","decodeBit","LiteralDecoder2","decoders","decodeNormal","symbol","decodeWithMatchByte","matchByte","matchBit","bit","LiteralDecoder","numPosBits","numPrevBits","posMask","coders","length","getDecoder","pos","prevByte","index","decoder","OutWindow","sink","buffer","allocBufferUnsafe","windowSize","streamPos","solid","putByte","b","flush","size","chunk","bufferFrom","slice","write","getByte","distance","copyBlock","len","copyTo","output","outputOffset","count","srcPos","firstPart","copy","outputSink","outWindow","RangeDecoder","isMatchDecoders","kNumStates","kNumPosStatesBitsMax","isRepDecoders","isRepG0Decoders","isRepG1Decoders","isRepG2Decoders","isRep0LongDecoders","posSlotDecoder","posDecoders","kNumFullDistances","kEndPosModelIndex","posAlignDecoder","kNumAlignBits","lenDecoder","repLenDecoder","literalDecoder","kNumLenToPosStates","kNumPosSlotBits","dictionarySize","dictionarySizeCheck","posStateMask","state","rep0","rep1","rep2","rep3","totalPos","setDictionarySize","Math","max","setLcLpPb","lc","lp","pb","kNumLitContextBitsMax","setDecoderProperties","properties","props","parseProperties","initProbabilities","resetProbabilities","resetDictionary","feedUncompressed","data","flushOutWindow","decodeWithSink","input","inputOffset","outSize","setInput","outPos","cumPos","decoder2","stateIsCharState","stateUpdateChar","stateUpdateShortRep","kMatchMinLen","stateUpdateRep","stateUpdateMatch","posSlot","getLenToPosState","kStartPosModelIndex","numDirectBits","reverseDecodeFromArray","decodeDirectBits","reverseDecode","Error","decodeToBuffer","outEnd","bytesWritten"],"mappings":"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"}
|
|
@@ -4,19 +4,20 @@
|
|
|
4
4
|
* Decodes arithmetic-coded bits from a buffer.
|
|
5
5
|
* All operations are synchronous - for streaming use the async version.
|
|
6
6
|
*/
|
|
7
|
+
import type { BufferLike } from 'extract-base-iterator';
|
|
7
8
|
/**
|
|
8
9
|
* Range decoder for synchronous buffer-based LZMA decoding
|
|
9
10
|
*/
|
|
10
11
|
export declare class RangeDecoder {
|
|
11
|
-
private input;
|
|
12
12
|
private pos;
|
|
13
13
|
private code;
|
|
14
14
|
private range;
|
|
15
|
+
private getByte;
|
|
15
16
|
constructor();
|
|
16
17
|
/**
|
|
17
18
|
* Set input buffer and initialize decoder state
|
|
18
19
|
*/
|
|
19
|
-
setInput(input:
|
|
20
|
+
setInput(input: BufferLike, offset?: number): void;
|
|
20
21
|
/**
|
|
21
22
|
* Initialize range decoder (reads first 5 bytes)
|
|
22
23
|
*/
|
|
@@ -4,19 +4,20 @@
|
|
|
4
4
|
* Decodes arithmetic-coded bits from a buffer.
|
|
5
5
|
* All operations are synchronous - for streaming use the async version.
|
|
6
6
|
*/
|
|
7
|
+
import type { BufferLike } from 'extract-base-iterator';
|
|
7
8
|
/**
|
|
8
9
|
* Range decoder for synchronous buffer-based LZMA decoding
|
|
9
10
|
*/
|
|
10
11
|
export declare class RangeDecoder {
|
|
11
|
-
private input;
|
|
12
12
|
private pos;
|
|
13
13
|
private code;
|
|
14
14
|
private range;
|
|
15
|
+
private getByte;
|
|
15
16
|
constructor();
|
|
16
17
|
/**
|
|
17
18
|
* Set input buffer and initialize decoder state
|
|
18
19
|
*/
|
|
19
|
-
setInput(input:
|
|
20
|
+
setInput(input: BufferLike, offset?: number): void;
|
|
20
21
|
/**
|
|
21
22
|
* Initialize range decoder (reads first 5 bytes)
|
|
22
23
|
*/
|
|
@@ -24,7 +24,6 @@ _export(exports, {
|
|
|
24
24
|
return reverseDecodeFromArray;
|
|
25
25
|
}
|
|
26
26
|
});
|
|
27
|
-
var _extractbaseiterator = require("extract-base-iterator");
|
|
28
27
|
function _class_call_check(instance, Constructor) {
|
|
29
28
|
if (!(instance instanceof Constructor)) {
|
|
30
29
|
throw new TypeError("Cannot call a class as a function");
|
|
@@ -34,18 +33,25 @@ var RangeDecoder = /*#__PURE__*/ function() {
|
|
|
34
33
|
"use strict";
|
|
35
34
|
function RangeDecoder() {
|
|
36
35
|
_class_call_check(this, RangeDecoder);
|
|
37
|
-
this.input = (0, _extractbaseiterator.allocBuffer)(0); // Replaced by setInput() before use
|
|
38
36
|
this.pos = 0;
|
|
39
37
|
this.code = 0;
|
|
40
38
|
this.range = 0;
|
|
39
|
+
this.getByte = function() {
|
|
40
|
+
return 0;
|
|
41
|
+
};
|
|
41
42
|
}
|
|
42
43
|
var _proto = RangeDecoder.prototype;
|
|
43
44
|
/**
|
|
44
45
|
* Set input buffer and initialize decoder state
|
|
45
46
|
*/ _proto.setInput = function setInput(input) {
|
|
46
47
|
var offset = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0;
|
|
47
|
-
this.input = input;
|
|
48
48
|
this.pos = offset;
|
|
49
|
+
// One-time binding for byte access (avoids repeated Buffer.isBuffer checks)
|
|
50
|
+
this.getByte = Buffer.isBuffer(input) ? function(o) {
|
|
51
|
+
return input[o];
|
|
52
|
+
} : function(o) {
|
|
53
|
+
return input.readByte(o);
|
|
54
|
+
};
|
|
49
55
|
this.init();
|
|
50
56
|
};
|
|
51
57
|
/**
|
|
@@ -57,7 +63,7 @@ var RangeDecoder = /*#__PURE__*/ function() {
|
|
|
57
63
|
this.pos++;
|
|
58
64
|
// Read 4 bytes into code
|
|
59
65
|
for(var i = 0; i < 4; i++){
|
|
60
|
-
this.code = this.code << 8 | this.
|
|
66
|
+
this.code = this.code << 8 | this.getByte(this.pos++);
|
|
61
67
|
}
|
|
62
68
|
};
|
|
63
69
|
/**
|
|
@@ -69,7 +75,7 @@ var RangeDecoder = /*#__PURE__*/ function() {
|
|
|
69
75
|
* Normalize range if needed (read more bytes)
|
|
70
76
|
*/ _proto.normalize = function normalize() {
|
|
71
77
|
if ((this.range & 0xff000000) === 0) {
|
|
72
|
-
this.code = this.code << 8 | this.
|
|
78
|
+
this.code = this.code << 8 | this.getByte(this.pos++);
|
|
73
79
|
this.range <<= 8;
|
|
74
80
|
}
|
|
75
81
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/xz-compat/src/lzma/sync/RangeDecoder.ts"],"sourcesContent":["/**\n * Synchronous Range Decoder for LZMA\n *\n * Decodes arithmetic-coded bits from a buffer.\n * All operations are synchronous - for streaming use the async version.\n */\n\nimport {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/xz-compat/src/lzma/sync/RangeDecoder.ts"],"sourcesContent":["/**\n * Synchronous Range Decoder for LZMA\n *\n * Decodes arithmetic-coded bits from a buffer.\n * All operations are synchronous - for streaming use the async version.\n */\n\nimport type { BufferLike } from 'extract-base-iterator';\n\n/**\n * Range decoder for synchronous buffer-based LZMA decoding\n */\nexport class RangeDecoder {\n private pos: number;\n private code: number;\n private range: number;\n private getByte: (offset: number) => number;\n\n constructor() {\n this.pos = 0;\n this.code = 0;\n this.range = 0;\n this.getByte = () => 0;\n }\n\n /**\n * Set input buffer and initialize decoder state\n */\n setInput(input: BufferLike, offset = 0): void {\n this.pos = offset;\n // One-time binding for byte access (avoids repeated Buffer.isBuffer checks)\n this.getByte = Buffer.isBuffer(input) ? (o) => input[o] : (o) => input.readByte(o);\n this.init();\n }\n\n /**\n * Initialize range decoder (reads first 5 bytes)\n */\n private init(): void {\n this.code = 0;\n this.range = -1; // 0xFFFFFFFF as signed int\n\n // First byte is ignored (should be 0)\n this.pos++;\n\n // Read 4 bytes into code\n for (let i = 0; i < 4; i++) {\n this.code = (this.code << 8) | this.getByte(this.pos++);\n }\n }\n\n /**\n * Get current position in input buffer\n */\n getPosition(): number {\n return this.pos;\n }\n\n /**\n * Normalize range if needed (read more bytes)\n */\n private normalize(): void {\n if ((this.range & 0xff000000) === 0) {\n this.code = (this.code << 8) | this.getByte(this.pos++);\n this.range <<= 8;\n }\n }\n\n /**\n * Decode a single bit using probability model\n * @param probs - Probability array\n * @param index - Index into probability array\n * @returns Decoded bit (0 or 1)\n */\n decodeBit(probs: Uint16Array, index: number): number {\n const prob = probs[index];\n const newBound = (this.range >>> 11) * prob;\n\n if ((this.code ^ 0x80000000) < (newBound ^ 0x80000000)) {\n this.range = newBound;\n probs[index] += (2048 - prob) >>> 5;\n this.normalize();\n return 0;\n }\n this.range -= newBound;\n this.code -= newBound;\n probs[index] -= prob >>> 5;\n this.normalize();\n return 1;\n }\n\n /**\n * Decode direct bits (not probability-based)\n * @param numTotalBits - Number of bits to decode\n * @returns Decoded value\n */\n decodeDirectBits(numTotalBits: number): number {\n let result = 0;\n for (let i = numTotalBits; i > 0; i--) {\n this.range >>>= 1;\n const t = (this.code - this.range) >>> 31;\n this.code -= this.range & (t - 1);\n result = (result << 1) | (1 - t);\n this.normalize();\n }\n return result;\n }\n}\n\n/**\n * Bit tree decoder for multi-bit symbols\n */\nexport class BitTreeDecoder {\n private numBitLevels: number;\n private models: Uint16Array;\n\n constructor(numBitLevels: number) {\n this.numBitLevels = numBitLevels;\n this.models = new Uint16Array(1 << numBitLevels);\n this.init();\n }\n\n /**\n * Initialize probability models\n */\n init(): void {\n for (let i = 0; i < this.models.length; i++) {\n this.models[i] = 1024; // kProbInitValue\n }\n }\n\n /**\n * Decode a symbol (forward bit order)\n */\n decode(rangeDecoder: RangeDecoder): number {\n let m = 1;\n for (let i = this.numBitLevels; i > 0; i--) {\n m = (m << 1) | rangeDecoder.decodeBit(this.models, m);\n }\n return m - (1 << this.numBitLevels);\n }\n\n /**\n * Decode a symbol (reverse bit order)\n */\n reverseDecode(rangeDecoder: RangeDecoder): number {\n let m = 1;\n let symbol = 0;\n for (let i = 0; i < this.numBitLevels; i++) {\n const bit = rangeDecoder.decodeBit(this.models, m);\n m = (m << 1) | bit;\n symbol |= bit << i;\n }\n return symbol;\n }\n}\n\n/**\n * Static reverse decode from external probability array\n */\nexport function reverseDecodeFromArray(models: Uint16Array, startIndex: number, rangeDecoder: RangeDecoder, numBitLevels: number): number {\n let m = 1;\n let symbol = 0;\n for (let i = 0; i < numBitLevels; i++) {\n const bit = rangeDecoder.decodeBit(models, startIndex + m);\n m = (m << 1) | bit;\n symbol |= bit << i;\n }\n return symbol;\n}\n"],"names":["BitTreeDecoder","RangeDecoder","reverseDecodeFromArray","pos","code","range","getByte","setInput","input","offset","Buffer","isBuffer","o","readByte","init","i","getPosition","normalize","decodeBit","probs","index","prob","newBound","decodeDirectBits","numTotalBits","result","t","numBitLevels","models","Uint16Array","length","decode","rangeDecoder","m","reverseDecode","symbol","bit","startIndex"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Decodes LZMA1 compressed data from a buffer.
|
|
5
5
|
* All operations are synchronous.
|
|
6
6
|
*/
|
|
7
|
+
import { type BufferLike } from 'extract-base-iterator';
|
|
7
8
|
import { type OutputSink } from '../types.js';
|
|
8
9
|
/**
|
|
9
10
|
* Synchronous LZMA1 decoder
|
|
@@ -69,16 +70,16 @@ export declare class LzmaDecoder {
|
|
|
69
70
|
flushOutWindow(): void;
|
|
70
71
|
/**
|
|
71
72
|
* Decode LZMA data with streaming output (no buffer accumulation)
|
|
72
|
-
* @param input - Compressed input buffer
|
|
73
|
+
* @param input - Compressed input buffer or BufferList
|
|
73
74
|
* @param inputOffset - Offset into input buffer
|
|
74
75
|
* @param outSize - Expected output size
|
|
75
76
|
* @param solid - If true, preserve state from previous decode
|
|
76
77
|
* @returns Number of bytes written to sink
|
|
77
78
|
*/
|
|
78
|
-
decodeWithSink(input:
|
|
79
|
+
decodeWithSink(input: BufferLike, inputOffset: number, outSize: number, solid?: boolean): number;
|
|
79
80
|
/**
|
|
80
81
|
* Decode LZMA data directly into caller's buffer (zero-copy)
|
|
81
|
-
* @param input - Compressed input buffer
|
|
82
|
+
* @param input - Compressed input buffer or BufferList
|
|
82
83
|
* @param inputOffset - Offset into input buffer
|
|
83
84
|
* @param outSize - Expected output size
|
|
84
85
|
* @param output - Pre-allocated output buffer to write to
|
|
@@ -86,16 +87,16 @@ export declare class LzmaDecoder {
|
|
|
86
87
|
* @param solid - If true, preserve state from previous decode
|
|
87
88
|
* @returns Number of bytes written
|
|
88
89
|
*/
|
|
89
|
-
decodeToBuffer(input:
|
|
90
|
+
decodeToBuffer(input: BufferLike, inputOffset: number, outSize: number, output: Buffer, outputOffset: number, solid?: boolean): number;
|
|
90
91
|
/**
|
|
91
92
|
* Decode LZMA data
|
|
92
|
-
* @param input - Compressed input buffer
|
|
93
|
+
* @param input - Compressed input buffer or BufferList
|
|
93
94
|
* @param inputOffset - Offset into input buffer
|
|
94
95
|
* @param outSize - Expected output size
|
|
95
96
|
* @param solid - If true, preserve state from previous decode
|
|
96
97
|
* @returns Decompressed data
|
|
97
98
|
*/
|
|
98
|
-
decode(input:
|
|
99
|
+
decode(input: BufferLike, inputOffset: number, outSize: number, solid?: boolean): Buffer;
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
101
102
|
* Decode LZMA1 data synchronously
|
|
@@ -104,12 +105,12 @@ export declare class LzmaDecoder {
|
|
|
104
105
|
* self-describing data (like XZ), but here we accept raw LZMA with properties
|
|
105
106
|
* specified separately. Pure JS implementation is used for LZMA1.
|
|
106
107
|
*
|
|
107
|
-
* @param input - Compressed data (without 5-byte properties header)
|
|
108
|
+
* @param input - Compressed data (without 5-byte properties header) or BufferList
|
|
108
109
|
* @param properties - 5-byte LZMA properties
|
|
109
110
|
* @param outSize - Expected output size
|
|
110
111
|
* @param outputSink - Optional output sink with write callback for streaming (returns bytes written)
|
|
111
112
|
* @returns Decompressed data (or bytes written if outputSink provided)
|
|
112
113
|
*/
|
|
113
|
-
export declare function decodeLzma(input:
|
|
114
|
+
export declare function decodeLzma(input: BufferLike, properties: Buffer | Uint8Array, outSize: number, outputSink?: {
|
|
114
115
|
write(buffer: Buffer): void;
|
|
115
116
|
}): Buffer | number;
|
|
@@ -274,7 +274,7 @@ import { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDec
|
|
|
274
274
|
}
|
|
275
275
|
/**
|
|
276
276
|
* Decode LZMA data with streaming output (no buffer accumulation)
|
|
277
|
-
* @param input - Compressed input buffer
|
|
277
|
+
* @param input - Compressed input buffer or BufferList
|
|
278
278
|
* @param inputOffset - Offset into input buffer
|
|
279
279
|
* @param outSize - Expected output size
|
|
280
280
|
* @param solid - If true, preserve state from previous decode
|
|
@@ -384,7 +384,7 @@ import { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDec
|
|
|
384
384
|
}
|
|
385
385
|
/**
|
|
386
386
|
* Decode LZMA data directly into caller's buffer (zero-copy)
|
|
387
|
-
* @param input - Compressed input buffer
|
|
387
|
+
* @param input - Compressed input buffer or BufferList
|
|
388
388
|
* @param inputOffset - Offset into input buffer
|
|
389
389
|
* @param outSize - Expected output size
|
|
390
390
|
* @param output - Pre-allocated output buffer to write to
|
|
@@ -498,7 +498,7 @@ import { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDec
|
|
|
498
498
|
}
|
|
499
499
|
/**
|
|
500
500
|
* Decode LZMA data
|
|
501
|
-
* @param input - Compressed input buffer
|
|
501
|
+
* @param input - Compressed input buffer or BufferList
|
|
502
502
|
* @param inputOffset - Offset into input buffer
|
|
503
503
|
* @param outSize - Expected output size
|
|
504
504
|
* @param solid - If true, preserve state from previous decode
|
|
@@ -545,7 +545,7 @@ import { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDec
|
|
|
545
545
|
* self-describing data (like XZ), but here we accept raw LZMA with properties
|
|
546
546
|
* specified separately. Pure JS implementation is used for LZMA1.
|
|
547
547
|
*
|
|
548
|
-
* @param input - Compressed data (without 5-byte properties header)
|
|
548
|
+
* @param input - Compressed data (without 5-byte properties header) or BufferList
|
|
549
549
|
* @param properties - 5-byte LZMA properties
|
|
550
550
|
* @param outSize - Expected output size
|
|
551
551
|
* @param outputSink - Optional output sink with write callback for streaming (returns bytes written)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/xz-compat/src/lzma/sync/LzmaDecoder.ts"],"sourcesContent":["/**\n * Synchronous LZMA1 Decoder\n *\n * Decodes LZMA1 compressed data from a buffer.\n * All operations are synchronous.\n */\n\nimport { allocBufferUnsafe, bufferFrom } from 'extract-base-iterator';\nimport {\n getLenToPosState,\n initBitModels,\n kEndPosModelIndex,\n kMatchMinLen,\n kNumAlignBits,\n kNumFullDistances,\n kNumLenToPosStates,\n kNumLitContextBitsMax,\n kNumPosSlotBits,\n kNumPosStatesBitsMax,\n kNumStates,\n kStartPosModelIndex,\n type OutputSink,\n parseProperties,\n stateIsCharState,\n stateUpdateChar,\n stateUpdateMatch,\n stateUpdateRep,\n stateUpdateShortRep,\n} from '../types.ts';\nimport { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDecoder.ts';\n\n/**\n * Length decoder for match/rep lengths\n */\nclass LenDecoder {\n private choice: Uint16Array;\n private lowCoder: BitTreeDecoder[];\n private midCoder: BitTreeDecoder[];\n private highCoder: BitTreeDecoder;\n private numPosStates: number;\n\n constructor() {\n this.choice = initBitModels(null, 2);\n this.lowCoder = [];\n this.midCoder = [];\n this.highCoder = new BitTreeDecoder(8);\n this.numPosStates = 0;\n }\n\n create(numPosStates: number): void {\n for (; this.numPosStates < numPosStates; this.numPosStates++) {\n this.lowCoder[this.numPosStates] = new BitTreeDecoder(3);\n this.midCoder[this.numPosStates] = new BitTreeDecoder(3);\n }\n }\n\n init(): void {\n initBitModels(this.choice);\n for (let i = this.numPosStates - 1; i >= 0; i--) {\n this.lowCoder[i].init();\n this.midCoder[i].init();\n }\n this.highCoder.init();\n }\n\n decode(rangeDecoder: RangeDecoder, posState: number): number {\n if (rangeDecoder.decodeBit(this.choice, 0) === 0) {\n return this.lowCoder[posState].decode(rangeDecoder);\n }\n if (rangeDecoder.decodeBit(this.choice, 1) === 0) {\n return 8 + this.midCoder[posState].decode(rangeDecoder);\n }\n return 16 + this.highCoder.decode(rangeDecoder);\n }\n}\n\n/**\n * Single literal decoder (decodes one byte)\n */\nclass LiteralDecoder2 {\n private decoders: Uint16Array;\n\n constructor() {\n this.decoders = initBitModels(null, 0x300);\n }\n\n init(): void {\n initBitModels(this.decoders);\n }\n\n decodeNormal(rangeDecoder: RangeDecoder): number {\n let symbol = 1;\n do {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n\n decodeWithMatchByte(rangeDecoder: RangeDecoder, matchByte: number): number {\n let symbol = 1;\n do {\n const matchBit = (matchByte >> 7) & 1;\n matchByte <<= 1;\n const bit = rangeDecoder.decodeBit(this.decoders, ((1 + matchBit) << 8) + symbol);\n symbol = (symbol << 1) | bit;\n if (matchBit !== bit) {\n while (symbol < 0x100) {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n }\n break;\n }\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n}\n\n/**\n * Literal decoder (array of single decoders)\n */\nclass LiteralDecoder {\n private numPosBits: number;\n private numPrevBits: number;\n private posMask: number;\n private coders: (LiteralDecoder2 | undefined)[];\n\n constructor() {\n this.numPosBits = 0;\n this.numPrevBits = 0;\n this.posMask = 0;\n this.coders = [];\n }\n\n create(numPosBits: number, numPrevBits: number): void {\n if (this.coders.length > 0 && this.numPrevBits === numPrevBits && this.numPosBits === numPosBits) {\n return;\n }\n this.numPosBits = numPosBits;\n this.posMask = (1 << numPosBits) - 1;\n this.numPrevBits = numPrevBits;\n this.coders = [];\n }\n\n init(): void {\n for (let i = 0; i < this.coders.length; i++) {\n if (this.coders[i]) {\n this.coders[i]?.init();\n }\n }\n }\n\n getDecoder(pos: number, prevByte: number): LiteralDecoder2 {\n const index = ((pos & this.posMask) << this.numPrevBits) + ((prevByte & 0xff) >>> (8 - this.numPrevBits));\n let decoder = this.coders[index];\n if (!decoder) {\n decoder = new LiteralDecoder2();\n this.coders[index] = decoder;\n }\n return decoder;\n }\n}\n\n/**\n * Output window (sliding dictionary)\n */\nclass OutWindow {\n private buffer: Buffer;\n private windowSize: number;\n private pos: number;\n private sink?: {\n write(buffer: Buffer): void;\n };\n private streamPos: number;\n\n constructor(sink?: OutputSink) {\n this.buffer = allocBufferUnsafe(0); // Replaced by create() before use\n this.windowSize = 0;\n this.pos = 0;\n this.sink = sink;\n this.streamPos = 0;\n }\n\n create(windowSize: number): void {\n if (!this.buffer || this.windowSize !== windowSize) {\n this.buffer = allocBufferUnsafe(windowSize);\n }\n this.windowSize = windowSize;\n this.pos = 0;\n this.streamPos = 0;\n }\n\n init(solid: boolean): void {\n if (!solid) {\n this.pos = 0;\n this.streamPos = 0;\n }\n }\n\n putByte(b: number): void {\n this.buffer[this.pos++] = b;\n if (this.pos >= this.windowSize) {\n if (this.sink) {\n this.flush();\n this.pos = 0;\n this.streamPos = 0; // Reset streamPos after wrap to track new data from pos 0\n } else {\n this.pos = 0;\n }\n }\n }\n\n flush(): void {\n const size = this.pos - this.streamPos;\n if (size > 0 && this.sink) {\n // Use bufferFrom to create a COPY, not a view - the buffer is reused after wrapping\n const chunk = bufferFrom(this.buffer.slice(this.streamPos, this.streamPos + size));\n this.sink.write(chunk);\n this.streamPos = this.pos;\n }\n }\n\n getByte(distance: number): number {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n return this.buffer[pos];\n }\n\n copyBlock(distance: number, len: number): void {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n for (let i = 0; i < len; i++) {\n if (pos >= this.windowSize) {\n pos = 0;\n }\n this.putByte(this.buffer[pos++]);\n }\n }\n\n /**\n * Copy decoded data to output buffer\n */\n copyTo(output: Buffer, outputOffset: number, count: number): void {\n const srcPos = this.pos - count;\n if (srcPos < 0) {\n // Wrap around case - data spans end and beginning of buffer\n const firstPart = -srcPos;\n this.buffer.copy(output, outputOffset, this.windowSize + srcPos, this.windowSize);\n this.buffer.copy(output, outputOffset + firstPart, 0, count - firstPart);\n } else {\n this.buffer.copy(output, outputOffset, srcPos, srcPos + count);\n }\n }\n}\n\n/**\n * Synchronous LZMA1 decoder\n */\nexport class LzmaDecoder {\n private outWindow: OutWindow;\n private rangeDecoder: RangeDecoder;\n\n // Probability models\n private isMatchDecoders: Uint16Array;\n private isRepDecoders: Uint16Array;\n private isRepG0Decoders: Uint16Array;\n private isRepG1Decoders: Uint16Array;\n private isRepG2Decoders: Uint16Array;\n private isRep0LongDecoders: Uint16Array;\n private posSlotDecoder: BitTreeDecoder[];\n private posDecoders: Uint16Array;\n private posAlignDecoder: BitTreeDecoder;\n private lenDecoder: LenDecoder;\n private repLenDecoder: LenDecoder;\n private literalDecoder: LiteralDecoder;\n\n // Properties\n private dictionarySize: number;\n private dictionarySizeCheck: number;\n private posStateMask: number;\n\n // State (preserved across solid calls)\n private state: number;\n private rep0: number;\n private rep1: number;\n private rep2: number;\n private rep3: number;\n private prevByte: number;\n private totalPos: number;\n\n constructor(outputSink?: OutputSink) {\n this.outWindow = new OutWindow(outputSink);\n this.rangeDecoder = new RangeDecoder();\n\n this.isMatchDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.isRepDecoders = initBitModels(null, kNumStates);\n this.isRepG0Decoders = initBitModels(null, kNumStates);\n this.isRepG1Decoders = initBitModels(null, kNumStates);\n this.isRepG2Decoders = initBitModels(null, kNumStates);\n this.isRep0LongDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.posSlotDecoder = [];\n this.posDecoders = initBitModels(null, kNumFullDistances - kEndPosModelIndex);\n this.posAlignDecoder = new BitTreeDecoder(kNumAlignBits);\n this.lenDecoder = new LenDecoder();\n this.repLenDecoder = new LenDecoder();\n this.literalDecoder = new LiteralDecoder();\n\n for (let i = 0; i < kNumLenToPosStates; i++) {\n this.posSlotDecoder[i] = new BitTreeDecoder(kNumPosSlotBits);\n }\n\n this.dictionarySize = -1;\n this.dictionarySizeCheck = -1;\n this.posStateMask = 0;\n\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n }\n\n /**\n * Set dictionary size\n */\n setDictionarySize(dictionarySize: number): boolean {\n if (dictionarySize < 0) return false;\n if (this.dictionarySize !== dictionarySize) {\n this.dictionarySize = dictionarySize;\n this.dictionarySizeCheck = Math.max(dictionarySize, 1);\n this.outWindow.create(Math.max(this.dictionarySizeCheck, 1 << 12));\n }\n return true;\n }\n\n /**\n * Set lc, lp, pb properties\n */\n setLcLpPb(lc: number, lp: number, pb: number): boolean {\n if (lc > kNumLitContextBitsMax || lp > 4 || pb > kNumPosStatesBitsMax) {\n return false;\n }\n const numPosStates = 1 << pb;\n this.literalDecoder.create(lp, lc);\n this.lenDecoder.create(numPosStates);\n this.repLenDecoder.create(numPosStates);\n this.posStateMask = numPosStates - 1;\n return true;\n }\n\n /**\n * Set decoder properties from 5-byte buffer\n */\n setDecoderProperties(properties: Buffer | Uint8Array): boolean {\n const props = parseProperties(properties);\n if (!this.setLcLpPb(props.lc, props.lp, props.pb)) return false;\n return this.setDictionarySize(props.dictionarySize);\n }\n\n /**\n * Initialize probability tables\n */\n private initProbabilities(): void {\n initBitModels(this.isMatchDecoders);\n initBitModels(this.isRepDecoders);\n initBitModels(this.isRepG0Decoders);\n initBitModels(this.isRepG1Decoders);\n initBitModels(this.isRepG2Decoders);\n initBitModels(this.isRep0LongDecoders);\n initBitModels(this.posDecoders);\n this.literalDecoder.init();\n for (let i = kNumLenToPosStates - 1; i >= 0; i--) {\n this.posSlotDecoder[i].init();\n }\n this.lenDecoder.init();\n this.repLenDecoder.init();\n this.posAlignDecoder.init();\n }\n\n /**\n * Reset probabilities only (for LZMA2 state reset)\n */\n resetProbabilities(): void {\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n }\n\n /**\n * Reset dictionary position (for LZMA2 dictionary reset)\n */\n resetDictionary(): void {\n this.outWindow.init(false);\n this.totalPos = 0;\n }\n\n /**\n * Feed uncompressed data into the dictionary (for LZMA2 uncompressed chunks)\n * This updates the sliding window so subsequent LZMA chunks can reference this data.\n */\n feedUncompressed(data: Buffer): void {\n for (let i = 0; i < data.length; i++) {\n this.outWindow.putByte(data[i]);\n }\n this.totalPos += data.length;\n if (data.length > 0) {\n this.prevByte = data[data.length - 1];\n }\n }\n\n /**\n * Flush any remaining data in the OutWindow to the sink\n */\n flushOutWindow(): void {\n this.outWindow.flush();\n }\n\n /**\n * Decode LZMA data with streaming output (no buffer accumulation)\n * @param input - Compressed input buffer\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written to sink\n */\n decodeWithSink(input: Buffer, inputOffset: number, outSize: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n this.outWindow.init(true);\n }\n\n let outPos = 0;\n let cumPos = this.totalPos;\n\n while (outPos < outSize) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n outPos++;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break;\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n outPos++;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos;\n }\n\n /**\n * Decode LZMA data directly into caller's buffer (zero-copy)\n * @param input - Compressed input buffer\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param output - Pre-allocated output buffer to write to\n * @param outputOffset - Offset in output buffer to start writing\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written\n */\n decodeToBuffer(input: Buffer, inputOffset: number, outSize: number, output: Buffer, outputOffset: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n // Solid mode: preserve dictionary state but reinitialize range decoder\n this.outWindow.init(true);\n }\n\n let outPos = outputOffset;\n const outEnd = outputOffset + outSize;\n let cumPos = this.totalPos;\n\n while (outPos < outEnd) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n output[outPos++] = this.prevByte;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break; // End marker\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n output[outPos++] = b;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos - outputOffset;\n }\n\n /**\n * Decode LZMA data\n * @param input - Compressed input buffer\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Decompressed data\n */\n decode(input: Buffer, inputOffset: number, outSize: number, solid = false): Buffer {\n const output = allocBufferUnsafe(outSize);\n this.decodeToBuffer(input, inputOffset, outSize, output, 0, solid);\n return output;\n }\n}\n\n/**\n * Decode LZMA1 data synchronously\n *\n * Note: LZMA1 is a low-level format. Native bindings (lzma-native) expect\n * self-describing data (like XZ), but here we accept raw LZMA with properties\n * specified separately. Pure JS implementation is used for LZMA1.\n *\n * @param input - Compressed data (without 5-byte properties header)\n * @param properties - 5-byte LZMA properties\n * @param outSize - Expected output size\n * @param outputSink - Optional output sink with write callback for streaming (returns bytes written)\n * @returns Decompressed data (or bytes written if outputSink provided)\n */\nexport function decodeLzma(input: Buffer, properties: Buffer | Uint8Array, outSize: number, outputSink?: { write(buffer: Buffer): void }): Buffer | number {\n const decoder = new LzmaDecoder(outputSink as OutputSink);\n decoder.setDecoderProperties(properties);\n if (outputSink) {\n // Zero-copy mode: write to sink during decode\n const bytesWritten = decoder.decodeWithSink(input, 0, outSize, false);\n decoder.flushOutWindow();\n return bytesWritten;\n }\n // Buffering mode: pre-allocated buffer, direct writes (zero-copy)\n return decoder.decode(input, 0, outSize, false);\n}\n"],"names":["allocBufferUnsafe","bufferFrom","getLenToPosState","initBitModels","kEndPosModelIndex","kMatchMinLen","kNumAlignBits","kNumFullDistances","kNumLenToPosStates","kNumLitContextBitsMax","kNumPosSlotBits","kNumPosStatesBitsMax","kNumStates","kStartPosModelIndex","parseProperties","stateIsCharState","stateUpdateChar","stateUpdateMatch","stateUpdateRep","stateUpdateShortRep","BitTreeDecoder","RangeDecoder","reverseDecodeFromArray","LenDecoder","create","numPosStates","lowCoder","midCoder","init","choice","i","highCoder","decode","rangeDecoder","posState","decodeBit","LiteralDecoder2","decoders","decodeNormal","symbol","decodeWithMatchByte","matchByte","matchBit","bit","LiteralDecoder","numPosBits","numPrevBits","coders","length","posMask","getDecoder","pos","prevByte","index","decoder","OutWindow","windowSize","buffer","streamPos","solid","putByte","b","sink","flush","size","chunk","slice","write","getByte","distance","copyBlock","len","copyTo","output","outputOffset","count","srcPos","firstPart","copy","LzmaDecoder","setDictionarySize","dictionarySize","dictionarySizeCheck","Math","max","outWindow","setLcLpPb","lc","lp","pb","literalDecoder","lenDecoder","repLenDecoder","posStateMask","setDecoderProperties","properties","props","initProbabilities","isMatchDecoders","isRepDecoders","isRepG0Decoders","isRepG1Decoders","isRepG2Decoders","isRep0LongDecoders","posDecoders","posSlotDecoder","posAlignDecoder","resetProbabilities","state","rep0","rep1","rep2","rep3","resetDictionary","totalPos","feedUncompressed","data","flushOutWindow","decodeWithSink","input","inputOffset","outSize","setInput","outPos","cumPos","decoder2","posSlot","numDirectBits","decodeDirectBits","reverseDecode","Error","decodeToBuffer","outEnd","outputSink","decodeLzma","bytesWritten"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/xz-compat/src/lzma/sync/LzmaDecoder.ts"],"sourcesContent":["/**\n * Synchronous LZMA1 Decoder\n *\n * Decodes LZMA1 compressed data from a buffer.\n * All operations are synchronous.\n */\n\nimport { allocBufferUnsafe, type BufferLike, bufferFrom } from 'extract-base-iterator';\nimport {\n getLenToPosState,\n initBitModels,\n kEndPosModelIndex,\n kMatchMinLen,\n kNumAlignBits,\n kNumFullDistances,\n kNumLenToPosStates,\n kNumLitContextBitsMax,\n kNumPosSlotBits,\n kNumPosStatesBitsMax,\n kNumStates,\n kStartPosModelIndex,\n type OutputSink,\n parseProperties,\n stateIsCharState,\n stateUpdateChar,\n stateUpdateMatch,\n stateUpdateRep,\n stateUpdateShortRep,\n} from '../types.ts';\nimport { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDecoder.ts';\n\n/**\n * Length decoder for match/rep lengths\n */\nclass LenDecoder {\n private choice: Uint16Array;\n private lowCoder: BitTreeDecoder[];\n private midCoder: BitTreeDecoder[];\n private highCoder: BitTreeDecoder;\n private numPosStates: number;\n\n constructor() {\n this.choice = initBitModels(null, 2);\n this.lowCoder = [];\n this.midCoder = [];\n this.highCoder = new BitTreeDecoder(8);\n this.numPosStates = 0;\n }\n\n create(numPosStates: number): void {\n for (; this.numPosStates < numPosStates; this.numPosStates++) {\n this.lowCoder[this.numPosStates] = new BitTreeDecoder(3);\n this.midCoder[this.numPosStates] = new BitTreeDecoder(3);\n }\n }\n\n init(): void {\n initBitModels(this.choice);\n for (let i = this.numPosStates - 1; i >= 0; i--) {\n this.lowCoder[i].init();\n this.midCoder[i].init();\n }\n this.highCoder.init();\n }\n\n decode(rangeDecoder: RangeDecoder, posState: number): number {\n if (rangeDecoder.decodeBit(this.choice, 0) === 0) {\n return this.lowCoder[posState].decode(rangeDecoder);\n }\n if (rangeDecoder.decodeBit(this.choice, 1) === 0) {\n return 8 + this.midCoder[posState].decode(rangeDecoder);\n }\n return 16 + this.highCoder.decode(rangeDecoder);\n }\n}\n\n/**\n * Single literal decoder (decodes one byte)\n */\nclass LiteralDecoder2 {\n private decoders: Uint16Array;\n\n constructor() {\n this.decoders = initBitModels(null, 0x300);\n }\n\n init(): void {\n initBitModels(this.decoders);\n }\n\n decodeNormal(rangeDecoder: RangeDecoder): number {\n let symbol = 1;\n do {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n\n decodeWithMatchByte(rangeDecoder: RangeDecoder, matchByte: number): number {\n let symbol = 1;\n do {\n const matchBit = (matchByte >> 7) & 1;\n matchByte <<= 1;\n const bit = rangeDecoder.decodeBit(this.decoders, ((1 + matchBit) << 8) + symbol);\n symbol = (symbol << 1) | bit;\n if (matchBit !== bit) {\n while (symbol < 0x100) {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n }\n break;\n }\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n}\n\n/**\n * Literal decoder (array of single decoders)\n */\nclass LiteralDecoder {\n private numPosBits: number;\n private numPrevBits: number;\n private posMask: number;\n private coders: (LiteralDecoder2 | undefined)[];\n\n constructor() {\n this.numPosBits = 0;\n this.numPrevBits = 0;\n this.posMask = 0;\n this.coders = [];\n }\n\n create(numPosBits: number, numPrevBits: number): void {\n if (this.coders.length > 0 && this.numPrevBits === numPrevBits && this.numPosBits === numPosBits) {\n return;\n }\n this.numPosBits = numPosBits;\n this.posMask = (1 << numPosBits) - 1;\n this.numPrevBits = numPrevBits;\n this.coders = [];\n }\n\n init(): void {\n for (let i = 0; i < this.coders.length; i++) {\n if (this.coders[i]) {\n this.coders[i]?.init();\n }\n }\n }\n\n getDecoder(pos: number, prevByte: number): LiteralDecoder2 {\n const index = ((pos & this.posMask) << this.numPrevBits) + ((prevByte & 0xff) >>> (8 - this.numPrevBits));\n let decoder = this.coders[index];\n if (!decoder) {\n decoder = new LiteralDecoder2();\n this.coders[index] = decoder;\n }\n return decoder;\n }\n}\n\n/**\n * Output window (sliding dictionary)\n */\nclass OutWindow {\n private buffer: Buffer;\n private windowSize: number;\n private pos: number;\n private sink?: {\n write(buffer: Buffer): void;\n };\n private streamPos: number;\n\n constructor(sink?: OutputSink) {\n this.buffer = allocBufferUnsafe(0); // Replaced by create() before use\n this.windowSize = 0;\n this.pos = 0;\n this.sink = sink;\n this.streamPos = 0;\n }\n\n create(windowSize: number): void {\n if (!this.buffer || this.windowSize !== windowSize) {\n this.buffer = allocBufferUnsafe(windowSize);\n }\n this.windowSize = windowSize;\n this.pos = 0;\n this.streamPos = 0;\n }\n\n init(solid: boolean): void {\n if (!solid) {\n this.pos = 0;\n this.streamPos = 0;\n }\n }\n\n putByte(b: number): void {\n this.buffer[this.pos++] = b;\n if (this.pos >= this.windowSize) {\n if (this.sink) {\n this.flush();\n this.pos = 0;\n this.streamPos = 0; // Reset streamPos after wrap to track new data from pos 0\n } else {\n this.pos = 0;\n }\n }\n }\n\n flush(): void {\n const size = this.pos - this.streamPos;\n if (size > 0 && this.sink) {\n // Use bufferFrom to create a COPY, not a view - the buffer is reused after wrapping\n const chunk = bufferFrom(this.buffer.slice(this.streamPos, this.streamPos + size));\n this.sink.write(chunk);\n this.streamPos = this.pos;\n }\n }\n\n getByte(distance: number): number {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n return this.buffer[pos];\n }\n\n copyBlock(distance: number, len: number): void {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n for (let i = 0; i < len; i++) {\n if (pos >= this.windowSize) {\n pos = 0;\n }\n this.putByte(this.buffer[pos++]);\n }\n }\n\n /**\n * Copy decoded data to output buffer\n */\n copyTo(output: Buffer, outputOffset: number, count: number): void {\n const srcPos = this.pos - count;\n if (srcPos < 0) {\n // Wrap around case - data spans end and beginning of buffer\n const firstPart = -srcPos;\n this.buffer.copy(output, outputOffset, this.windowSize + srcPos, this.windowSize);\n this.buffer.copy(output, outputOffset + firstPart, 0, count - firstPart);\n } else {\n this.buffer.copy(output, outputOffset, srcPos, srcPos + count);\n }\n }\n}\n\n/**\n * Synchronous LZMA1 decoder\n */\nexport class LzmaDecoder {\n private outWindow: OutWindow;\n private rangeDecoder: RangeDecoder;\n\n // Probability models\n private isMatchDecoders: Uint16Array;\n private isRepDecoders: Uint16Array;\n private isRepG0Decoders: Uint16Array;\n private isRepG1Decoders: Uint16Array;\n private isRepG2Decoders: Uint16Array;\n private isRep0LongDecoders: Uint16Array;\n private posSlotDecoder: BitTreeDecoder[];\n private posDecoders: Uint16Array;\n private posAlignDecoder: BitTreeDecoder;\n private lenDecoder: LenDecoder;\n private repLenDecoder: LenDecoder;\n private literalDecoder: LiteralDecoder;\n\n // Properties\n private dictionarySize: number;\n private dictionarySizeCheck: number;\n private posStateMask: number;\n\n // State (preserved across solid calls)\n private state: number;\n private rep0: number;\n private rep1: number;\n private rep2: number;\n private rep3: number;\n private prevByte: number;\n private totalPos: number;\n\n constructor(outputSink?: OutputSink) {\n this.outWindow = new OutWindow(outputSink);\n this.rangeDecoder = new RangeDecoder();\n\n this.isMatchDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.isRepDecoders = initBitModels(null, kNumStates);\n this.isRepG0Decoders = initBitModels(null, kNumStates);\n this.isRepG1Decoders = initBitModels(null, kNumStates);\n this.isRepG2Decoders = initBitModels(null, kNumStates);\n this.isRep0LongDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.posSlotDecoder = [];\n this.posDecoders = initBitModels(null, kNumFullDistances - kEndPosModelIndex);\n this.posAlignDecoder = new BitTreeDecoder(kNumAlignBits);\n this.lenDecoder = new LenDecoder();\n this.repLenDecoder = new LenDecoder();\n this.literalDecoder = new LiteralDecoder();\n\n for (let i = 0; i < kNumLenToPosStates; i++) {\n this.posSlotDecoder[i] = new BitTreeDecoder(kNumPosSlotBits);\n }\n\n this.dictionarySize = -1;\n this.dictionarySizeCheck = -1;\n this.posStateMask = 0;\n\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n }\n\n /**\n * Set dictionary size\n */\n setDictionarySize(dictionarySize: number): boolean {\n if (dictionarySize < 0) return false;\n if (this.dictionarySize !== dictionarySize) {\n this.dictionarySize = dictionarySize;\n this.dictionarySizeCheck = Math.max(dictionarySize, 1);\n this.outWindow.create(Math.max(this.dictionarySizeCheck, 1 << 12));\n }\n return true;\n }\n\n /**\n * Set lc, lp, pb properties\n */\n setLcLpPb(lc: number, lp: number, pb: number): boolean {\n if (lc > kNumLitContextBitsMax || lp > 4 || pb > kNumPosStatesBitsMax) {\n return false;\n }\n const numPosStates = 1 << pb;\n this.literalDecoder.create(lp, lc);\n this.lenDecoder.create(numPosStates);\n this.repLenDecoder.create(numPosStates);\n this.posStateMask = numPosStates - 1;\n return true;\n }\n\n /**\n * Set decoder properties from 5-byte buffer\n */\n setDecoderProperties(properties: Buffer | Uint8Array): boolean {\n const props = parseProperties(properties);\n if (!this.setLcLpPb(props.lc, props.lp, props.pb)) return false;\n return this.setDictionarySize(props.dictionarySize);\n }\n\n /**\n * Initialize probability tables\n */\n private initProbabilities(): void {\n initBitModels(this.isMatchDecoders);\n initBitModels(this.isRepDecoders);\n initBitModels(this.isRepG0Decoders);\n initBitModels(this.isRepG1Decoders);\n initBitModels(this.isRepG2Decoders);\n initBitModels(this.isRep0LongDecoders);\n initBitModels(this.posDecoders);\n this.literalDecoder.init();\n for (let i = kNumLenToPosStates - 1; i >= 0; i--) {\n this.posSlotDecoder[i].init();\n }\n this.lenDecoder.init();\n this.repLenDecoder.init();\n this.posAlignDecoder.init();\n }\n\n /**\n * Reset probabilities only (for LZMA2 state reset)\n */\n resetProbabilities(): void {\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n }\n\n /**\n * Reset dictionary position (for LZMA2 dictionary reset)\n */\n resetDictionary(): void {\n this.outWindow.init(false);\n this.totalPos = 0;\n }\n\n /**\n * Feed uncompressed data into the dictionary (for LZMA2 uncompressed chunks)\n * This updates the sliding window so subsequent LZMA chunks can reference this data.\n */\n feedUncompressed(data: Buffer): void {\n for (let i = 0; i < data.length; i++) {\n this.outWindow.putByte(data[i]);\n }\n this.totalPos += data.length;\n if (data.length > 0) {\n this.prevByte = data[data.length - 1];\n }\n }\n\n /**\n * Flush any remaining data in the OutWindow to the sink\n */\n flushOutWindow(): void {\n this.outWindow.flush();\n }\n\n /**\n * Decode LZMA data with streaming output (no buffer accumulation)\n * @param input - Compressed input buffer or BufferList\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written to sink\n */\n decodeWithSink(input: BufferLike, inputOffset: number, outSize: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n this.outWindow.init(true);\n }\n\n let outPos = 0;\n let cumPos = this.totalPos;\n\n while (outPos < outSize) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n outPos++;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break;\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n outPos++;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos;\n }\n\n /**\n * Decode LZMA data directly into caller's buffer (zero-copy)\n * @param input - Compressed input buffer or BufferList\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param output - Pre-allocated output buffer to write to\n * @param outputOffset - Offset in output buffer to start writing\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written\n */\n decodeToBuffer(input: BufferLike, inputOffset: number, outSize: number, output: Buffer, outputOffset: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n // Solid mode: preserve dictionary state but reinitialize range decoder\n this.outWindow.init(true);\n }\n\n let outPos = outputOffset;\n const outEnd = outputOffset + outSize;\n let cumPos = this.totalPos;\n\n while (outPos < outEnd) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n output[outPos++] = this.prevByte;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break; // End marker\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n output[outPos++] = b;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos - outputOffset;\n }\n\n /**\n * Decode LZMA data\n * @param input - Compressed input buffer or BufferList\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Decompressed data\n */\n decode(input: BufferLike, inputOffset: number, outSize: number, solid = false): Buffer {\n const output = allocBufferUnsafe(outSize);\n this.decodeToBuffer(input, inputOffset, outSize, output, 0, solid);\n return output;\n }\n}\n\n/**\n * Decode LZMA1 data synchronously\n *\n * Note: LZMA1 is a low-level format. Native bindings (lzma-native) expect\n * self-describing data (like XZ), but here we accept raw LZMA with properties\n * specified separately. Pure JS implementation is used for LZMA1.\n *\n * @param input - Compressed data (without 5-byte properties header) or BufferList\n * @param properties - 5-byte LZMA properties\n * @param outSize - Expected output size\n * @param outputSink - Optional output sink with write callback for streaming (returns bytes written)\n * @returns Decompressed data (or bytes written if outputSink provided)\n */\nexport function decodeLzma(input: BufferLike, properties: Buffer | Uint8Array, outSize: number, outputSink?: { write(buffer: Buffer): void }): Buffer | number {\n const decoder = new LzmaDecoder(outputSink as OutputSink);\n decoder.setDecoderProperties(properties);\n if (outputSink) {\n // Zero-copy mode: write to sink during decode\n const bytesWritten = decoder.decodeWithSink(input, 0, outSize, false);\n decoder.flushOutWindow();\n return bytesWritten;\n }\n // Buffering mode: pre-allocated buffer, direct writes (zero-copy)\n return decoder.decode(input, 0, outSize, false);\n}\n"],"names":["allocBufferUnsafe","bufferFrom","getLenToPosState","initBitModels","kEndPosModelIndex","kMatchMinLen","kNumAlignBits","kNumFullDistances","kNumLenToPosStates","kNumLitContextBitsMax","kNumPosSlotBits","kNumPosStatesBitsMax","kNumStates","kStartPosModelIndex","parseProperties","stateIsCharState","stateUpdateChar","stateUpdateMatch","stateUpdateRep","stateUpdateShortRep","BitTreeDecoder","RangeDecoder","reverseDecodeFromArray","LenDecoder","create","numPosStates","lowCoder","midCoder","init","choice","i","highCoder","decode","rangeDecoder","posState","decodeBit","LiteralDecoder2","decoders","decodeNormal","symbol","decodeWithMatchByte","matchByte","matchBit","bit","LiteralDecoder","numPosBits","numPrevBits","coders","length","posMask","getDecoder","pos","prevByte","index","decoder","OutWindow","windowSize","buffer","streamPos","solid","putByte","b","sink","flush","size","chunk","slice","write","getByte","distance","copyBlock","len","copyTo","output","outputOffset","count","srcPos","firstPart","copy","LzmaDecoder","setDictionarySize","dictionarySize","dictionarySizeCheck","Math","max","outWindow","setLcLpPb","lc","lp","pb","literalDecoder","lenDecoder","repLenDecoder","posStateMask","setDecoderProperties","properties","props","initProbabilities","isMatchDecoders","isRepDecoders","isRepG0Decoders","isRepG1Decoders","isRepG2Decoders","isRep0LongDecoders","posDecoders","posSlotDecoder","posAlignDecoder","resetProbabilities","state","rep0","rep1","rep2","rep3","resetDictionary","totalPos","feedUncompressed","data","flushOutWindow","decodeWithSink","input","inputOffset","outSize","setInput","outPos","cumPos","decoder2","posSlot","numDirectBits","decodeDirectBits","reverseDecode","Error","decodeToBuffer","outEnd","outputSink","decodeLzma","bytesWritten"],"mappings":"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"}
|
|
@@ -4,19 +4,20 @@
|
|
|
4
4
|
* Decodes arithmetic-coded bits from a buffer.
|
|
5
5
|
* All operations are synchronous - for streaming use the async version.
|
|
6
6
|
*/
|
|
7
|
+
import type { BufferLike } from 'extract-base-iterator';
|
|
7
8
|
/**
|
|
8
9
|
* Range decoder for synchronous buffer-based LZMA decoding
|
|
9
10
|
*/
|
|
10
11
|
export declare class RangeDecoder {
|
|
11
|
-
private input;
|
|
12
12
|
private pos;
|
|
13
13
|
private code;
|
|
14
14
|
private range;
|
|
15
|
+
private getByte;
|
|
15
16
|
constructor();
|
|
16
17
|
/**
|
|
17
18
|
* Set input buffer and initialize decoder state
|
|
18
19
|
*/
|
|
19
|
-
setInput(input:
|
|
20
|
+
setInput(input: BufferLike, offset?: number): void;
|
|
20
21
|
/**
|
|
21
22
|
* Initialize range decoder (reads first 5 bytes)
|
|
22
23
|
*/
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Decodes arithmetic-coded bits from a buffer.
|
|
5
5
|
* All operations are synchronous - for streaming use the async version.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
6
|
+
*/ /**
|
|
8
7
|
* Range decoder for synchronous buffer-based LZMA decoding
|
|
9
8
|
*/ export class RangeDecoder {
|
|
10
9
|
/**
|
|
11
10
|
* Set input buffer and initialize decoder state
|
|
12
11
|
*/ setInput(input, offset = 0) {
|
|
13
|
-
this.input = input;
|
|
14
12
|
this.pos = offset;
|
|
13
|
+
// One-time binding for byte access (avoids repeated Buffer.isBuffer checks)
|
|
14
|
+
this.getByte = Buffer.isBuffer(input) ? (o)=>input[o] : (o)=>input.readByte(o);
|
|
15
15
|
this.init();
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
this.pos++;
|
|
24
24
|
// Read 4 bytes into code
|
|
25
25
|
for(let i = 0; i < 4; i++){
|
|
26
|
-
this.code = this.code << 8 | this.
|
|
26
|
+
this.code = this.code << 8 | this.getByte(this.pos++);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
* Normalize range if needed (read more bytes)
|
|
36
36
|
*/ normalize() {
|
|
37
37
|
if ((this.range & 0xff000000) === 0) {
|
|
38
|
-
this.code = this.code << 8 | this.
|
|
38
|
+
this.code = this.code << 8 | this.getByte(this.pos++);
|
|
39
39
|
this.range <<= 8;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -75,10 +75,10 @@
|
|
|
75
75
|
return result;
|
|
76
76
|
}
|
|
77
77
|
constructor(){
|
|
78
|
-
this.input = allocBuffer(0); // Replaced by setInput() before use
|
|
79
78
|
this.pos = 0;
|
|
80
79
|
this.code = 0;
|
|
81
80
|
this.range = 0;
|
|
81
|
+
this.getByte = ()=>0;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/xz-compat/src/lzma/sync/RangeDecoder.ts"],"sourcesContent":["/**\n * Synchronous Range Decoder for LZMA\n *\n * Decodes arithmetic-coded bits from a buffer.\n * All operations are synchronous - for streaming use the async version.\n */\n\nimport {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/xz-compat/src/lzma/sync/RangeDecoder.ts"],"sourcesContent":["/**\n * Synchronous Range Decoder for LZMA\n *\n * Decodes arithmetic-coded bits from a buffer.\n * All operations are synchronous - for streaming use the async version.\n */\n\nimport type { BufferLike } from 'extract-base-iterator';\n\n/**\n * Range decoder for synchronous buffer-based LZMA decoding\n */\nexport class RangeDecoder {\n private pos: number;\n private code: number;\n private range: number;\n private getByte: (offset: number) => number;\n\n constructor() {\n this.pos = 0;\n this.code = 0;\n this.range = 0;\n this.getByte = () => 0;\n }\n\n /**\n * Set input buffer and initialize decoder state\n */\n setInput(input: BufferLike, offset = 0): void {\n this.pos = offset;\n // One-time binding for byte access (avoids repeated Buffer.isBuffer checks)\n this.getByte = Buffer.isBuffer(input) ? (o) => input[o] : (o) => input.readByte(o);\n this.init();\n }\n\n /**\n * Initialize range decoder (reads first 5 bytes)\n */\n private init(): void {\n this.code = 0;\n this.range = -1; // 0xFFFFFFFF as signed int\n\n // First byte is ignored (should be 0)\n this.pos++;\n\n // Read 4 bytes into code\n for (let i = 0; i < 4; i++) {\n this.code = (this.code << 8) | this.getByte(this.pos++);\n }\n }\n\n /**\n * Get current position in input buffer\n */\n getPosition(): number {\n return this.pos;\n }\n\n /**\n * Normalize range if needed (read more bytes)\n */\n private normalize(): void {\n if ((this.range & 0xff000000) === 0) {\n this.code = (this.code << 8) | this.getByte(this.pos++);\n this.range <<= 8;\n }\n }\n\n /**\n * Decode a single bit using probability model\n * @param probs - Probability array\n * @param index - Index into probability array\n * @returns Decoded bit (0 or 1)\n */\n decodeBit(probs: Uint16Array, index: number): number {\n const prob = probs[index];\n const newBound = (this.range >>> 11) * prob;\n\n if ((this.code ^ 0x80000000) < (newBound ^ 0x80000000)) {\n this.range = newBound;\n probs[index] += (2048 - prob) >>> 5;\n this.normalize();\n return 0;\n }\n this.range -= newBound;\n this.code -= newBound;\n probs[index] -= prob >>> 5;\n this.normalize();\n return 1;\n }\n\n /**\n * Decode direct bits (not probability-based)\n * @param numTotalBits - Number of bits to decode\n * @returns Decoded value\n */\n decodeDirectBits(numTotalBits: number): number {\n let result = 0;\n for (let i = numTotalBits; i > 0; i--) {\n this.range >>>= 1;\n const t = (this.code - this.range) >>> 31;\n this.code -= this.range & (t - 1);\n result = (result << 1) | (1 - t);\n this.normalize();\n }\n return result;\n }\n}\n\n/**\n * Bit tree decoder for multi-bit symbols\n */\nexport class BitTreeDecoder {\n private numBitLevels: number;\n private models: Uint16Array;\n\n constructor(numBitLevels: number) {\n this.numBitLevels = numBitLevels;\n this.models = new Uint16Array(1 << numBitLevels);\n this.init();\n }\n\n /**\n * Initialize probability models\n */\n init(): void {\n for (let i = 0; i < this.models.length; i++) {\n this.models[i] = 1024; // kProbInitValue\n }\n }\n\n /**\n * Decode a symbol (forward bit order)\n */\n decode(rangeDecoder: RangeDecoder): number {\n let m = 1;\n for (let i = this.numBitLevels; i > 0; i--) {\n m = (m << 1) | rangeDecoder.decodeBit(this.models, m);\n }\n return m - (1 << this.numBitLevels);\n }\n\n /**\n * Decode a symbol (reverse bit order)\n */\n reverseDecode(rangeDecoder: RangeDecoder): number {\n let m = 1;\n let symbol = 0;\n for (let i = 0; i < this.numBitLevels; i++) {\n const bit = rangeDecoder.decodeBit(this.models, m);\n m = (m << 1) | bit;\n symbol |= bit << i;\n }\n return symbol;\n }\n}\n\n/**\n * Static reverse decode from external probability array\n */\nexport function reverseDecodeFromArray(models: Uint16Array, startIndex: number, rangeDecoder: RangeDecoder, numBitLevels: number): number {\n let m = 1;\n let symbol = 0;\n for (let i = 0; i < numBitLevels; i++) {\n const bit = rangeDecoder.decodeBit(models, startIndex + m);\n m = (m << 1) | bit;\n symbol |= bit << i;\n }\n return symbol;\n}\n"],"names":["RangeDecoder","setInput","input","offset","pos","getByte","Buffer","isBuffer","o","readByte","init","code","range","i","getPosition","normalize","decodeBit","probs","index","prob","newBound","decodeDirectBits","numTotalBits","result","t","BitTreeDecoder","models","length","decode","rangeDecoder","m","numBitLevels","reverseDecode","symbol","bit","Uint16Array","reverseDecodeFromArray","startIndex"],"mappings":"AAAA;;;;;CAKC,GAID;;CAEC,GACD,OAAO,MAAMA;IAaX;;GAEC,GACDC,SAASC,KAAiB,EAAEC,SAAS,CAAC,EAAQ;QAC5C,IAAI,CAACC,GAAG,GAAGD;QACX,4EAA4E;QAC5E,IAAI,CAACE,OAAO,GAAGC,OAAOC,QAAQ,CAACL,SAAS,CAACM,IAAMN,KAAK,CAACM,EAAE,GAAG,CAACA,IAAMN,MAAMO,QAAQ,CAACD;QAChF,IAAI,CAACE,IAAI;IACX;IAEA;;GAEC,GACD,AAAQA,OAAa;QACnB,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,KAAK,GAAG,CAAC,GAAG,2BAA2B;QAE5C,sCAAsC;QACtC,IAAI,CAACR,GAAG;QAER,yBAAyB;QACzB,IAAK,IAAIS,IAAI,GAAGA,IAAI,GAAGA,IAAK;YAC1B,IAAI,CAACF,IAAI,GAAG,AAAC,IAAI,CAACA,IAAI,IAAI,IAAK,IAAI,CAACN,OAAO,CAAC,IAAI,CAACD,GAAG;QACtD;IACF;IAEA;;GAEC,GACDU,cAAsB;QACpB,OAAO,IAAI,CAACV,GAAG;IACjB;IAEA;;GAEC,GACD,AAAQW,YAAkB;QACxB,IAAI,AAAC,CAAA,IAAI,CAACH,KAAK,GAAG,UAAS,MAAO,GAAG;YACnC,IAAI,CAACD,IAAI,GAAG,AAAC,IAAI,CAACA,IAAI,IAAI,IAAK,IAAI,CAACN,OAAO,CAAC,IAAI,CAACD,GAAG;YACpD,IAAI,CAACQ,KAAK,KAAK;QACjB;IACF;IAEA;;;;;GAKC,GACDI,UAAUC,KAAkB,EAAEC,KAAa,EAAU;QACnD,MAAMC,OAAOF,KAAK,CAACC,MAAM;QACzB,MAAME,WAAW,AAAC,CAAA,IAAI,CAACR,KAAK,KAAK,EAAC,IAAKO;QAEvC,IAAI,AAAC,CAAA,IAAI,CAACR,IAAI,GAAG,UAAS,IAAMS,CAAAA,WAAW,UAAS,GAAI;YACtD,IAAI,CAACR,KAAK,GAAGQ;YACbH,KAAK,CAACC,MAAM,IAAI,AAAC,OAAOC,SAAU;YAClC,IAAI,CAACJ,SAAS;YACd,OAAO;QACT;QACA,IAAI,CAACH,KAAK,IAAIQ;QACd,IAAI,CAACT,IAAI,IAAIS;QACbH,KAAK,CAACC,MAAM,IAAIC,SAAS;QACzB,IAAI,CAACJ,SAAS;QACd,OAAO;IACT;IAEA;;;;GAIC,GACDM,iBAAiBC,YAAoB,EAAU;QAC7C,IAAIC,SAAS;QACb,IAAK,IAAIV,IAAIS,cAAcT,IAAI,GAAGA,IAAK;YACrC,IAAI,CAACD,KAAK,MAAM;YAChB,MAAMY,IAAI,AAAC,IAAI,CAACb,IAAI,GAAG,IAAI,CAACC,KAAK,KAAM;YACvC,IAAI,CAACD,IAAI,IAAI,IAAI,CAACC,KAAK,GAAIY,IAAI;YAC/BD,SAAS,AAACA,UAAU,IAAM,IAAIC;YAC9B,IAAI,CAACT,SAAS;QAChB;QACA,OAAOQ;IACT;IAxFA,aAAc;QACZ,IAAI,CAACnB,GAAG,GAAG;QACX,IAAI,CAACO,IAAI,GAAG;QACZ,IAAI,CAACC,KAAK,GAAG;QACb,IAAI,CAACP,OAAO,GAAG,IAAM;IACvB;AAoFF;AAEA;;CAEC,GACD,OAAO,MAAMoB;IAUX;;GAEC,GACDf,OAAa;QACX,IAAK,IAAIG,IAAI,GAAGA,IAAI,IAAI,CAACa,MAAM,CAACC,MAAM,EAAEd,IAAK;YAC3C,IAAI,CAACa,MAAM,CAACb,EAAE,GAAG,MAAM,iBAAiB;QAC1C;IACF;IAEA;;GAEC,GACDe,OAAOC,YAA0B,EAAU;QACzC,IAAIC,IAAI;QACR,IAAK,IAAIjB,IAAI,IAAI,CAACkB,YAAY,EAAElB,IAAI,GAAGA,IAAK;YAC1CiB,IAAI,AAACA,KAAK,IAAKD,aAAab,SAAS,CAAC,IAAI,CAACU,MAAM,EAAEI;QACrD;QACA,OAAOA,IAAK,CAAA,KAAK,IAAI,CAACC,YAAY,AAAD;IACnC;IAEA;;GAEC,GACDC,cAAcH,YAA0B,EAAU;QAChD,IAAIC,IAAI;QACR,IAAIG,SAAS;QACb,IAAK,IAAIpB,IAAI,GAAGA,IAAI,IAAI,CAACkB,YAAY,EAAElB,IAAK;YAC1C,MAAMqB,MAAML,aAAab,SAAS,CAAC,IAAI,CAACU,MAAM,EAAEI;YAChDA,IAAI,AAACA,KAAK,IAAKI;YACfD,UAAUC,OAAOrB;QACnB;QACA,OAAOoB;IACT;IAtCA,YAAYF,YAAoB,CAAE;QAChC,IAAI,CAACA,YAAY,GAAGA;QACpB,IAAI,CAACL,MAAM,GAAG,IAAIS,YAAY,KAAKJ;QACnC,IAAI,CAACrB,IAAI;IACX;AAmCF;AAEA;;CAEC,GACD,OAAO,SAAS0B,uBAAuBV,MAAmB,EAAEW,UAAkB,EAAER,YAA0B,EAAEE,YAAoB;IAC9H,IAAID,IAAI;IACR,IAAIG,SAAS;IACb,IAAK,IAAIpB,IAAI,GAAGA,IAAIkB,cAAclB,IAAK;QACrC,MAAMqB,MAAML,aAAab,SAAS,CAACU,QAAQW,aAAaP;QACxDA,IAAI,AAACA,KAAK,IAAKI;QACfD,UAAUC,OAAOrB;IACnB;IACA,OAAOoB;AACT"}
|