pixel-data-js 0.21.0 → 0.22.2
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/index.dev.cjs +725 -362
- package/dist/index.dev.cjs.map +1 -1
- package/dist/index.dev.js +712 -361
- package/dist/index.dev.js.map +1 -1
- package/dist/index.prod.cjs +725 -362
- package/dist/index.prod.cjs.map +1 -1
- package/dist/index.prod.d.ts +282 -127
- package/dist/index.prod.js +712 -361
- package/dist/index.prod.js.map +1 -1
- package/package.json +1 -1
- package/src/Algorithm/floodFillSelection.ts +12 -14
- package/src/BlendModes/toBlendModeIndexAndName.ts +0 -7
- package/src/Clipboard/writeImgBlobToClipboard.ts +1 -1
- package/src/History/PixelMutator/mutatorApplyAlphaMask.ts +3 -0
- package/src/History/PixelMutator/mutatorApplyBinaryMask.ts +3 -0
- package/src/History/PixelMutator/mutatorApplyCircleBrush.ts +25 -6
- package/src/History/PixelMutator/mutatorApplyCircleBrushStroke.ts +89 -46
- package/src/History/PixelMutator/mutatorApplyCirclePencil.ts +7 -7
- package/src/History/PixelMutator/mutatorApplyCirclePencilStroke.ts +81 -41
- package/src/History/PixelMutator/mutatorApplyRectBrush.ts +3 -0
- package/src/History/PixelMutator/mutatorApplyRectBrushStroke.ts +18 -5
- package/src/History/PixelMutator/mutatorApplyRectPencil.ts +3 -0
- package/src/History/PixelMutator/mutatorApplyRectPencilStroke.ts +19 -4
- package/src/History/PixelMutator/mutatorBlendColor.ts +4 -0
- package/src/History/PixelMutator/mutatorBlendPixelData.ts +4 -0
- package/src/History/PixelMutator/mutatorClear.ts +10 -8
- package/src/History/PixelMutator/mutatorFill.ts +7 -4
- package/src/History/PixelMutator/mutatorFillBinaryMask.ts +28 -0
- package/src/History/PixelMutator/mutatorInvert.ts +3 -0
- package/src/ImageData/extractImageDataBuffer.ts +3 -3
- package/src/ImageData/{imageDataToAlphaMask.ts → imageDataToAlphaMaskBuffer.ts} +3 -4
- package/src/ImageData/resizeImageData.ts +3 -5
- package/src/ImageData/writeImageDataBuffer.ts +7 -7
- package/src/Mask/AlphaMask.ts +16 -0
- package/src/Mask/BinaryMask.ts +16 -0
- package/src/Mask/CircleBrushAlphaMask.ts +32 -0
- package/src/Mask/CircleBrushBinaryMask.ts +30 -0
- package/src/Mask/applyBinaryMaskToAlphaMask.ts +12 -9
- package/src/Mask/copyMask.ts +9 -3
- package/src/Mask/extractMask.ts +33 -31
- package/src/Mask/extractMaskBuffer.ts +87 -0
- package/src/Mask/invertMask.ts +6 -4
- package/src/Mask/mergeAlphaMasks.ts +11 -10
- package/src/Mask/mergeBinaryMasks.ts +10 -9
- package/src/Mask/setMaskData.ts +7 -0
- package/src/MaskRect/merge2BinaryMaskRects.ts +81 -0
- package/src/MaskRect/mergeBinaryMaskRects.ts +39 -0
- package/src/MaskRect/subtractBinaryMaskRects.ts +80 -0
- package/src/PixelData/applyAlphaMaskToPixelData.ts +8 -5
- package/src/PixelData/applyBinaryMaskToPixelData.ts +8 -9
- package/src/PixelData/applyCircleBrushToPixelData.ts +54 -62
- package/src/PixelData/blendColorPixelDataAlphaMask.ts +35 -25
- package/src/PixelData/blendColorPixelDataBinaryMask.ts +26 -19
- package/src/PixelData/blendPixelDataAlphaMask.ts +3 -3
- package/src/PixelData/blendPixelDataBinaryMask.ts +3 -3
- package/src/PixelData/fillPixelData.ts +15 -42
- package/src/PixelData/fillPixelDataBinaryMask.ts +79 -0
- package/src/PixelData/invertPixelData.ts +3 -3
- package/src/PixelData/pixelDataToAlphaMask.ts +4 -2
- package/src/PixelData/writePixelDataBuffer.ts +2 -3
- package/src/Rect/getRectsBounds.ts +22 -0
- package/src/Rect/trimRectBounds.ts +20 -17
- package/src/_types.ts +55 -29
- package/src/index.ts +16 -1
package/dist/index.prod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/_types.ts","../src/color.ts","../src/Internal/resolveClipping.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMask.ts","../src/Rect/trimRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes-fast.ts","../src/BlendModes/blend-modes-perfect.ts","../src/BlendModes/toBlendModeIndexAndName.ts","../src/Canvas/_constants.ts","../src/Canvas/PixelCanvas.ts","../src/Canvas/ReusableCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/HistoryManager.ts","../src/History/PixelPatchTiles.ts","../src/History/PixelAccumulator.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/applyAlphaMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyAlphaMask.ts","../src/PixelData/applyBinaryMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyBinaryMask.ts","../src/Rect/getCircleBrushOrPencilBounds.ts","../src/PixelData/applyCircleBrushToPixelData.ts","../src/History/PixelMutator/mutatorApplyCircleBrush.ts","../src/Algorithm/forEachLinePoint.ts","../src/PixelData/blendColorPixelDataAlphaMask.ts","../src/Rect/getCircleBrushOrPencilStrokeBounds.ts","../src/History/PixelMutator/mutatorApplyCircleBrushStroke.ts","../src/PixelData/blendColorPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorApplyCirclePencilStroke.ts","../src/Rect/getRectBrushOrPencilBounds.ts","../src/PixelData/applyRectBrushToPixelData.ts","../src/History/PixelMutator/mutatorApplyRectBrush.ts","../src/Rect/getRectBrushOrPencilStrokeBounds.ts","../src/History/PixelMutator/mutatorApplyRectBrushStroke.ts","../src/History/PixelMutator/mutatorApplyRectPencil.ts","../src/History/PixelMutator/mutatorApplyRectPencilStroke.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorClear.ts","../src/History/PixelMutator/mutatorFill.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/History/PixelWriter.ts","../src/History/PixelMutator/mutatorApplyCirclePencil.ts","../src/ImageData/copyImageData.ts","../src/ImageData/ImageDataLike.ts","../src/ImageData/imageDataToAlphaMask.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/imageDataToUInt32Array.ts","../src/ImageData/invertImageData.ts","../src/Internal/resample32.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/resizeImageData.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/uInt32ArrayToImageData.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/indexedImageToImageData.ts","../src/IndexedImage/resampleIndexedImage.ts","../src/Input/fileInputChangeToImageData.ts","../src/Input/fileToImageData.ts","../src/Input/getSupportedRasterFormats.ts","../src/Mask/applyBinaryMaskToAlphaMask.ts","../src/Mask/copyMask.ts","../src/Mask/invertMask.ts","../src/Mask/mergeAlphaMasks.ts","../src/Mask/mergeBinaryMasks.ts","../src/PixelData/PixelData.ts","../src/PixelData/blendPixelDataAlphaMask.ts","../src/PixelData/blendPixelDataBinaryMask.ts","../src/PixelData/clearPixelData.ts","../src/PixelData/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/PixelBuffer32.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/writePixelDataBuffer.ts"],"sourcesContent":["/** ALL values are 0-255 (including alpha which in CSS is 0-1) */\nexport type RGBA = {\n r: number;\n g: number;\n b: number;\n a: number;\n};\n\n/** Represents a 32-bit color in 0xAABBGGRR (Little endian) */\nexport type Color32 = number & {\n readonly __brandColor32: unique symbol;\n};\n\n/**\n * A function that defines how to combine a source color with a destination color.\n * @param src - The incoming color (source).\n * @param dst - The existing color in the buffer (destination).\n * @returns The resulting 32-bit color to be written to the buffer.\n */\nexport type BlendColor32 = {\n (src: Color32, dst: Color32): Color32;\n isOverwrite?: true;\n};\nexport type ImageDataLike = {\n width: number;\n height: number;\n data: Uint8ClampedArray<ArrayBufferLike>;\n};\nexport type ImageDataLikeConstructor<T extends ImageDataLike = ImageDataLike> = {\n new (data: Uint8ClampedArray, width: number, height: number): T;\n};\nexport type SerializedImageData = {\n width: number;\n height: number;\n data: string;\n};\nexport type Base64EncodedUInt8Array = string & {\n readonly __brandBase64UInt8Array: unique symbol;\n};\n\n/** Rectangle definition */\nexport type Rect = {\n x: number;\n y: number;\n w: number;\n h: number;\n};\nexport type BinaryMaskRect = {\n x: number;\n y: number;\n w: number;\n h: number;\n mask: BinaryMask;\n};\n\n/**\n * Defines how mask values should be interpreted during a draw operation.\n */\nexport enum MaskType {\n /**\n * Values are treated as alpha weights.\n * 0 is skipped, values > 0 are processed.\n */\n ALPHA,\n /**\n * Values are treated as on/off.\n * 0 is fully transparent (skipped), any other value is fully opaque.\n */\n BINARY,\n}\n\n/** Strictly 0 or 1 */\nexport type BinaryMask = Uint8Array & {\n readonly __brand: 'Binary';\n};\n/** Strictly 0-255 */\nexport type AlphaMask = Uint8Array & {\n readonly __brand: 'Alpha';\n};\nexport type AnyMask = BinaryMask | AlphaMask;\n\n/**\n * Configuration for pixel manipulation operations.\n * Designed to be used by spreading a Rect object ({x, y, w, h}) directly.\n */\nexport interface PixelRect {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number;\n\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number;\n\n /**\n * The width of the region in the destination buffer.\n * @default Source width.\n */\n w?: number;\n\n /**\n * The height of the region in the destination buffer.\n * @default Source height.\n */\n h?: number;\n}\nexport interface MaskOffset {\n /**\n * X offset into the mask buffer.\n * @default 0\n */\n mx?: number;\n\n /**\n * Y offset into the mask buffer.\n * @default 0\n */\n my?: number;\n}\nexport interface MaskOffsetWidth {\n /**\n * Mask width.\n * @default value of `w`\n */\n mw?: number;\n}\nexport interface InvertMask {\n /**\n * If true the inverse of the mask will be applied\n * @default false\n */\n invertMask?: boolean;\n}\nexport interface Alpha {\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: number;\n}\nexport interface ApplyMaskToPixelDataOptions extends PixelRect, Alpha, MaskOffsetWidth, MaskOffset, InvertMask {}\nexport interface MergeAlphaMasksOptions extends PixelRect, Alpha, MaskOffset, InvertMask {}\nexport interface PixelMutateOptions extends PixelRect, MaskOffset, MaskOffsetWidth, InvertMask {\n /** An optional mask to restrict where pixels are mutated. */\n mask?: BinaryMask | null;\n}\n\n/**\n * Configuration for blitting (copying/blending) one image into another.\n */\n\nexport interface BasePixelBlendOptions {\n /**\n * The source rectangle x-coordinate\n * @default 0\n */\n sx?: number;\n\n /**\n * The source rectangle y-coordinate\n * @default 0\n */\n sy?: number;\n\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverPerfect}\n */\n blendFn?: BlendColor32;\n}\nexport interface PixelBlendOptions extends PixelRect, Alpha, BasePixelBlendOptions {}\nexport interface PixelBlendMaskOptions extends PixelRect, Alpha, MaskOffsetWidth, MaskOffset, InvertMask, BasePixelBlendOptions {}\n\n/**\n * Configuration for operations that require color blending.\n */\nexport interface ColorBlendOptions extends PixelRect, Alpha {\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverPerfect}\n */\n blendFn?: BlendColor32;\n}\nexport interface ColorBlendMaskOptions extends ColorBlendOptions, MaskOffset, MaskOffsetWidth, InvertMask {}\nexport type SelectionRect = Rect & ({\n mask: Uint8Array;\n maskType: MaskType;\n} | {\n mask?: null;\n maskType?: null;\n});\nexport type HistoryMutator<T extends {}, D extends {}> = (writer: PixelWriter<any>, deps?: Partial<D>) => T;\nexport interface IPixelData {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxXcml0ZXIsIHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi9pbmRleCdcblxuLyoqIEFMTCB2YWx1ZXMgYXJlIDAtMjU1IChpbmNsdWRpbmcgYWxwaGEgd2hpY2ggaW4gQ1NTIGlzIDAtMSkgKi9cbmV4cG9ydCB0eXBlIFJHQkEgPSB7IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciB9XG5cbi8qKiBSZXByZXNlbnRzIGEgMzItYml0IGNvbG9yIGluIDB4QUFCQkdHUlIgKExpdHRsZSBlbmRpYW4pICovXG5leHBvcnQgdHlwZSBDb2xvcjMyID0gbnVtYmVyICYgeyByZWFkb25seSBfX2JyYW5kQ29sb3IzMjogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIGNvbWJpbmUgYSBzb3VyY2UgY29sb3Igd2l0aCBhIGRlc3RpbmF0aW9uIGNvbG9yLlxuICogQHBhcmFtIHNyYyAtIFRoZSBpbmNvbWluZyBjb2xvciAoc291cmNlKS5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZXhpc3RpbmcgY29sb3IgaW4gdGhlIGJ1ZmZlciAoZGVzdGluYXRpb24pLlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyAzMi1iaXQgY29sb3IgdG8gYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyLlxuICovXG5leHBvcnQgdHlwZSBCbGVuZENvbG9yMzIgPSB7XG4gIChzcmM6IENvbG9yMzIsIGRzdDogQ29sb3IzMik6IENvbG9yMzIsXG4gIGlzT3ZlcndyaXRlPzogdHJ1ZVxufVxuXG5leHBvcnQgdHlwZSBJbWFnZURhdGFMaWtlID0ge1xuICB3aWR0aDogbnVtYmVyXG4gIGhlaWdodDogbnVtYmVyXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyTGlrZT5cbn1cblxuZXhwb3J0IHR5cGUgSW1hZ2VEYXRhTGlrZUNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBJbWFnZURhdGFMaWtlID0gSW1hZ2VEYXRhTGlrZT4gPSB7XG4gIG5ldyhcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBUXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRJbWFnZURhdGEgPSB7XG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbiAgZGF0YTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEJhc2U2NEVuY29kZWRVSW50OEFycmF5ID0gc3RyaW5nICYgeyByZWFkb25seSBfX2JyYW5kQmFzZTY0VUludDhBcnJheTogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKiBSZWN0YW5nbGUgZGVmaW5pdGlvbiAqL1xuZXhwb3J0IHR5cGUgUmVjdCA9IHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxuICB3OiBudW1iZXJcbiAgaDogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIEJpbmFyeU1hc2tSZWN0ID0ge1xuICB4OiBudW1iZXJcbiAgeTogbnVtYmVyXG4gIHc6IG51bWJlclxuICBoOiBudW1iZXJcbiAgbWFzazogQmluYXJ5TWFza1xufVxuXG4vKipcbiAqIERlZmluZXMgaG93IG1hc2sgdmFsdWVzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBkdXJpbmcgYSBkcmF3IG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gTWFza1R5cGUge1xuICAvKipcbiAgICogVmFsdWVzIGFyZSB0cmVhdGVkIGFzIGFscGhhIHdlaWdodHMuXG4gICAqIDAgaXMgc2tpcHBlZCwgdmFsdWVzID4gMCBhcmUgcHJvY2Vzc2VkLlxuICAgKi9cbiAgQUxQSEEsXG4gIC8qKlxuICAgKiAgVmFsdWVzIGFyZSB0cmVhdGVkIGFzIG9uL29mZi5cbiAgICogMCBpcyBmdWxseSB0cmFuc3BhcmVudCAoc2tpcHBlZCksIGFueSBvdGhlciB2YWx1ZSBpcyBmdWxseSBvcGFxdWUuXG4gICAqL1xuICBCSU5BUllcbn1cblxuLyoqIFN0cmljdGx5IDAgb3IgMSAqL1xuZXhwb3J0IHR5cGUgQmluYXJ5TWFzayA9IFVpbnQ4QXJyYXkgJiB7IHJlYWRvbmx5IF9fYnJhbmQ6ICdCaW5hcnknIH1cbi8qKiBTdHJpY3RseSAwLTI1NSAqL1xuZXhwb3J0IHR5cGUgQWxwaGFNYXNrID0gVWludDhBcnJheSAmIHsgcmVhZG9ubHkgX19icmFuZDogJ0FscGhhJyB9XG5cbmV4cG9ydCB0eXBlIEFueU1hc2sgPSBCaW5hcnlNYXNrIHwgQWxwaGFNYXNrXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcGl4ZWwgbWFuaXB1bGF0aW9uIG9wZXJhdGlvbnMuXG4gKiBEZXNpZ25lZCB0byBiZSB1c2VkIGJ5IHNwcmVhZGluZyBhIFJlY3Qgb2JqZWN0ICh7eCwgeSwgdywgaH0pIGRpcmVjdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsUmVjdCB7XG4gIC8qKlxuICAgKiBUaGUgc3RhcnRpbmcgWCBjb29yZGluYXRlIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHg/OiBudW1iZXJcblxuICAvKipcbiAgICogVGhlIHN0YXJ0aW5nIFkgY29vcmRpbmF0ZSBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICB5PzogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuXG4gICAqIEBkZWZhdWx0IFNvdXJjZSB3aWR0aC5cbiAgICovXG4gIHc/OiBudW1iZXJcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuXG4gICAqIEBkZWZhdWx0IFNvdXJjZSBoZWlnaHQuXG4gICAqL1xuICBoPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFza09mZnNldCB7XG4gIC8qKlxuICAgKiBYIG9mZnNldCBpbnRvIHRoZSBtYXNrIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgbXg/OiBudW1iZXJcblxuICAvKipcbiAgICogWSBvZmZzZXQgaW50byB0aGUgbWFzayBidWZmZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIG15PzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFza09mZnNldFdpZHRoIHtcbiAgLyoqXG4gICAqIE1hc2sgd2lkdGguXG4gICAqIEBkZWZhdWx0IHZhbHVlIG9mIGB3YFxuICAgKi9cbiAgbXc/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZlcnRNYXNrIHtcblxuICAvKipcbiAgICogSWYgdHJ1ZSB0aGUgaW52ZXJzZSBvZiB0aGUgbWFzayB3aWxsIGJlIGFwcGxpZWRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGludmVydE1hc2s/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxwaGEge1xuICAvKipcbiAgICogT3ZlcmFsbCBsYXllciBvcGFjaXR5IDAtMjU1LlxuICAgKiBAZGVmYXVsdCAyNTVcbiAgICovXG4gIGFscGhhPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgTWFza09mZnNldFdpZHRoLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXJnZUFscGhhTWFza3NPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgTWFza09mZnNldCwgSW52ZXJ0TWFzayB7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXhlbE11dGF0ZU9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIE1hc2tPZmZzZXQsIE1hc2tPZmZzZXRXaWR0aCwgSW52ZXJ0TWFzayB7XG4gIC8qKiBBbiBvcHRpb25hbCBtYXNrIHRvIHJlc3RyaWN0IHdoZXJlIHBpeGVscyBhcmUgbXV0YXRlZC4gKi9cbiAgbWFzaz86IEJpbmFyeU1hc2sgfCBudWxsXG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYmxpdHRpbmcgKGNvcHlpbmcvYmxlbmRpbmcpIG9uZSBpbWFnZSBpbnRvIGFub3RoZXIuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBCYXNlUGl4ZWxCbGVuZE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSByZWN0YW5nbGUgeC1jb29yZGluYXRlXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHN4PzogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcmVjdGFuZ2xlIHktY29vcmRpbmF0ZVxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBzeT86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgYmxlbmRpbmcgYWxnb3JpdGhtIHRvIHVzZSBmb3IgYmxlbmRpbmcgcGl4ZWxzLlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgc291cmNlT3ZlclBlcmZlY3R9XG4gICAqL1xuICBibGVuZEZuPzogQmxlbmRDb2xvcjMyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxCbGVuZE9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBCYXNlUGl4ZWxCbGVuZE9wdGlvbnMge1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxCbGVuZE1hc2tPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgTWFza09mZnNldFdpZHRoLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrLCBCYXNlUGl4ZWxCbGVuZE9wdGlvbnMge1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGNvbG9yIGJsZW5kaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yQmxlbmRPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSB7XG4gIC8qKlxuICAgKiBUaGUgYmxlbmRpbmcgYWxnb3JpdGhtIHRvIHVzZSBmb3IgYmxlbmRpbmcgcGl4ZWxzLlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgc291cmNlT3ZlclBlcmZlY3R9XG4gICAqL1xuICBibGVuZEZuPzogQmxlbmRDb2xvcjMyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JCbGVuZE1hc2tPcHRpb25zIGV4dGVuZHMgQ29sb3JCbGVuZE9wdGlvbnMsIE1hc2tPZmZzZXQsIE1hc2tPZmZzZXRXaWR0aCwgSW52ZXJ0TWFzayB7XG59XG5cbmV4cG9ydCB0eXBlIFNlbGVjdGlvblJlY3QgPSBSZWN0ICYgKHtcbiAgbWFzazogVWludDhBcnJheSxcbiAgbWFza1R5cGU6IE1hc2tUeXBlLFxufSB8IHtcbiAgbWFzaz86IG51bGxcbiAgbWFza1R5cGU/OiBudWxsLFxufSlcblxuZXhwb3J0IHR5cGUgSGlzdG9yeU11dGF0b3I8VCBleHRlbmRzIHt9LCBEIGV4dGVuZHMge30+ID0gKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwcz86IFBhcnRpYWw8RD4pID0+IFRcblxuZXhwb3J0IGludGVyZmFjZSBJUGl4ZWxEYXRhIHtcbiAgcmVhZG9ubHkgZGF0YTMyOiBVaW50MzJBcnJheVxuICByZWFkb25seSB3aWR0aDogbnVtYmVyXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from './_types';\n\n/**\n * Packs RGBA into a 32-bit integer compatible with\n * Little-Endian Uint32Array views on ImageData.\n */\nexport function packColor(r: number, g: number, b: number, a: number): Color32 {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n}\nexport function packRGBA({\n r,\n g,\n b,\n a\n}: RGBA): Color32 {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n}\nexport const unpackRed = (packed: Color32): number => packed >>> 0 & 0xFF;\nexport const unpackGreen = (packed: Color32): number => packed >>> 8 & 0xFF;\nexport const unpackBlue = (packed: Color32): number => packed >>> 16 & 0xFF;\nexport const unpackAlpha = (packed: Color32): number => packed >>> 24 & 0xFF;\nexport function unpackColor(packed: Color32): RGBA {\n return {\n r: packed >>> 0 & 0xFF,\n g: packed >>> 8 & 0xFF,\n b: packed >>> 16 & 0xFF,\n a: packed >>> 24 & 0xFF\n };\n}\nconst SCRATCH_RGBA: RGBA = {\n r: 0,\n g: 0,\n b: 0,\n a: 0\n};\n\n// uses a scratch arg for memory perf. be careful about re-use.\nexport function unpackColorTo(packed: Color32, scratch = SCRATCH_RGBA): RGBA {\n scratch.r = packed >>> 0 & 0xFF;\n scratch.g = packed >>> 8 & 0xFF;\n scratch.b = packed >>> 16 & 0xFF;\n scratch.a = packed >>> 24 & 0xFF;\n return scratch;\n}\nexport function colorDistance(a: Color32, b: Color32): number {\n const dr = (a & 0xFF) - (b & 0xFF);\n const dg = (a >>> 8 & 0xFF) - (b >>> 8 & 0xFF);\n const db = (a >>> 16 & 0xFF) - (b >>> 16 & 0xFF);\n const da = (a >>> 24 & 0xFF) - (b >>> 24 & 0xFF);\n return dr * dr + dg * dg + db * db + da * da;\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using a floating-point weight.\n * * This is the preferred method for UI animations or scenarios where high\n * precision is required. It uses the standard `a + t * (b - a)` formula\n * for each channel.\n * @param a - The starting color as a 32-bit integer (AABBGGRR).\n * @param b - The target color as a 32-bit integer (AABBGGRR).\n * @param t - The interpolation factor between 0.0 and 1.0.\n * @returns The interpolated 32-bit color.\n */\nexport function lerpColor32(a: Color32, b: Color32, t: number): Color32 {\n const r = (a & 0xFF) + t * ((b & 0xFF) - (a & 0xFF));\n const g = (a >>> 8 & 0xFF) + t * ((b >>> 8 & 0xFF) - (a >>> 8 & 0xFF));\n const b_ = (a >>> 16 & 0xFF) + t * ((b >>> 16 & 0xFF) - (a >>> 16 & 0xFF));\n const a_ = (a >>> 24 & 0xFF) + t * ((b >>> 24 & 0xFF) - (a >>> 24 & 0xFF));\n return (a_ << 24 | b_ << 16 | g << 8 | r) >>> 0 as Color32;\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using integer fixed-point math.\n * Highly optimized for image processing and real-time blitting. It processes\n * channels in parallel using bitmasks (RB and GA pairs).\n * **Note:** Subject to a 1-bit drift (rounding down) due to fast bit-shift division.\n * @param src - The source (foreground) color as a 32-bit integer.\n * @param dst - The destination (background) color as a 32-bit integer.\n * @param w - The blend weight as a byte value from 0 to 255. Where 0 is 100% dst and 255 is 100% src\n * @returns The blended 32-bit color.\n */\nexport function lerpColor32Fast(src: Color32, dst: Color32, w: number): Color32 {\n const invA = 255 - w;\n\n // Masking Red and Blue: 0x00FF00FF\n // We process R and B in one go, then shift back down\n const rb = (src & 0x00FF00FF) * w + (dst & 0x00FF00FF) * invA >>> 8 & 0x00FF00FF;\n\n // Masking Green and Alpha: 0xFF00FF00\n // We shift down first to avoid overflow, then shift back up\n const ga = (src >>> 8 & 0x00FF00FF) * w + (dst >>> 8 & 0x00FF00FF) * invA >>> 8 & 0x00FF00FF;\n return (rb | ga << 8) >>> 0 as Color32;\n}\n\n// Convert 0xAABBGGRR to #RRGGBBAA\nexport function color32ToHex(color: Color32): string {\n const r = (color & 0xFF).toString(16).padStart(2, '0');\n const g = (color >>> 8 & 0xFF).toString(16).padStart(2, '0');\n const b = (color >>> 16 & 0xFF).toString(16).padStart(2, '0');\n const a = (color >>> 24 & 0xFF).toString(16).padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n}\n\n/**\n * Converts a 32-bit integer (0xAABBGGRR) to a CSS rgba() string.\n * Example: 0xFF0000FF -> \"rgba(255,0,0,1)\"\n */\nexport function color32ToCssRGBA(color: Color32): string {\n const r = color & 0xFF;\n const g = color >>> 8 & 0xFF;\n const b = color >>> 16 & 0xFF;\n const a = color >>> 24 & 0xFF;\n const alpha = Number((a / 255).toFixed(3));\n return `rgba(${r},${g},${b},${alpha})`;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBSR0JBIH0gZnJvbSAnLi9fdHlwZXMnXG5cbi8qKlxuICogUGFja3MgUkdCQSBpbnRvIGEgMzItYml0IGludGVnZXIgY29tcGF0aWJsZSB3aXRoXG4gKiBMaXR0bGUtRW5kaWFuIFVpbnQzMkFycmF5IHZpZXdzIG9uIEltYWdlRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2tDb2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIpOiBDb2xvcjMyIHtcbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2tSR0JBKHsgciwgZywgYiwgYSB9OiBSR0JBKTogQ29sb3IzMiB7XG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCB1bnBhY2tSZWQgPSAocGFja2VkOiBDb2xvcjMyKTogbnVtYmVyID0+IChwYWNrZWQgPj4+IDApICYgMHhGRlxuZXhwb3J0IGNvbnN0IHVucGFja0dyZWVuID0gKHBhY2tlZDogQ29sb3IzMik6IG51bWJlciA9PiAocGFja2VkID4+PiA4KSAmIDB4RkZcbmV4cG9ydCBjb25zdCB1bnBhY2tCbHVlID0gKHBhY2tlZDogQ29sb3IzMik6IG51bWJlciA9PiAocGFja2VkID4+PiAxNikgJiAweEZGXG5leHBvcnQgY29uc3QgdW5wYWNrQWxwaGEgPSAocGFja2VkOiBDb2xvcjMyKTogbnVtYmVyID0+IChwYWNrZWQgPj4+IDI0KSAmIDB4RkZcblxuZXhwb3J0IGZ1bmN0aW9uIHVucGFja0NvbG9yKHBhY2tlZDogQ29sb3IzMik6IFJHQkEge1xuICByZXR1cm4ge1xuICAgIHI6IChwYWNrZWQgPj4+IDApICYgMHhGRixcbiAgICBnOiAocGFja2VkID4+PiA4KSAmIDB4RkYsXG4gICAgYjogKHBhY2tlZCA+Pj4gMTYpICYgMHhGRixcbiAgICBhOiAocGFja2VkID4+PiAyNCkgJiAweEZGLFxuICB9XG59XG5cbmNvbnN0IFNDUkFUQ0hfUkdCQTogUkdCQSA9IHsgcjogMCwgZzogMCwgYjogMCwgYTogMCB9XG5cbi8vIHVzZXMgYSBzY3JhdGNoIGFyZyBmb3IgbWVtb3J5IHBlcmYuIGJlIGNhcmVmdWwgYWJvdXQgcmUtdXNlLlxuZXhwb3J0IGZ1bmN0aW9uIHVucGFja0NvbG9yVG8ocGFja2VkOiBDb2xvcjMyLCBzY3JhdGNoID0gU0NSQVRDSF9SR0JBKTogUkdCQSB7XG4gIHNjcmF0Y2guciA9IChwYWNrZWQgPj4+IDApICYgMHhGRlxuICBzY3JhdGNoLmcgPSAocGFja2VkID4+PiA4KSAmIDB4RkZcbiAgc2NyYXRjaC5iID0gKHBhY2tlZCA+Pj4gMTYpICYgMHhGRlxuICBzY3JhdGNoLmEgPSAocGFja2VkID4+PiAyNCkgJiAweEZGXG4gIHJldHVybiBzY3JhdGNoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckRpc3RhbmNlKGE6IENvbG9yMzIsIGI6IENvbG9yMzIpOiBudW1iZXIge1xuICBjb25zdCBkciA9IChhICYgMHhGRikgLSAoYiAmIDB4RkYpXG4gIGNvbnN0IGRnID0gKChhID4+PiA4KSAmIDB4RkYpIC0gKChiID4+PiA4KSAmIDB4RkYpXG4gIGNvbnN0IGRiID0gKChhID4+PiAxNikgJiAweEZGKSAtICgoYiA+Pj4gMTYpICYgMHhGRilcbiAgY29uc3QgZGEgPSAoKGEgPj4+IDI0KSAmIDB4RkYpIC0gKChiID4+PiAyNCkgJiAweEZGKVxuICByZXR1cm4gZHIgKiBkciArIGRnICogZGcgKyBkYiAqIGRiICsgZGEgKiBkYVxufVxuXG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHR3byAzMi1iaXQgY29sb3JzIHVzaW5nIGEgZmxvYXRpbmctcG9pbnQgd2VpZ2h0LlxuICogKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBVSSBhbmltYXRpb25zIG9yIHNjZW5hcmlvcyB3aGVyZSBoaWdoXG4gKiBwcmVjaXNpb24gaXMgcmVxdWlyZWQuIEl0IHVzZXMgdGhlIHN0YW5kYXJkIGBhICsgdCAqIChiIC0gYSlgIGZvcm11bGFcbiAqIGZvciBlYWNoIGNoYW5uZWwuXG4gKiBAcGFyYW0gYSAtIFRoZSBzdGFydGluZyBjb2xvciBhcyBhIDMyLWJpdCBpbnRlZ2VyIChBQUJCR0dSUikuXG4gKiBAcGFyYW0gYiAtIFRoZSB0YXJnZXQgY29sb3IgYXMgYSAzMi1iaXQgaW50ZWdlciAoQUFCQkdHUlIpLlxuICogQHBhcmFtIHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAqIEByZXR1cm5zIFRoZSBpbnRlcnBvbGF0ZWQgMzItYml0IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVycENvbG9yMzIoYTogQ29sb3IzMiwgYjogQ29sb3IzMiwgdDogbnVtYmVyKTogQ29sb3IzMiB7XG4gIGNvbnN0IHIgPSAoYSAmIDB4RkYpICsgdCAqICgoYiAmIDB4RkYpIC0gKGEgJiAweEZGKSlcbiAgY29uc3QgZyA9ICgoYSA+Pj4gOCkgJiAweEZGKSArIHQgKiAoKChiID4+PiA4KSAmIDB4RkYpIC0gKChhID4+PiA4KSAmIDB4RkYpKVxuICBjb25zdCBiXyA9ICgoYSA+Pj4gMTYpICYgMHhGRikgKyB0ICogKCgoYiA+Pj4gMTYpICYgMHhGRikgLSAoKGEgPj4+IDE2KSAmIDB4RkYpKVxuICBjb25zdCBhXyA9ICgoYSA+Pj4gMjQpICYgMHhGRikgKyB0ICogKCgoYiA+Pj4gMjQpICYgMHhGRikgLSAoKGEgPj4+IDI0KSAmIDB4RkYpKVxuXG4gIHJldHVybiAoKGFfIDw8IDI0KSB8IChiXyA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqXG4gKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0d28gMzItYml0IGNvbG9ycyB1c2luZyBpbnRlZ2VyIGZpeGVkLXBvaW50IG1hdGguXG4gKiBIaWdobHkgb3B0aW1pemVkIGZvciBpbWFnZSBwcm9jZXNzaW5nIGFuZCByZWFsLXRpbWUgYmxpdHRpbmcuIEl0IHByb2Nlc3Nlc1xuICogY2hhbm5lbHMgaW4gcGFyYWxsZWwgdXNpbmcgYml0bWFza3MgKFJCIGFuZCBHQSBwYWlycykuXG4gKiAqKk5vdGU6KiogU3ViamVjdCB0byBhIDEtYml0IGRyaWZ0IChyb3VuZGluZyBkb3duKSBkdWUgdG8gZmFzdCBiaXQtc2hpZnQgZGl2aXNpb24uXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSAoZm9yZWdyb3VuZCkgY29sb3IgYXMgYSAzMi1iaXQgaW50ZWdlci5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZGVzdGluYXRpb24gKGJhY2tncm91bmQpIGNvbG9yIGFzIGEgMzItYml0IGludGVnZXIuXG4gKiBAcGFyYW0gdyAtIFRoZSBibGVuZCB3ZWlnaHQgYXMgYSBieXRlIHZhbHVlIGZyb20gMCB0byAyNTUuIFdoZXJlIDAgaXMgMTAwJSBkc3QgYW5kIDI1NSBpcyAxMDAlIHNyY1xuICogQHJldHVybnMgVGhlIGJsZW5kZWQgMzItYml0IGNvbG9yLlxuICovZXhwb3J0IGZ1bmN0aW9uIGxlcnBDb2xvcjMyRmFzdChzcmM6IENvbG9yMzIsIGRzdDogQ29sb3IzMiwgdzogbnVtYmVyKTogQ29sb3IzMiB7XG4gIGNvbnN0IGludkEgPSAyNTUgLSB3XG5cbiAgLy8gTWFza2luZyBSZWQgYW5kIEJsdWU6IDB4MDBGRjAwRkZcbiAgLy8gV2UgcHJvY2VzcyBSIGFuZCBCIGluIG9uZSBnbywgdGhlbiBzaGlmdCBiYWNrIGRvd25cbiAgY29uc3QgcmIgPSAoKChzcmMgJiAweDAwRkYwMEZGKSAqIHcgKyAoZHN0ICYgMHgwMEZGMDBGRikgKiBpbnZBKSA+Pj4gOCkgJiAweDAwRkYwMEZGXG5cbiAgLy8gTWFza2luZyBHcmVlbiBhbmQgQWxwaGE6IDB4RkYwMEZGMDBcbiAgLy8gV2Ugc2hpZnQgZG93biBmaXJzdCB0byBhdm9pZCBvdmVyZmxvdywgdGhlbiBzaGlmdCBiYWNrIHVwXG4gIGNvbnN0IGdhID0gKCgoKHNyYyA+Pj4gOCkgJiAweDAwRkYwMEZGKSAqIHcgKyAoKGRzdCA+Pj4gOCkgJiAweDAwRkYwMEZGKSAqIGludkEpID4+PiA4KSAmIDB4MDBGRjAwRkZcblxuICByZXR1cm4gKHJiIHwgKGdhIDw8IDgpKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8vIENvbnZlcnQgMHhBQUJCR0dSUiB0byAjUlJHR0JCQUFcbmV4cG9ydCBmdW5jdGlvbiBjb2xvcjMyVG9IZXgoY29sb3I6IENvbG9yMzIpOiBzdHJpbmcge1xuICBjb25zdCByID0gKGNvbG9yICYgMHhGRikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgZyA9ICgoY29sb3IgPj4+IDgpICYgMHhGRikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgYiA9ICgoY29sb3IgPj4+IDE2KSAmIDB4RkYpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IGEgPSAoKGNvbG9yID4+PiAyNCkgJiAweEZGKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKVxuICByZXR1cm4gYCMke3J9JHtnfSR7Yn0ke2F9YFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgMzItYml0IGludGVnZXIgKDB4QUFCQkdHUlIpIHRvIGEgQ1NTIHJnYmEoKSBzdHJpbmcuXG4gKiBFeGFtcGxlOiAweEZGMDAwMEZGIC0+IFwicmdiYSgyNTUsMCwwLDEpXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yMzJUb0Nzc1JHQkEoY29sb3I6IENvbG9yMzIpOiBzdHJpbmcge1xuICBjb25zdCByID0gY29sb3IgJiAweEZGXG4gIGNvbnN0IGcgPSAoY29sb3IgPj4+IDgpICYgMHhGRlxuICBjb25zdCBiID0gKGNvbG9yID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGEgPSAoY29sb3IgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCBhbHBoYSA9IE51bWJlcigoYSAvIDI1NSkudG9GaXhlZCgzKSlcblxuICByZXR1cm4gYHJnYmEoJHtyfSwke2d9LCR7Yn0sJHthbHBoYX0pYFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type ClippedRect = {\n x: number;\n y: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\nexport type ClippedBlit = {\n x: number;\n y: number;\n sx: number;\n sy: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\n\n// use factory functions when creating reusable objects ensure property order for JIT perf\nexport const makeClippedRect = (): ClippedRect => ({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\nexport const makeClippedBlit = (): ClippedBlit => ({\n x: 0,\n y: 0,\n sx: 0,\n sy: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\n\n/**\n * Calculates the intersection of a target rectangle and a bounding box (usually 0,0 -> width,height).\n * Handles negative offsets by shrinking dimensions.\n */\nexport function resolveRectClipping(x: number, y: number, w: number, h: number, boundaryW: number, boundaryH: number, out: ClippedRect): ClippedRect {\n // Destination Clipping (Top/Left)\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n\n // Destination Clipping (Bottom/Right)\n const actualW = Math.min(w, boundaryW - x);\n const actualH = Math.min(h, boundaryH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n\n/**\n * Calculates the clipping for transferring data from a Source to a Destination.\n * Handles cases where the source is out of bounds (shifting the destination target)\n * AND cases where the destination is out of bounds (shifting the source target).\n */\nexport function resolveBlitClipping(x: number, y: number, sx: number, sy: number, w: number, h: number, dstW: number, dstH: number, srcW: number, srcH: number, out: ClippedBlit): ClippedBlit {\n // 1. Source Clipping: If reading from negative source, shift target right and shrink\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, srcW - sx);\n h = Math.min(h, srcH - sy);\n\n // 2. Destination Clipping: If writing to negative dest, shift source right and shrink\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dstW - x);\n const actualH = Math.min(h, dstH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.sx = sx;\n out.sy = sy;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2xpcHBlZFJlY3QgPSB7XG4gIHg6IG51bWJlclxuICB5OiBudW1iZXJcbiAgdzogbnVtYmVyXG4gIGg6IG51bWJlclxuICBpbkJvdW5kczogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBDbGlwcGVkQmxpdCA9IHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxuICBzeDogbnVtYmVyXG4gIHN5OiBudW1iZXJcbiAgdzogbnVtYmVyXG4gIGg6IG51bWJlclxuICBpbkJvdW5kczogYm9vbGVhblxufVxuXG4vLyB1c2UgZmFjdG9yeSBmdW5jdGlvbnMgd2hlbiBjcmVhdGluZyByZXVzYWJsZSBvYmplY3RzIGVuc3VyZSBwcm9wZXJ0eSBvcmRlciBmb3IgSklUIHBlcmZcbmV4cG9ydCBjb25zdCBtYWtlQ2xpcHBlZFJlY3QgPSAoKTogQ2xpcHBlZFJlY3QgPT4gKHtcbiAgeDogMCxcbiAgeTogMCxcbiAgdzogMCxcbiAgaDogMCxcbiAgaW5Cb3VuZHM6IGZhbHNlLFxufSlcblxuZXhwb3J0IGNvbnN0IG1ha2VDbGlwcGVkQmxpdCA9ICgpOiBDbGlwcGVkQmxpdCA9PiAoe1xuICB4OiAwLFxuICB5OiAwLFxuICBzeDogMCxcbiAgc3k6IDAsXG4gIHc6IDAsXG4gIGg6IDAsXG4gIGluQm91bmRzOiBmYWxzZSxcbn0pXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIGEgdGFyZ2V0IHJlY3RhbmdsZSBhbmQgYSBib3VuZGluZyBib3ggKHVzdWFsbHkgMCwwIC0+IHdpZHRoLGhlaWdodCkuXG4gKiBIYW5kbGVzIG5lZ2F0aXZlIG9mZnNldHMgYnkgc2hyaW5raW5nIGRpbWVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVjdENsaXBwaW5nKFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4gIGJvdW5kYXJ5VzogbnVtYmVyLFxuICBib3VuZGFyeUg6IG51bWJlcixcbiAgb3V0OiBDbGlwcGVkUmVjdCxcbik6IENsaXBwZWRSZWN0IHtcbiAgLy8gRGVzdGluYXRpb24gQ2xpcHBpbmcgKFRvcC9MZWZ0KVxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICAvLyBEZXN0aW5hdGlvbiBDbGlwcGluZyAoQm90dG9tL1JpZ2h0KVxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgYm91bmRhcnlXIC0geClcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIGJvdW5kYXJ5SCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHtcbiAgICBvdXQuaW5Cb3VuZHMgPSBmYWxzZVxuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIG91dC54ID0geFxuICBvdXQueSA9IHlcbiAgb3V0LncgPSBhY3R1YWxXXG4gIG91dC5oID0gYWN0dWFsSFxuICBvdXQuaW5Cb3VuZHMgPSB0cnVlXG5cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNsaXBwaW5nIGZvciB0cmFuc2ZlcnJpbmcgZGF0YSBmcm9tIGEgU291cmNlIHRvIGEgRGVzdGluYXRpb24uXG4gKiBIYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBzb3VyY2UgaXMgb3V0IG9mIGJvdW5kcyAoc2hpZnRpbmcgdGhlIGRlc3RpbmF0aW9uIHRhcmdldClcbiAqIEFORCBjYXNlcyB3aGVyZSB0aGUgZGVzdGluYXRpb24gaXMgb3V0IG9mIGJvdW5kcyAoc2hpZnRpbmcgdGhlIHNvdXJjZSB0YXJnZXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHN4OiBudW1iZXIsXG4gIHN5OiBudW1iZXIsXG4gIHc6IG51bWJlcixcbiAgaDogbnVtYmVyLFxuICBkc3RXOiBudW1iZXIsXG4gIGRzdEg6IG51bWJlcixcbiAgc3JjVzogbnVtYmVyLFxuICBzcmNIOiBudW1iZXIsXG4gIG91dDogQ2xpcHBlZEJsaXQsXG4pOiBDbGlwcGVkQmxpdCB7XG4gIC8vIDEuIFNvdXJjZSBDbGlwcGluZzogSWYgcmVhZGluZyBmcm9tIG5lZ2F0aXZlIHNvdXJjZSwgc2hpZnQgdGFyZ2V0IHJpZ2h0IGFuZCBzaHJpbmtcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3hcbiAgICB3ICs9IHN4XG4gICAgc3ggPSAwXG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3lcbiAgICBoICs9IHN5XG4gICAgc3kgPSAwXG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyY1cgLSBzeClcbiAgaCA9IE1hdGgubWluKGgsIHNyY0ggLSBzeSlcblxuICAvLyAyLiBEZXN0aW5hdGlvbiBDbGlwcGluZzogSWYgd3JpdGluZyB0byBuZWdhdGl2ZSBkZXN0LCBzaGlmdCBzb3VyY2UgcmlnaHQgYW5kIHNocmlua1xuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3RXIC0geClcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIGRzdEggLSB5KVxuXG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSB7XG4gICAgb3V0LmluQm91bmRzID0gZmFsc2VcbiAgICByZXR1cm4gb3V0XG4gIH1cblxuICBvdXQueCA9IHhcbiAgb3V0LnkgPSB5XG4gIG91dC5zeCA9IHN4XG4gIG91dC5zeSA9IHN5XG4gIG91dC53ID0gYWN0dWFsV1xuICBvdXQuaCA9IGFjdHVhbEhcbiAgb3V0LmluQm91bmRzID0gdHJ1ZVxuXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a specific rectangular region of pixels from a larger {@link ImageDataLike}\n * source into a new {@link Uint8ClampedArray}.\n *\n * This is a \"read-only\" operation that returns a copy of the pixel data.\n *\n * @param imageData - The source image data to read from.\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(imageData: ImageDataLike, rect: Rect): Uint8ClampedArray;\n/**\n * @param imageData - The source image data to read from.\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(imageData: ImageDataLike, x: number, y: number, w: number, h: number): Uint8ClampedArray;\nexport function extractImageDataBuffer(imageData: ImageDataLike, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint8ClampedArray {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const {\n width: srcW,\n height: srcH,\n data: src\n } = imageData;\n // Safety check for invalid dimensions\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0);\n const out = new Uint8ClampedArray(w * h * 4);\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return out;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const srcStart = ((srcY + row) * srcW + srcX) * 4;\n const dstStart = ((dstY + row) * w + dstX) * 4;\n\n // Perform the high-speed bulk copy\n out.set(src.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgc3BlY2lmaWMgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHBpeGVscyBmcm9tIGEgbGFyZ2VyIHtAbGluayBJbWFnZURhdGFMaWtlfVxuICogc291cmNlIGludG8gYSBuZXcge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fS5cbiAqXG4gKiBUaGlzIGlzIGEgXCJyZWFkLW9ubHlcIiBvcGVyYXRpb24gdGhhdCByZXR1cm5zIGEgY29weSBvZiB0aGUgcGl4ZWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIHNvdXJjZSBpbWFnZSBkYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSByZWN0IC0gQSB7QGxpbmsgUmVjdH0gb2JqZWN0IGRlZmluaW5nIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fSBjb250YWluaW5nIHRoZSBSR0JBIHBpeGVsIGRhdGEgb2YgdGhlIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbWFnZURhdGFCdWZmZXIoXG4gIGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSxcbiAgcmVjdDogUmVjdCxcbik6IFVpbnQ4Q2xhbXBlZEFycmF5XG4vKipcbiAqIEBwYXJhbSBpbWFnZURhdGEgLSBUaGUgc291cmNlIGltYWdlIGRhdGEgdG8gcmVhZCBmcm9tLlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHkgLSBUaGUgc3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEBwYXJhbSBoIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBVaW50OENsYW1wZWRBcnJheX0gY29udGFpbmluZyB0aGUgUkdCQSBwaXhlbCBkYXRhIG9mIHRoZSByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKFxuICBpbWFnZURhdGE6IEltYWdlRGF0YUxpa2UsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbik6IFVpbnQ4Q2xhbXBlZEFycmF5XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihcbiAgaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlLFxuICBfeDogUmVjdCB8IG51bWJlcixcbiAgX3k/OiBudW1iZXIsXG4gIF93PzogbnVtYmVyLFxuICBfaD86IG51bWJlcixcbik6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDogeyB4OiBfeCwgeTogX3khLCB3OiBfdyEsIGg6IF9oISB9XG5cbiAgY29uc3QgeyB3aWR0aDogc3JjVywgaGVpZ2h0OiBzcmNILCBkYXRhOiBzcmMgfSA9IGltYWdlRGF0YVxuICAvLyBTYWZldHkgY2hlY2sgZm9yIGludmFsaWQgZGltZW5zaW9uc1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCkgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheSgwKVxuICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodyAqIGggKiA0KVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIDAsXG4gICAgMCxcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoLFxuICAgIHcsXG4gICAgaCxcbiAgICBzcmNXLFxuICAgIHNyY0gsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gb3V0XG5cbiAgY29uc3QgeyB4OiBkc3RYLCB5OiBkc3RZLCBzeDogc3JjWCwgc3k6IHNyY1ksIHc6IGNvcHlXLCBoOiBjb3B5SCB9ID0gY2xpcFxuICBjb25zdCByb3dMZW4gPSBjb3B5VyAqIDRcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBzcmNTdGFydCA9ICgoc3JjWSArIHJvdykgKiBzcmNXICsgc3JjWCkgKiA0XG4gICAgY29uc3QgZHN0U3RhcnQgPSAoKGRzdFkgKyByb3cpICogdyArIGRzdFgpICogNFxuXG4gICAgLy8gUGVyZm9ybSB0aGUgaGlnaC1zcGVlZCBidWxrIGNvcHlcbiAgICBvdXQuc2V0KHNyYy5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pLCBkc3RTdGFydClcbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Extracts a rectangular region from a 1D {@link Uint8Array} mask.\n * This utility calculates the necessary offsets based on the `maskWidth` to\n * slice out a specific area.\n *\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(mask: Uint8Array, maskWidth: number, rect: Rect): Uint8Array;\n/**\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(mask: Uint8Array, maskWidth: number, x: number, y: number, w: number, h: number): Uint8Array;\nexport function extractMask(mask: Uint8Array, maskWidth: number, xOrRect: number | Rect, y?: number, w?: number, h?: number): Uint8Array {\n let finalX: number;\n let finalY: number;\n let finalW: number;\n let finalH: number;\n if (typeof xOrRect === 'object') {\n finalX = xOrRect.x;\n finalY = xOrRect.y;\n finalW = xOrRect.w;\n finalH = xOrRect.h;\n } else {\n finalX = xOrRect;\n finalY = y!;\n finalW = w!;\n finalH = h!;\n }\n const out = new Uint8Array(finalW * finalH);\n const srcH = mask.length / maskWidth;\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row;\n if (currentSrcY < 0 || currentSrcY >= srcH) {\n continue;\n }\n const start = Math.max(0, finalX);\n const end = Math.min(maskWidth, finalX + finalW);\n if (start < end) {\n const srcOffset = currentSrcY * maskWidth + start;\n const dstOffset = row * finalW + (start - finalX);\n const count = end - start;\n out.set(mask.subarray(srcOffset, srcOffset + count), dstOffset);\n }\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gYSAxRCB7QGxpbmsgVWludDhBcnJheX0gbWFzay5cbiAqIFRoaXMgdXRpbGl0eSBjYWxjdWxhdGVzIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0cyBiYXNlZCBvbiB0aGUgYG1hc2tXaWR0aGAgdG9cbiAqIHNsaWNlIG91dCBhIHNwZWNpZmljIGFyZWEuXG4gKlxuICogQHBhcmFtIG1hc2sgLSBUaGUgc291cmNlIDFEIGFycmF5IHJlcHJlc2VudGluZyB0aGUgZnVsbCAyRCBtYXNrLlxuICogQHBhcmFtIG1hc2tXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgc291cmNlIG1hc2sgKHN0cmlkZSkuXG4gKiBAcGFyYW0gcmVjdCAtIEEge0BsaW5rIFJlY3R9IG9iamVjdCBkZWZpbmluZyB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgVWludDhBcnJheX0gY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNYXNrKFxuICBtYXNrOiBVaW50OEFycmF5LFxuICBtYXNrV2lkdGg6IG51bWJlcixcbiAgcmVjdDogUmVjdCxcbik6IFVpbnQ4QXJyYXlcbi8qKlxuICogQHBhcmFtIG1hc2sgLSBUaGUgc291cmNlIDFEIGFycmF5IHJlcHJlc2VudGluZyB0aGUgZnVsbCAyRCBtYXNrLlxuICogQHBhcmFtIG1hc2tXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgc291cmNlIG1hc2sgKHN0cmlkZSkuXG4gKiBAcGFyYW0geCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHcgLSBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBVaW50OEFycmF5fSBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hc2soXG4gIG1hc2s6IFVpbnQ4QXJyYXksXG4gIG1hc2tXaWR0aDogbnVtYmVyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiBVaW50OEFycmF5XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hc2soXG4gIG1hc2s6IFVpbnQ4QXJyYXksXG4gIG1hc2tXaWR0aDogbnVtYmVyLFxuICB4T3JSZWN0OiBudW1iZXIgfCBSZWN0LFxuICB5PzogbnVtYmVyLFxuICB3PzogbnVtYmVyLFxuICBoPzogbnVtYmVyLFxuKTogVWludDhBcnJheSB7XG4gIGxldCBmaW5hbFg6IG51bWJlclxuICBsZXQgZmluYWxZOiBudW1iZXJcbiAgbGV0IGZpbmFsVzogbnVtYmVyXG4gIGxldCBmaW5hbEg6IG51bWJlclxuXG4gIGlmICh0eXBlb2YgeE9yUmVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICBmaW5hbFggPSB4T3JSZWN0LnhcbiAgICBmaW5hbFkgPSB4T3JSZWN0LnlcbiAgICBmaW5hbFcgPSB4T3JSZWN0LndcbiAgICBmaW5hbEggPSB4T3JSZWN0LmhcbiAgfSBlbHNlIHtcbiAgICBmaW5hbFggPSB4T3JSZWN0XG4gICAgZmluYWxZID0geSFcbiAgICBmaW5hbFcgPSB3IVxuICAgIGZpbmFsSCA9IGghXG4gIH1cblxuICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShmaW5hbFcgKiBmaW5hbEgpXG4gIGNvbnN0IHNyY0ggPSBtYXNrLmxlbmd0aCAvIG1hc2tXaWR0aFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGZpbmFsSDsgcm93KyspIHtcbiAgICBjb25zdCBjdXJyZW50U3JjWSA9IGZpbmFsWSArIHJvd1xuXG4gICAgaWYgKGN1cnJlbnRTcmNZIDwgMCB8fCBjdXJyZW50U3JjWSA+PSBzcmNIKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgZmluYWxYKVxuICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKG1hc2tXaWR0aCwgZmluYWxYICsgZmluYWxXKVxuXG4gICAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICBjb25zdCBzcmNPZmZzZXQgPSBjdXJyZW50U3JjWSAqIG1hc2tXaWR0aCArIHN0YXJ0XG4gICAgICBjb25zdCBkc3RPZmZzZXQgPSAocm93ICogZmluYWxXKSArIChzdGFydCAtIGZpbmFsWClcbiAgICAgIGNvbnN0IGNvdW50ID0gZW5kIC0gc3RhcnRcblxuICAgICAgb3V0LnNldChcbiAgICAgICAgbWFzay5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50KSxcbiAgICAgICAgZHN0T2Zmc2V0LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Rect, SelectionRect } from '../_types';\nimport { extractMask } from '../Mask/extractMask';\n\n/**\n * Intersects a target rectangle with a boundary, trimming dimensions and masks in-place.\n * This utility calculates the axis-aligned intersection between the `target` and `bounds`.\n * If the `target` includes a `mask` (as in a {@link SelectionRect}), the mask is physically\n * cropped and re-aligned using `extractMask` to match the new dimensions.\n * @param target - The rectangle or selection object to be trimmed. **Note:** This object is mutated in-place.\n * @param bounds - The boundary rectangle defining the maximum allowable area (e.g., canvas dimensions).\n * @example\n * const selection = { x: -10, y: -10, w: 50, h: 50, mask: new Uint8Array(2500) };\n * const canvas = { x: 0, y: 0, w: 100, h: 100 };\n * // Selection will be moved to (0,0) and resized to 40x40.\n * // The mask is cropped by 10 px on the top and left.\n * trimRectBounds(selection, canvas);\n */\nexport function trimRectBounds<T extends Rect | SelectionRect>(target: T, bounds: Rect): void {\n const originalX = target.x;\n const originalY = target.y;\n const originalW = target.w;\n const intersectedX = Math.max(target.x, bounds.x);\n const intersectedY = Math.max(target.y, bounds.y);\n const intersectedMaxX = Math.min(target.x + target.w, bounds.x + bounds.w);\n const intersectedMaxY = Math.min(target.y + target.h, bounds.y + bounds.h);\n\n // Intersection check\n if (intersectedMaxX <= intersectedX || intersectedMaxY <= intersectedY) {\n target.w = 0;\n target.h = 0;\n if ('mask' in target && target.mask) {\n // This line is now hit by the 'empty intersection' test below\n target.mask = new Uint8Array(0);\n }\n return;\n }\n const intersectedW = intersectedMaxX - intersectedX;\n const intersectedH = intersectedMaxY - intersectedY;\n const offsetX = intersectedX - originalX;\n const offsetY = intersectedY - originalY;\n target.x = intersectedX;\n target.y = intersectedY;\n target.w = intersectedW;\n target.h = intersectedH;\n if ('mask' in target && target.mask) {\n const currentMask = extractMask(target.mask, originalW, offsetX, offsetY, intersectedW, intersectedH);\n let minX = intersectedW;\n let maxX = -1;\n let minY = intersectedH;\n let maxY = -1;\n\n // Scan for content\n for (let y = 0; y < intersectedH; y++) {\n for (let x = 0; x < intersectedW; x++) {\n if (currentMask[y * intersectedW + x] !== 0) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n\n // If no content is found (all zeros)\n if (maxX === -1) {\n target.w = 0;\n target.h = 0;\n // This covers the specific line you mentioned\n target.mask = new Uint8Array(0);\n return;\n }\n const finalW = maxX - minX + 1;\n const finalH = maxY - minY + 1;\n\n // Only shift and crop if the content is smaller than the intersection\n if (finalW !== intersectedW || finalH !== intersectedH) {\n target.mask = extractMask(currentMask, intersectedW, minX, minY, finalW, finalH);\n target.x += minX;\n target.y += minY;\n target.w = finalW;\n target.h = finalH;\n } else {\n target.mask = currentMask;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0LCBTZWxlY3Rpb25SZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hc2sgfSBmcm9tICcuLi9NYXNrL2V4dHJhY3RNYXNrJ1xuXG4vKipcbiAqIEludGVyc2VjdHMgYSB0YXJnZXQgcmVjdGFuZ2xlIHdpdGggYSBib3VuZGFyeSwgdHJpbW1pbmcgZGltZW5zaW9ucyBhbmQgbWFza3MgaW4tcGxhY2UuXG4gKiBUaGlzIHV0aWxpdHkgY2FsY3VsYXRlcyB0aGUgYXhpcy1hbGlnbmVkIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSBgdGFyZ2V0YCBhbmQgYGJvdW5kc2AuXG4gKiBJZiB0aGUgYHRhcmdldGAgaW5jbHVkZXMgYSBgbWFza2AgKGFzIGluIGEge0BsaW5rIFNlbGVjdGlvblJlY3R9KSwgdGhlIG1hc2sgaXMgcGh5c2ljYWxseVxuICogY3JvcHBlZCBhbmQgcmUtYWxpZ25lZCB1c2luZyBgZXh0cmFjdE1hc2tgIHRvIG1hdGNoIHRoZSBuZXcgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgcmVjdGFuZ2xlIG9yIHNlbGVjdGlvbiBvYmplY3QgdG8gYmUgdHJpbW1lZC4gKipOb3RlOioqIFRoaXMgb2JqZWN0IGlzIG11dGF0ZWQgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYm91bmRzIC0gVGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBkZWZpbmluZyB0aGUgbWF4aW11bSBhbGxvd2FibGUgYXJlYSAoZS5nLiwgY2FudmFzIGRpbWVuc2lvbnMpLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlbGVjdGlvbiA9IHsgeDogLTEwLCB5OiAtMTAsIHc6IDUwLCBoOiA1MCwgbWFzazogbmV3IFVpbnQ4QXJyYXkoMjUwMCkgfTtcbiAqIGNvbnN0IGNhbnZhcyA9IHsgeDogMCwgeTogMCwgdzogMTAwLCBoOiAxMDAgfTtcbiAqIC8vIFNlbGVjdGlvbiB3aWxsIGJlIG1vdmVkIHRvICgwLDApIGFuZCByZXNpemVkIHRvIDQweDQwLlxuICogLy8gVGhlIG1hc2sgaXMgY3JvcHBlZCBieSAxMCBweCBvbiB0aGUgdG9wIGFuZCBsZWZ0LlxuICogdHJpbVJlY3RCb3VuZHMoc2VsZWN0aW9uLCBjYW52YXMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVJlY3RCb3VuZHM8VCBleHRlbmRzIFJlY3QgfCBTZWxlY3Rpb25SZWN0PihcbiAgdGFyZ2V0OiBULFxuICBib3VuZHM6IFJlY3QsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxYID0gdGFyZ2V0LnhcbiAgY29uc3Qgb3JpZ2luYWxZID0gdGFyZ2V0LnlcbiAgY29uc3Qgb3JpZ2luYWxXID0gdGFyZ2V0LndcblxuICBjb25zdCBpbnRlcnNlY3RlZFggPSBNYXRoLm1heCh0YXJnZXQueCwgYm91bmRzLngpXG4gIGNvbnN0IGludGVyc2VjdGVkWSA9IE1hdGgubWF4KHRhcmdldC55LCBib3VuZHMueSlcblxuICBjb25zdCBpbnRlcnNlY3RlZE1heFggPSBNYXRoLm1pbihcbiAgICB0YXJnZXQueCArIHRhcmdldC53LFxuICAgIGJvdW5kcy54ICsgYm91bmRzLncsXG4gIClcbiAgY29uc3QgaW50ZXJzZWN0ZWRNYXhZID0gTWF0aC5taW4oXG4gICAgdGFyZ2V0LnkgKyB0YXJnZXQuaCxcbiAgICBib3VuZHMueSArIGJvdW5kcy5oLFxuICApXG5cbiAgLy8gSW50ZXJzZWN0aW9uIGNoZWNrXG4gIGlmIChpbnRlcnNlY3RlZE1heFggPD0gaW50ZXJzZWN0ZWRYIHx8IGludGVyc2VjdGVkTWF4WSA8PSBpbnRlcnNlY3RlZFkpIHtcbiAgICB0YXJnZXQudyA9IDBcbiAgICB0YXJnZXQuaCA9IDBcblxuICAgIGlmICgnbWFzaycgaW4gdGFyZ2V0ICYmIHRhcmdldC5tYXNrKSB7XG4gICAgICAvLyBUaGlzIGxpbmUgaXMgbm93IGhpdCBieSB0aGUgJ2VtcHR5IGludGVyc2VjdGlvbicgdGVzdCBiZWxvd1xuICAgICAgdGFyZ2V0Lm1hc2sgPSBuZXcgVWludDhBcnJheSgwKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgaW50ZXJzZWN0ZWRXID0gaW50ZXJzZWN0ZWRNYXhYIC0gaW50ZXJzZWN0ZWRYXG4gIGNvbnN0IGludGVyc2VjdGVkSCA9IGludGVyc2VjdGVkTWF4WSAtIGludGVyc2VjdGVkWVxuICBjb25zdCBvZmZzZXRYID0gaW50ZXJzZWN0ZWRYIC0gb3JpZ2luYWxYXG4gIGNvbnN0IG9mZnNldFkgPSBpbnRlcnNlY3RlZFkgLSBvcmlnaW5hbFlcblxuICB0YXJnZXQueCA9IGludGVyc2VjdGVkWFxuICB0YXJnZXQueSA9IGludGVyc2VjdGVkWVxuICB0YXJnZXQudyA9IGludGVyc2VjdGVkV1xuICB0YXJnZXQuaCA9IGludGVyc2VjdGVkSFxuXG4gIGlmICgnbWFzaycgaW4gdGFyZ2V0ICYmIHRhcmdldC5tYXNrKSB7XG4gICAgY29uc3QgY3VycmVudE1hc2sgPSBleHRyYWN0TWFzayhcbiAgICAgIHRhcmdldC5tYXNrLFxuICAgICAgb3JpZ2luYWxXLFxuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFksXG4gICAgICBpbnRlcnNlY3RlZFcsXG4gICAgICBpbnRlcnNlY3RlZEgsXG4gICAgKVxuXG4gICAgbGV0IG1pblggPSBpbnRlcnNlY3RlZFdcbiAgICBsZXQgbWF4WCA9IC0xXG4gICAgbGV0IG1pblkgPSBpbnRlcnNlY3RlZEhcbiAgICBsZXQgbWF4WSA9IC0xXG5cbiAgICAvLyBTY2FuIGZvciBjb250ZW50XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBpbnRlcnNlY3RlZEg7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBpbnRlcnNlY3RlZFc7IHgrKykge1xuICAgICAgICBpZiAoY3VycmVudE1hc2tbeSAqIGludGVyc2VjdGVkVyArIHhdICE9PSAwKSB7XG4gICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geFxuICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHhcbiAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5XG4gICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gY29udGVudCBpcyBmb3VuZCAoYWxsIHplcm9zKVxuICAgIGlmIChtYXhYID09PSAtMSkge1xuICAgICAgdGFyZ2V0LncgPSAwXG4gICAgICB0YXJnZXQuaCA9IDBcbiAgICAgIC8vIFRoaXMgY292ZXJzIHRoZSBzcGVjaWZpYyBsaW5lIHlvdSBtZW50aW9uZWRcbiAgICAgIHRhcmdldC5tYXNrID0gbmV3IFVpbnQ4QXJyYXkoMClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsVyA9IG1heFggLSBtaW5YICsgMVxuICAgIGNvbnN0IGZpbmFsSCA9IG1heFkgLSBtaW5ZICsgMVxuXG4gICAgLy8gT25seSBzaGlmdCBhbmQgY3JvcCBpZiB0aGUgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIGludGVyc2VjdGlvblxuICAgIGlmIChmaW5hbFcgIT09IGludGVyc2VjdGVkVyB8fCBmaW5hbEggIT09IGludGVyc2VjdGVkSCkge1xuICAgICAgdGFyZ2V0Lm1hc2sgPSBleHRyYWN0TWFzayhcbiAgICAgICAgY3VycmVudE1hc2ssXG4gICAgICAgIGludGVyc2VjdGVkVyxcbiAgICAgICAgbWluWCxcbiAgICAgICAgbWluWSxcbiAgICAgICAgZmluYWxXLFxuICAgICAgICBmaW5hbEgsXG4gICAgICApXG4gICAgICB0YXJnZXQueCArPSBtaW5YXG4gICAgICB0YXJnZXQueSArPSBtaW5ZXG4gICAgICB0YXJnZXQudyA9IGZpbmFsV1xuICAgICAgdGFyZ2V0LmggPSBmaW5hbEhcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0Lm1hc2sgPSBjdXJyZW50TWFza1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type Color32, MaskType } from '../_types';\nimport { colorDistance } from '../color';\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nexport type FloodFillImageDataOptions = {\n contiguous?: boolean;\n tolerance?: number;\n bounds?: Rect;\n};\nexport type FloodFillResult = {\n startX: number;\n startY: number;\n selectionRect: SelectionRect;\n pixels: Uint8ClampedArray;\n};\n\n/**\n * Performs a color-based flood fill selection on {@link ImageData} or {@link PixelData}.\n * This utility identifies pixels starting from a specific coordinate that fall within a\n * color tolerance. It can operate in \"contiguous\" mode (classic bucket fill) or\n * \"non-contiguous\" mode (selects all matching pixels in the buffer).\n *\n * @param img - The source image data to process.\n * @param startX - The starting horizontal coordinate.\n * @param startY - The starting vertical coordinate.\n * @param options - Configuration for the fill operation.\n * @param options.contiguous - @default true. If true, only connected pixels are\n * selected. If false, all pixels within tolerance are selected regardless of position.\n * @param options.tolerance - @default 0. The maximum allowed difference in color\n * distance (0-255) for a pixel to be included.\n * @param options.bounds - Optional bounding box to restrict the search area.\n *\n * @returns A {@link FloodFillResult} containing the mask and bounds of the selection,\n * or `null` if the starting coordinates are out of bounds.\n *\n * @example\n * ```typescript\n * const result = floodFillImageDataSelection(\n * ctx.getImageData(0, 0, 100, 100),\n * 50,\n * 50,\n * {\n * tolerance: 20,\n * contiguous: true\n * }\n * );\n * ```\n */\nexport function floodFillSelection(img: ImageDataLike | PixelData, startX: number, startY: number, {\n contiguous = true,\n tolerance = 0,\n bounds\n}: FloodFillImageDataOptions = {}): FloodFillResult | null {\n let imageData: ImageDataLike;\n let data32: Uint32Array;\n if ('data32' in img) {\n data32 = img.data32;\n imageData = img.imageData;\n } else {\n data32 = new Uint32Array(img.data.buffer, img.data.byteOffset, img.data.byteLength >> 2);\n imageData = img;\n }\n const {\n width,\n height\n } = img;\n const limit = bounds || {\n x: 0,\n y: 0,\n w: width,\n h: height\n };\n const xMin = Math.max(0, limit.x);\n const xMax = Math.min(width - 1, limit.x + limit.w - 1);\n const yMin = Math.max(0, limit.y);\n const yMax = Math.min(height - 1, limit.y + limit.h - 1);\n if (startX < xMin || startX > xMax || startY < yMin || startY > yMax) {\n return null;\n }\n const baseColor = data32[startY * width + startX] as Color32;\n let matchCount = 0;\n const matchX = new Uint16Array(width * height);\n const matchY = new Uint16Array(width * height);\n let minX = startX;\n let maxX = startX;\n let minY = startY;\n let maxY = startY;\n if (contiguous) {\n const visited = new Uint8Array(width * height);\n const stack = new Uint32Array(width * height);\n let stackPtr = 0;\n stack[stackPtr++] = startY << 16 | startX;\n visited[startY * width + startX] = 1;\n while (stackPtr > 0) {\n const val = stack[--stackPtr];\n const x = val & 0xFFFF;\n const y = val >>> 16;\n matchX[matchCount] = x;\n matchY[matchCount] = y;\n matchCount++;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n\n // Right\n if (x + 1 <= xMax) {\n const idx = y * width + (x + 1);\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y << 16 | x + 1;\n }\n }\n // Left\n if (x - 1 >= xMin) {\n const idx = y * width + (x - 1);\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y << 16 | x - 1;\n }\n }\n // Down\n if (y + 1 <= yMax) {\n const idx = (y + 1) * width + x;\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y + 1 << 16 | x;\n }\n }\n // Up\n if (y - 1 >= yMin) {\n const idx = (y - 1) * width + x;\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y - 1 << 16 | x;\n }\n }\n }\n } else {\n for (let y = yMin; y <= yMax; y++) {\n for (let x = xMin; x <= xMax; x++) {\n const color = data32[y * width + x] as Color32;\n if (colorDistance(color, baseColor) <= tolerance) {\n matchX[matchCount] = x;\n matchY[matchCount] = y;\n matchCount++;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n }\n if (matchCount === 0) {\n return null;\n }\n const selectionRect: SelectionRect = {\n x: minX,\n y: minY,\n w: maxX - minX + 1,\n h: maxY - minY + 1,\n mask: new Uint8Array((maxX - minX + 1) * (maxY - minY + 1)),\n maskType: MaskType.BINARY\n };\n\n // REMOVED trimRectBounds from here\n\n const sw = selectionRect.w;\n const sh = selectionRect.h;\n const finalMask = selectionRect.mask!;\n for (let i = 0; i < matchCount; i++) {\n const mx = matchX[i] - selectionRect.x;\n const my = matchY[i] - selectionRect.y;\n if (mx >= 0 && mx < sw && my >= 0 && my < sh) {\n finalMask[my * sw + mx] = 1;\n }\n }\n\n // trimRectBounds can see them and work correctly.\n trimRectBounds(selectionRect, {\n x: 0,\n y: 0,\n w: width,\n h: height\n });\n\n // Use the UPDATED values from the selectionRect after trimming\n const extracted = extractImageDataBuffer(imageData, selectionRect.x, selectionRect.y, selectionRect.w, selectionRect.h);\n return {\n startX,\n startY,\n selectionRect,\n pixels: extracted\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIEltYWdlRGF0YUxpa2UsIE1hc2tUeXBlLCB0eXBlIFJlY3QsIHR5cGUgU2VsZWN0aW9uUmVjdCB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IGNvbG9yRGlzdGFuY2UgfSBmcm9tICcuLi9jb2xvcidcbmltcG9ydCB7IGV4dHJhY3RJbWFnZURhdGFCdWZmZXIgfSBmcm9tICcuLi9JbWFnZURhdGEvZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcidcbmltcG9ydCB0eXBlIHsgUGl4ZWxEYXRhIH0gZnJvbSAnLi4vUGl4ZWxEYXRhL1BpeGVsRGF0YSdcbmltcG9ydCB7IHRyaW1SZWN0Qm91bmRzIH0gZnJvbSAnLi4vUmVjdC90cmltUmVjdEJvdW5kcydcblxuZXhwb3J0IHR5cGUgRmxvb2RGaWxsSW1hZ2VEYXRhT3B0aW9ucyA9IHtcbiAgY29udGlndW91cz86IGJvb2xlYW5cbiAgdG9sZXJhbmNlPzogbnVtYmVyXG4gIGJvdW5kcz86IFJlY3Rcbn1cblxuZXhwb3J0IHR5cGUgRmxvb2RGaWxsUmVzdWx0ID0ge1xuICBzdGFydFg6IG51bWJlclxuICBzdGFydFk6IG51bWJlclxuICBzZWxlY3Rpb25SZWN0OiBTZWxlY3Rpb25SZWN0XG4gIHBpeGVsczogVWludDhDbGFtcGVkQXJyYXlcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGNvbG9yLWJhc2VkIGZsb29kIGZpbGwgc2VsZWN0aW9uIG9uIHtAbGluayBJbWFnZURhdGF9IG9yIHtAbGluayBQaXhlbERhdGF9LlxuICogVGhpcyB1dGlsaXR5IGlkZW50aWZpZXMgcGl4ZWxzIHN0YXJ0aW5nIGZyb20gYSBzcGVjaWZpYyBjb29yZGluYXRlIHRoYXQgZmFsbCB3aXRoaW4gYVxuICogY29sb3IgdG9sZXJhbmNlLiBJdCBjYW4gb3BlcmF0ZSBpbiBcImNvbnRpZ3VvdXNcIiBtb2RlIChjbGFzc2ljIGJ1Y2tldCBmaWxsKSBvclxuICogXCJub24tY29udGlndW91c1wiIG1vZGUgKHNlbGVjdHMgYWxsIG1hdGNoaW5nIHBpeGVscyBpbiB0aGUgYnVmZmVyKS5cbiAqXG4gKiBAcGFyYW0gaW1nIC0gVGhlIHNvdXJjZSBpbWFnZSBkYXRhIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0gc3RhcnRYIC0gVGhlIHN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSBzdGFydFkgLSBUaGUgc3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGZpbGwgb3BlcmF0aW9uLlxuICogQHBhcmFtIG9wdGlvbnMuY29udGlndW91cyAtIEBkZWZhdWx0IHRydWUuIElmIHRydWUsIG9ubHkgY29ubmVjdGVkIHBpeGVscyBhcmVcbiAqIHNlbGVjdGVkLiBJZiBmYWxzZSwgYWxsIHBpeGVscyB3aXRoaW4gdG9sZXJhbmNlIGFyZSBzZWxlY3RlZCByZWdhcmRsZXNzIG9mIHBvc2l0aW9uLlxuICogQHBhcmFtIG9wdGlvbnMudG9sZXJhbmNlIC0gQGRlZmF1bHQgMC4gVGhlIG1heGltdW0gYWxsb3dlZCBkaWZmZXJlbmNlIGluIGNvbG9yXG4gKiBkaXN0YW5jZSAoMC0yNTUpIGZvciBhIHBpeGVsIHRvIGJlIGluY2x1ZGVkLlxuICogQHBhcmFtIG9wdGlvbnMuYm91bmRzIC0gT3B0aW9uYWwgYm91bmRpbmcgYm94IHRvIHJlc3RyaWN0IHRoZSBzZWFyY2ggYXJlYS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBGbG9vZEZpbGxSZXN1bHR9IGNvbnRhaW5pbmcgdGhlIG1hc2sgYW5kIGJvdW5kcyBvZiB0aGUgc2VsZWN0aW9uLFxuICogb3IgYG51bGxgIGlmIHRoZSBzdGFydGluZyBjb29yZGluYXRlcyBhcmUgb3V0IG9mIGJvdW5kcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gZmxvb2RGaWxsSW1hZ2VEYXRhU2VsZWN0aW9uKFxuICogY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMDAsIDEwMCksXG4gKiA1MCxcbiAqIDUwLFxuICoge1xuICogdG9sZXJhbmNlOiAyMCxcbiAqIGNvbnRpZ3VvdXM6IHRydWVcbiAqIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb29kRmlsbFNlbGVjdGlvbihcbiAgaW1nOiBJbWFnZURhdGFMaWtlIHwgUGl4ZWxEYXRhLFxuICBzdGFydFg6IG51bWJlcixcbiAgc3RhcnRZOiBudW1iZXIsXG4gIHtcbiAgICBjb250aWd1b3VzID0gdHJ1ZSxcbiAgICB0b2xlcmFuY2UgPSAwLFxuICAgIGJvdW5kcyxcbiAgfTogRmxvb2RGaWxsSW1hZ2VEYXRhT3B0aW9ucyA9IHt9LFxuKTogRmxvb2RGaWxsUmVzdWx0IHwgbnVsbCB7XG5cbiAgbGV0IGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZVxuICBsZXQgZGF0YTMyOiBVaW50MzJBcnJheVxuICBpZiAoJ2RhdGEzMicgaW4gaW1nKSB7XG4gICAgZGF0YTMyID0gaW1nLmRhdGEzMlxuICAgIGltYWdlRGF0YSA9IGltZy5pbWFnZURhdGFcbiAgfSBlbHNlIHtcbiAgICBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkoXG4gICAgICBpbWcuZGF0YS5idWZmZXIsXG4gICAgICBpbWcuZGF0YS5ieXRlT2Zmc2V0LFxuICAgICAgaW1nLmRhdGEuYnl0ZUxlbmd0aCA+PiAyLFxuICAgIClcbiAgICBpbWFnZURhdGEgPSBpbWdcbiAgfVxuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICB9ID0gaW1nXG5cbiAgY29uc3QgbGltaXQgPSBib3VuZHMgfHwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiB3aWR0aCxcbiAgICBoOiBoZWlnaHQsXG4gIH1cblxuICBjb25zdCB4TWluID0gTWF0aC5tYXgoMCwgbGltaXQueClcbiAgY29uc3QgeE1heCA9IE1hdGgubWluKHdpZHRoIC0gMSwgbGltaXQueCArIGxpbWl0LncgLSAxKVxuICBjb25zdCB5TWluID0gTWF0aC5tYXgoMCwgbGltaXQueSlcbiAgY29uc3QgeU1heCA9IE1hdGgubWluKGhlaWdodCAtIDEsIGxpbWl0LnkgKyBsaW1pdC5oIC0gMSlcblxuICBpZiAoc3RhcnRYIDwgeE1pbiB8fCBzdGFydFggPiB4TWF4IHx8IHN0YXJ0WSA8IHlNaW4gfHwgc3RhcnRZID4geU1heCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBiYXNlQ29sb3IgPSBkYXRhMzJbc3RhcnRZICogd2lkdGggKyBzdGFydFhdIGFzIENvbG9yMzJcblxuICBsZXQgbWF0Y2hDb3VudCA9IDBcbiAgY29uc3QgbWF0Y2hYID0gbmV3IFVpbnQxNkFycmF5KHdpZHRoICogaGVpZ2h0KVxuICBjb25zdCBtYXRjaFkgPSBuZXcgVWludDE2QXJyYXkod2lkdGggKiBoZWlnaHQpXG5cbiAgbGV0IG1pblggPSBzdGFydFhcbiAgbGV0IG1heFggPSBzdGFydFhcbiAgbGV0IG1pblkgPSBzdGFydFlcbiAgbGV0IG1heFkgPSBzdGFydFlcblxuICBpZiAoY29udGlndW91cykge1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodClcbiAgICBjb25zdCBzdGFjayA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCAqIGhlaWdodClcbiAgICBsZXQgc3RhY2tQdHIgPSAwXG5cbiAgICBzdGFja1tzdGFja1B0cisrXSA9IChzdGFydFkgPDwgMTYpIHwgc3RhcnRYXG4gICAgdmlzaXRlZFtzdGFydFkgKiB3aWR0aCArIHN0YXJ0WF0gPSAxXG5cbiAgICB3aGlsZSAoc3RhY2tQdHIgPiAwKSB7XG4gICAgICBjb25zdCB2YWwgPSBzdGFja1stLXN0YWNrUHRyXVxuICAgICAgY29uc3QgeCA9IHZhbCAmIDB4RkZGRlxuICAgICAgY29uc3QgeSA9IHZhbCA+Pj4gMTZcblxuICAgICAgbWF0Y2hYW21hdGNoQ291bnRdID0geFxuICAgICAgbWF0Y2hZW21hdGNoQ291bnRdID0geVxuICAgICAgbWF0Y2hDb3VudCsrXG5cbiAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHhcbiAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHhcbiAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHlcbiAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHlcblxuICAgICAgLy8gUmlnaHRcbiAgICAgIGlmICh4ICsgMSA8PSB4TWF4KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiB3aWR0aCArICh4ICsgMSlcbiAgICAgICAgaWYgKCF2aXNpdGVkW2lkeF0gJiYgY29sb3JEaXN0YW5jZShkYXRhMzJbaWR4XSBhcyBDb2xvcjMyLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHZpc2l0ZWRbaWR4XSA9IDFcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9ICh5IDw8IDE2KSB8ICh4ICsgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTGVmdFxuICAgICAgaWYgKHggLSAxID49IHhNaW4pIHtcbiAgICAgICAgY29uc3QgaWR4ID0geSAqIHdpZHRoICsgKHggLSAxKVxuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMVxuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0gKHkgPDwgMTYpIHwgKHggLSAxKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEb3duXG4gICAgICBpZiAoeSArIDEgPD0geU1heCkge1xuICAgICAgICBjb25zdCBpZHggPSAoeSArIDEpICogd2lkdGggKyB4XG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxXG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoKHkgKyAxKSA8PCAxNikgfCB4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFVwXG4gICAgICBpZiAoeSAtIDEgPj0geU1pbikge1xuICAgICAgICBjb25zdCBpZHggPSAoeSAtIDEpICogd2lkdGggKyB4XG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxXG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoKHkgLSAxKSA8PCAxNikgfCB4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgeSA9IHlNaW47IHkgPD0geU1heDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8PSB4TWF4OyB4KyspIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSBkYXRhMzJbeSAqIHdpZHRoICsgeF0gYXMgQ29sb3IzMlxuICAgICAgICBpZiAoY29sb3JEaXN0YW5jZShjb2xvciwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICBtYXRjaFhbbWF0Y2hDb3VudF0gPSB4XG4gICAgICAgICAgbWF0Y2hZW21hdGNoQ291bnRdID0geVxuICAgICAgICAgIG1hdGNoQ291bnQrK1xuXG4gICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geFxuICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHhcbiAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5XG4gICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG1hdGNoQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHNlbGVjdGlvblJlY3Q6IFNlbGVjdGlvblJlY3QgPSB7XG4gICAgeDogbWluWCxcbiAgICB5OiBtaW5ZLFxuICAgIHc6IG1heFggLSBtaW5YICsgMSxcbiAgICBoOiBtYXhZIC0gbWluWSArIDEsXG4gICAgbWFzazogbmV3IFVpbnQ4QXJyYXkoKG1heFggLSBtaW5YICsgMSkgKiAobWF4WSAtIG1pblkgKyAxKSksXG4gICAgbWFza1R5cGU6IE1hc2tUeXBlLkJJTkFSWSxcbiAgfVxuXG4gIC8vIFJFTU9WRUQgdHJpbVJlY3RCb3VuZHMgZnJvbSBoZXJlXG5cbiAgY29uc3Qgc3cgPSBzZWxlY3Rpb25SZWN0LndcbiAgY29uc3Qgc2ggPSBzZWxlY3Rpb25SZWN0LmhcbiAgY29uc3QgZmluYWxNYXNrID0gc2VsZWN0aW9uUmVjdC5tYXNrIVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hDb3VudDsgaSsrKSB7XG4gICAgY29uc3QgbXggPSBtYXRjaFhbaV0gLSBzZWxlY3Rpb25SZWN0LnhcbiAgICBjb25zdCBteSA9IG1hdGNoWVtpXSAtIHNlbGVjdGlvblJlY3QueVxuXG4gICAgaWYgKG14ID49IDAgJiYgbXggPCBzdyAmJiBteSA+PSAwICYmIG15IDwgc2gpIHtcbiAgICAgIGZpbmFsTWFza1tteSAqIHN3ICsgbXhdID0gMVxuICAgIH1cbiAgfVxuXG4gIC8vIHRyaW1SZWN0Qm91bmRzIGNhbiBzZWUgdGhlbSBhbmQgd29yayBjb3JyZWN0bHkuXG4gIHRyaW1SZWN0Qm91bmRzKFxuICAgIHNlbGVjdGlvblJlY3QsXG4gICAgeyB4OiAwLCB5OiAwLCB3OiB3aWR0aCwgaDogaGVpZ2h0IH0sXG4gIClcblxuICAvLyBVc2UgdGhlIFVQREFURUQgdmFsdWVzIGZyb20gdGhlIHNlbGVjdGlvblJlY3QgYWZ0ZXIgdHJpbW1pbmdcbiAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihcbiAgICBpbWFnZURhdGEsXG4gICAgc2VsZWN0aW9uUmVjdC54LFxuICAgIHNlbGVjdGlvblJlY3QueSxcbiAgICBzZWxlY3Rpb25SZWN0LncsXG4gICAgc2VsZWN0aW9uUmVjdC5oLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFgsXG4gICAgc3RhcnRZLFxuICAgIHNlbGVjdGlvblJlY3QsXG4gICAgcGl4ZWxzOiBleHRyYWN0ZWQsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export const BaseBlendMode = {\n overwrite: 0,\n sourceOver: 1,\n darken: 2,\n multiply: 3,\n colorBurn: 4,\n linearBurn: 5,\n darkerColor: 6,\n lighten: 7,\n screen: 8,\n colorDodge: 9,\n linearDodge: 10,\n lighterColor: 11,\n overlay: 12,\n softLight: 13,\n hardLight: 14,\n vividLight: 15,\n linearLight: 16,\n pinLight: 17,\n hardMix: 18,\n difference: 19,\n exclusion: 20,\n subtract: 21,\n divide: 22\n} as const;\nexport interface RequiredBlendModes {\n overwrite: 0;\n}\nexport type BaseBlendModes = RequiredBlendModes & Record<string, number>;\nexport const overwriteBase: BlendColor32 = (src, _dst) => src;\noverwriteBase.isOverwrite = true;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBjb25zdCBCYXNlQmxlbmRNb2RlID0ge1xuICBvdmVyd3JpdGU6IDAsXG4gIHNvdXJjZU92ZXI6IDEsXG4gIGRhcmtlbjogMixcbiAgbXVsdGlwbHk6IDMsXG4gIGNvbG9yQnVybjogNCxcbiAgbGluZWFyQnVybjogNSxcbiAgZGFya2VyQ29sb3I6IDYsXG4gIGxpZ2h0ZW46IDcsXG4gIHNjcmVlbjogOCxcbiAgY29sb3JEb2RnZTogOSxcbiAgbGluZWFyRG9kZ2U6IDEwLFxuICBsaWdodGVyQ29sb3I6IDExLFxuICBvdmVybGF5OiAxMixcbiAgc29mdExpZ2h0OiAxMyxcbiAgaGFyZExpZ2h0OiAxNCxcbiAgdml2aWRMaWdodDogMTUsXG4gIGxpbmVhckxpZ2h0OiAxNixcbiAgcGluTGlnaHQ6IDE3LFxuICBoYXJkTWl4OiAxOCxcbiAgZGlmZmVyZW5jZTogMTksXG4gIGV4Y2x1c2lvbjogMjAsXG4gIHN1YnRyYWN0OiAyMSxcbiAgZGl2aWRlOiAyMixcbn0gYXMgY29uc3RcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlZEJsZW5kTW9kZXMge1xuICBvdmVyd3JpdGU6IDA7XG59XG5cbmV4cG9ydCB0eXBlIEJhc2VCbGVuZE1vZGVzID0gUmVxdWlyZWRCbGVuZE1vZGVzICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuXG5leHBvcnQgY29uc3Qgb3ZlcndyaXRlQmFzZTogQmxlbmRDb2xvcjMyID0gKHNyYywgX2RzdCkgPT4gc3JjXG5vdmVyd3JpdGVCYXNlLmlzT3ZlcndyaXRlID0gdHJ1ZVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { BlendColor32 } from '../_types';\nimport type { BaseBlendModes } from './blend-modes';\nexport type BlendModeRegistry<BlendModes extends BaseBlendModes = BaseBlendModes, Name extends keyof BlendModes = keyof BlendModes, Index extends BlendModes[Name] = BlendModes[Name]> = ReturnType<typeof makeBlendModeRegistry<BlendModes, Name, Index>>;\nexport function makeBlendModeRegistry<BlendModes extends BaseBlendModes, Name extends keyof BlendModes = keyof BlendModes, Index extends BlendModes[Name] = BlendModes[Name]>(blendModes: BlendModes, initialEntries: Record<Index, BlendColor32>, registryName = 'anonymous') {\n const blendToName = new Map<BlendColor32, Name>();\n const blendToIndex = new Map<BlendColor32, Index>();\n const indexToName: Name[] = [];\n const indexToBlend: BlendColor32[] = [];\n const nameToBlend = {} as { [K in keyof BlendModes]: BlendColor32 };\n const nameToIndex = {} as Record<Name, Index>;\n const add = (name: Name, index: Index, blendFn: BlendColor32) => {\n if (!Number.isFinite(index)) {\n throw new Error(`Index \"${index}\" is not a number. Attempting to add name: \"${name as string}\", index: \"${index}\"`);\n }\n if (indexToBlend[index]) {\n throw new Error(`Blend Mode index: ${index} is already used. Attempting to add name: \"${name as string}\", index: \"${index}\"`);\n }\n indexToName[index] = name;\n indexToBlend[index] = blendFn;\n blendToIndex.set(blendFn, index);\n blendToName.set(blendFn, name);\n nameToBlend[name] = blendFn;\n nameToIndex[name] = index;\n };\n for (const [name, index] of Object.entries(blendModes)) {\n const blend = initialEntries[index as Index];\n add(name as Name, index as Index, blend);\n }\n return {\n registryName,\n nameToBlend,\n nameToIndex,\n blendToIndex,\n blendToName,\n indexToBlend,\n indexToName,\n indexType: null as unknown as Index,\n nameType: null as unknown as Name\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEJhc2VCbGVuZE1vZGVzIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcblxuZXhwb3J0IHR5cGUgQmxlbmRNb2RlUmVnaXN0cnk8XG4gIEJsZW5kTW9kZXMgZXh0ZW5kcyBCYXNlQmxlbmRNb2RlcyA9IEJhc2VCbGVuZE1vZGVzLFxuICBOYW1lIGV4dGVuZHMga2V5b2YgQmxlbmRNb2RlcyA9IGtleW9mIEJsZW5kTW9kZXMsXG4gIEluZGV4IGV4dGVuZHMgQmxlbmRNb2Rlc1tOYW1lXSA9IEJsZW5kTW9kZXNbTmFtZV1cbj4gPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQmxlbmRNb2RlUmVnaXN0cnk8QmxlbmRNb2RlcywgTmFtZSwgSW5kZXg+PlxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5PFxuICBCbGVuZE1vZGVzIGV4dGVuZHMgQmFzZUJsZW5kTW9kZXMsXG4gIE5hbWUgZXh0ZW5kcyBrZXlvZiBCbGVuZE1vZGVzID0ga2V5b2YgQmxlbmRNb2RlcyxcbiAgSW5kZXggZXh0ZW5kcyBCbGVuZE1vZGVzW05hbWVdID0gQmxlbmRNb2Rlc1tOYW1lXVxuXG4+KFxuICBibGVuZE1vZGVzOiBCbGVuZE1vZGVzLFxuICBpbml0aWFsRW50cmllczogUmVjb3JkPEluZGV4LCBCbGVuZENvbG9yMzI+LFxuICByZWdpc3RyeU5hbWUgPSAnYW5vbnltb3VzJyxcbikge1xuXG4gIGNvbnN0IGJsZW5kVG9OYW1lID0gbmV3IE1hcDxCbGVuZENvbG9yMzIsIE5hbWU+KClcbiAgY29uc3QgYmxlbmRUb0luZGV4ID0gbmV3IE1hcDxCbGVuZENvbG9yMzIsIEluZGV4PigpXG4gIGNvbnN0IGluZGV4VG9OYW1lOiBOYW1lW10gPSBbXVxuICBjb25zdCBpbmRleFRvQmxlbmQ6IEJsZW5kQ29sb3IzMltdID0gW11cbiAgY29uc3QgbmFtZVRvQmxlbmQgPSB7fSBhcyB7IFtLIGluIGtleW9mIEJsZW5kTW9kZXNdOiBCbGVuZENvbG9yMzIgfVxuICBjb25zdCBuYW1lVG9JbmRleCA9IHt9IGFzIFJlY29yZDxOYW1lLCBJbmRleD5cblxuICBjb25zdCBhZGQgPSAobmFtZTogTmFtZSwgaW5kZXg6IEluZGV4LCBibGVuZEZuOiBCbGVuZENvbG9yMzIpID0+IHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kZXggXCIke2luZGV4fVwiIGlzIG5vdCBhIG51bWJlci4gQXR0ZW1wdGluZyB0byBhZGQgbmFtZTogXCIke25hbWUgYXMgc3RyaW5nfVwiLCBpbmRleDogXCIke2luZGV4fVwiYClcbiAgICB9XG5cbiAgICBpZiAoaW5kZXhUb0JsZW5kW2luZGV4XSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBCbGVuZCBNb2RlIGluZGV4OiAke2luZGV4fSBpcyBhbHJlYWR5IHVzZWQuIEF0dGVtcHRpbmcgdG8gYWRkIG5hbWU6IFwiJHtuYW1lIGFzIHN0cmluZ31cIiwgaW5kZXg6IFwiJHtpbmRleH1cImApXG4gICAgfVxuXG4gICAgaW5kZXhUb05hbWVbaW5kZXhdID0gbmFtZVxuICAgIGluZGV4VG9CbGVuZFtpbmRleF0gPSBibGVuZEZuXG4gICAgYmxlbmRUb0luZGV4LnNldChibGVuZEZuLCBpbmRleClcbiAgICBibGVuZFRvTmFtZS5zZXQoYmxlbmRGbiwgbmFtZSlcbiAgICBuYW1lVG9CbGVuZFtuYW1lXSA9IGJsZW5kRm5cbiAgICBuYW1lVG9JbmRleFtuYW1lXSA9IGluZGV4XG4gIH1cblxuICBmb3IgKGNvbnN0IFtuYW1lLCBpbmRleF0gb2YgT2JqZWN0LmVudHJpZXMoYmxlbmRNb2RlcykpIHtcbiAgICBjb25zdCBibGVuZCA9IGluaXRpYWxFbnRyaWVzW2luZGV4IGFzIEluZGV4XVxuICAgIGFkZChuYW1lIGFzIE5hbWUsIGluZGV4IGFzIEluZGV4LCBibGVuZClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVnaXN0cnlOYW1lLFxuICAgIG5hbWVUb0JsZW5kLFxuICAgIG5hbWVUb0luZGV4LFxuXG4gICAgYmxlbmRUb0luZGV4LFxuICAgIGJsZW5kVG9OYW1lLFxuXG4gICAgaW5kZXhUb0JsZW5kLFxuICAgIGluZGV4VG9OYW1lLFxuXG4gICAgaW5kZXhUeXBlOiBudWxsIGFzIHVua25vd24gYXMgSW5kZXgsXG4gICAgbmFtZVR5cGU6IG51bGwgYXMgdW5rbm93biBhcyBOYW1lLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwriteFast = overwriteBase;\nexport const sourceOverFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 255) return src;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = sr * sa + dr * invA >> 8;\n const g = sg * sa + dg * invA >> 8;\n const b = sb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = sr < dr ? sr : dr;\n const bg = sg < dg ? sg : dg;\n const bb = sb < db ? sb : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (src * dst) / 255 */\nexport const multiplyFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n\n // Consistent floor rounding for all channels\n const br = sr * dr >> 8;\n const bg = sg * dg >> 8;\n const bb = sb * db >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** 255 - (255-src)/dst */\nexport const colorBurnFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / sr | 0);\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / sg | 0);\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst - 255 */\nexport const linearBurnFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255;\n const bgU = dg + sg - 255;\n const bbU = db + sb - 255;\n const br = brU < 0 ? 0 : brU;\n const bg = bgU < 0 ? 0 : bgU;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkerFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb;\n if (lumSrc < lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(src, dst) */\nexport const lightenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const br = Math.max(src & 0xFF, dst & 0xFF);\n const bg = Math.max(src >> 8 & 0xFF, dst >> 8 & 0xFF);\n const bb = Math.max(src >> 16 & 0xFF, dst >> 16 & 0xFF);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const dr = dst & 0xFF;\n const dg = dst >> 8 & 0xFF;\n const db = dst >> 16 & 0xFF;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = 255 - ((255 - (src & 0xFF)) * (255 - dr) >> 8);\n const bg = 255 - ((255 - (src >>> 8 & 0xFF)) * (255 - dg) >> 8);\n const bb = 255 - ((255 - (src >>> 16 & 0xFF)) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgeFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 255 ? 255 : Math.min(255, (dr << 8) / (255 - sr) | 0);\n const bg = sg === 255 ? 255 : Math.min(255, (dg << 8) / (255 - sg) | 0);\n const bb = sb === 255 ? 255 : Math.min(255, (db << 8) / (255 - sb) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst */\nexport const linearDodgeFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brU = (src & 0xFF) + dr;\n const bgU = (src >>> 8 & 0xFF) + dg;\n const bbU = (src >>> 16 & 0xFF) + db;\n const br = brU > 255 ? 255 : brU;\n const bg = bgU > 255 ? 255 : bgU;\n const bb = bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const lighterFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // Selection Logic (Base result)\n let br, bg, bb;\n if (lumSrc > lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);\n const bg = dg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);\n const bb = db < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (255 - dr) * (sr * dr >> 8) + dr * (255 - ((255 - sr) * (255 - dr) >> 8)) >> 8;\n const bg = (255 - dg) * (sg * dg >> 8) + dg * (255 - ((255 - sg) * (255 - dg) >> 8)) >> 8;\n const bb = (255 - db) * (sb * db >> 8) + db * (255 - ((255 - sb) * (255 - db) >> 8)) >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);\n const bg = sg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);\n const bb = sb < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr) | 0) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)) | 0);\n const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg) | 0) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)) | 0);\n const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb) | 0) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr + 2 * sr - 255;\n const bgU = dg + 2 * sg - 255;\n const bbU = db + 2 * sb - 255;\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? dr < 2 * sr ? dr : 2 * sr : dr > 2 * sr - 256 ? dr : 2 * sr - 256;\n const bg = sg < 128 ? dg < 2 * sg ? dg : 2 * sg : dg > 2 * sg - 256 ? dg : 2 * sg - 256;\n const bb = sb < 128 ? db < 2 * sb ? db : 2 * sb : db > 2 * sb - 256 ? db : 2 * sb - 256;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr) | 0) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;\n const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg) | 0) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;\n const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb) | 0) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.abs(src - dst) */\nexport const differenceFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brD = (src & 0xFF) - dr;\n const bgD = (src >>> 8 & 0xFF) - dg;\n const bbD = (src >>> 16 & 0xFF) - db;\n const br = brD < 0 ? -brD : brD;\n const bg = bgD < 0 ? -bgD : bgD;\n const bb = bbD < 0 ? -bbD : bbD;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = dr + sr - (dr * sr >> 7);\n const bg = dg + sg - (dg * sg >> 7);\n const bb = db + sb - (db * sb >> 7);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(0, dst - src) */\nexport const subtractFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr - sr;\n const bgU = dg - sg;\n const bbU = db - sb;\n const br = brU < 0 ? 0 : brU;\n const bg = bgU < 0 ? 0 : bgU;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const divideFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 0 ? 255 : Math.min(255, (dr << 8) / sr | 0);\n const bg = sg === 0 ? 255 : Math.min(255, (dg << 8) / sg | 0);\n const bb = sb === 0 ? 255 : Math.min(255, (db << 8) / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const BASE_FAST_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwriteFast,\n [BaseBlendMode.sourceOver]: sourceOverFast,\n [BaseBlendMode.darken]: darkenFast,\n [BaseBlendMode.multiply]: multiplyFast,\n [BaseBlendMode.colorBurn]: colorBurnFast,\n [BaseBlendMode.linearBurn]: linearBurnFast,\n [BaseBlendMode.darkerColor]: darkerFast,\n [BaseBlendMode.lighten]: lightenFast,\n [BaseBlendMode.screen]: screenFast,\n [BaseBlendMode.colorDodge]: colorDodgeFast,\n [BaseBlendMode.linearDodge]: linearDodgeFast,\n [BaseBlendMode.lighterColor]: lighterFast,\n [BaseBlendMode.overlay]: overlayFast,\n [BaseBlendMode.softLight]: softLightFast,\n [BaseBlendMode.hardLight]: hardLightFast,\n [BaseBlendMode.vividLight]: vividLightFast,\n [BaseBlendMode.linearLight]: linearLightFast,\n [BaseBlendMode.pinLight]: pinLightFast,\n [BaseBlendMode.hardMix]: hardMixFast,\n [BaseBlendMode.difference]: differenceFast,\n [BaseBlendMode.exclusion]: exclusionFast,\n [BaseBlendMode.subtract]: subtractFast,\n [BaseBlendMode.divide]: divideFast\n};\nexport function makeFastBlendModeRegistry(name = 'fast') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_FAST_BLEND_MODE_FUNCTIONS, name);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBCYXNlQmxlbmRNb2RlLCBvdmVyd3JpdGVCYXNlIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcbmltcG9ydCB7IG1ha2VCbGVuZE1vZGVSZWdpc3RyeSB9IGZyb20gJy4vQmxlbmRNb2RlUmVnaXN0cnknXG5cbmV4cG9ydCBjb25zdCBvdmVyd3JpdGVGYXN0ID0gb3ZlcndyaXRlQmFzZVxuXG5leHBvcnQgY29uc3Qgc291cmNlT3ZlckZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiBzcmNcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChzciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoc2cgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKHNiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArIGRhICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCBkYXJrZW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBzciA8IGRyID8gc3IgOiBkclxuICBjb25zdCBiZyA9IHNnIDwgZGcgPyBzZyA6IGRnXG4gIGNvbnN0IGJiID0gc2IgPCBkYiA/IHNiIDogZGJcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiAoc3JjICogZHN0KSAvIDI1NSAqL1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIC8vIENvbnNpc3RlbnQgZmxvb3Igcm91bmRpbmcgZm9yIGFsbCBjaGFubmVsc1xuICBjb25zdCBiciA9IChzciAqIGRyKSA+PiA4XG4gIGNvbnN0IGJnID0gKHNnICogZGcpID4+IDhcbiAgY29uc3QgYmIgPSAoc2IgKiBkYikgPj4gOFxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHIgPSAoYnIgKiBzYSArIGRyICogaW52QSkgPj4gOFxuICBjb25zdCBnID0gKGJnICogc2EgKyBkZyAqIGludkEpID4+IDhcbiAgY29uc3QgYiA9IChiYiAqIHNhICsgZGIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGEgPSAoMjU1ICogc2EgKyBkYSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogMjU1IC0gKDI1NS1zcmMpL2RzdCAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yQnVybkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gZHIgPT09IDI1NSA/IDI1NSA6IHNyID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRyKSA8PCA4KSAvIHNyKSB8IDApXG4gIGNvbnN0IGJnID0gZGcgPT09IDI1NSA/IDI1NSA6IHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvIHNnKSB8IDApXG4gIGNvbnN0IGJiID0gZGIgPT09IDI1NSA/IDI1NSA6IHNiID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRiKSA8PCA4KSAvIHNiKSB8IDApXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgZGEgKiBpbnZBKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAtIDI1NSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckJ1cm5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gTWF0aDogQmFzZSArIEJsZW5kIC0gMjU1IChjbGFtcGVkIHRvIDApXG4gIGNvbnN0IGJyVSA9IGRyICsgc3IgLSAyNTVcbiAgY29uc3QgYmdVID0gZGcgKyBzZyAtIDI1NVxuICBjb25zdCBiYlUgPSBkYiArIHNiIC0gMjU1XG5cbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZyA9IGJnVSA8IDAgPyAwIDogYmdVXG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCBkYXJrZXJGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyAxLiBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIFdlaWdodHM6IFI6MC4zLCBHOjAuNTksIEI6MC4xMSlcbiAgLy8gU2NhbGVkIGJ5IDI1NiBmb3IgaW50ZWdlciBtYXRoOiA3NywgMTUxLCAyOFxuICBjb25zdCBsdW1TcmMgPSAoc3IgKiA3NyArIHNnICogMTUxICsgc2IgKiAyOClcbiAgY29uc3QgbHVtRHN0ID0gKGRyICogNzcgKyBkZyAqIDE1MSArIGRiICogMjgpXG5cbiAgLy8gMi4gU2VsZWN0aW9uIExvZ2ljXG4gIC8vIFBpY2sgdGhlIHBlcmNlcHR1YWxseSBkYXJrZXIgcGl4ZWxcbiAgbGV0IGJyLCBiZywgYmJcbiAgaWYgKGx1bVNyYyA8IGx1bURzdCkge1xuICAgIGJyID0gc3JcbiAgICBiZyA9IHNnXG4gICAgYmIgPSBzYlxuICB9IGVsc2Uge1xuICAgIGJyID0gZHJcbiAgICBiZyA9IGRnXG4gICAgYmIgPSBkYlxuICB9XG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIDMuIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoc3JjLCBkc3QpICovXG5leHBvcnQgY29uc3QgbGlnaHRlbkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IGJyID0gTWF0aC5tYXgoc3JjICYgMHhGRiwgZHN0ICYgMHhGRilcbiAgY29uc3QgYmcgPSBNYXRoLm1heCgoc3JjID4+IDgpICYgMHhGRiwgKGRzdCA+PiA4KSAmIDB4RkYpXG4gIGNvbnN0IGJiID0gTWF0aC5tYXgoKHNyYyA+PiAxNikgJiAweEZGLCAoZHN0ID4+IDE2KSAmIDB4RkYpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4gOCkgJiAweEZGXG4gIGNvbnN0IGRiID0gKGRzdCA+PiAxNikgJiAweEZGXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKlxuICogMjU1IC0gKCgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpXG4gKi9cbmV4cG9ydCBjb25zdCBzY3JlZW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gMjU1IC0gKCgoMjU1IC0gKHNyYyAmIDB4RkYpKSAqICgyNTUgLSBkcikpID4+IDgpXG4gIGNvbnN0IGJnID0gMjU1IC0gKCgoMjU1IC0gKChzcmMgPj4+IDgpICYgMHhGRikpICogKDI1NSAtIGRnKSkgPj4gOClcbiAgY29uc3QgYmIgPSAyNTUgLSAoKCgyNTUgLSAoKHNyYyA+Pj4gMTYpICYgMHhGRikpICogKDI1NSAtIGRiKSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRzdCA8PCA4KSAvICgyNTUgLSBzcmMpKSAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yRG9kZ2VGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiciA9IHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMjU1IC0gc3IpKSB8IDApXG4gIGNvbnN0IGJnID0gc2cgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkZyA8PCA4KSAvICgyNTUgLSBzZykpIHwgMClcbiAgY29uc3QgYmIgPSBzYiA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRiIDw8IDgpIC8gKDI1NSAtIHNiKSkgfCAwKVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IHIgPSAoYnIgKiBzYSArIGRyICogaW52QSkgPj4gOFxuICBjb25zdCBnID0gKGJnICogc2EgKyBkZyAqIGludkEpID4+IDhcbiAgY29uc3QgYiA9IChiYiAqIHNhICsgZGIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGEgPSAoMjU1ICogc2EgKyAoKGRzdCA+Pj4gMjQpICYgMHhGRikgKiBpbnZBKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckRvZGdlRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnJVID0gKHNyYyAmIDB4RkYpICsgZHJcbiAgY29uc3QgYmdVID0gKChzcmMgPj4+IDgpICYgMHhGRikgKyBkZ1xuICBjb25zdCBiYlUgPSAoKHNyYyA+Pj4gMTYpICYgMHhGRikgKyBkYlxuXG4gIGNvbnN0IGJyID0gYnJVID4gMjU1ID8gMjU1IDogYnJVXG4gIGNvbnN0IGJnID0gYmdVID4gMjU1ID8gMjU1IDogYmdVXG4gIGNvbnN0IGJiID0gYmJVID4gMjU1ID8gMjU1IDogYmJVXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgbGlnaHRlckZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIC8vIENhbGN1bGF0ZSBMdW1pbm9zaXR5IChQaG90b3Nob3AgdXNlcyBXZWlnaHRzOiBSOjAuMywgRzowLjU5LCBCOjAuMTEpXG4gIC8vIFdlIHVzZSBpbnRlZ2VyIG1hdGggKHNjYWxlZCBieSAyNTYpIGZvciBzcGVlZC5cbiAgY29uc3QgbHVtU3JjID0gKHNyICogNzcgKyBzZyAqIDE1MSArIHNiICogMjgpXG4gIGNvbnN0IGx1bURzdCA9IChkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4KVxuXG4gIC8vIFNlbGVjdGlvbiBMb2dpYyAoQmFzZSByZXN1bHQpXG4gIGxldCBiciwgYmcsIGJiXG4gIGlmIChsdW1TcmMgPiBsdW1Ec3QpIHtcbiAgICBiciA9IHNyXG4gICAgYmcgPSBzZ1xuICAgIGJiID0gc2JcbiAgfSBlbHNlIHtcbiAgICBiciA9IGRyXG4gICAgYmcgPSBkZ1xuICAgIGJiID0gZGJcbiAgfVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyAoMiAqIHNyYyAqIGRzdCkgOiAoMjU1IC0gMiAqICgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpICovXG5leHBvcnQgY29uc3Qgb3ZlcmxheUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gZHIgPCAxMjggPyAoMiAqIHNyICogZHIpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpID4+IDgpXG4gIGNvbnN0IGJnID0gZGcgPCAxMjggPyAoMiAqIHNnICogZGcpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpID4+IDgpXG4gIGNvbnN0IGJiID0gZGIgPCAxMjggPyAoMiAqIHNiICogZGIpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpID4+IDgpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogKCgyNTUgLSBkc3QpICogKChzcmMgKiBkc3QpID4+IDgpICsgZHN0ICogKDI1NSAtICgoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSkgPj4gOCkpKSA+PiA4ICovXG5leHBvcnQgY29uc3Qgc29mdExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAoKDI1NSAtIGRyKSAqICgoc3IgKiBkcikgPj4gOCkgKyBkciAqICgyNTUgLSAoKCgyNTUgLSBzcikgKiAoMjU1IC0gZHIpKSA+PiA4KSkpID4+IDhcbiAgY29uc3QgYmcgPSAoKDI1NSAtIGRnKSAqICgoc2cgKiBkZykgPj4gOCkgKyBkZyAqICgyNTUgLSAoKCgyNTUgLSBzZykgKiAoMjU1IC0gZGcpKSA+PiA4KSkpID4+IDhcbiAgY29uc3QgYmIgPSAoKDI1NSAtIGRiKSAqICgoc2IgKiBkYikgPj4gOCkgKyBkYiAqICgyNTUgLSAoKCgyNTUgLSBzYikgKiAoMjU1IC0gZGIpKSA+PiA4KSkpID4+IDhcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBJZiBzcmMgPCAxMjggKDUwJSBncmF5KSwgTXVsdGlwbHk7IG90aGVyd2lzZSwgU2NyZWVuICovXG5leHBvcnQgY29uc3QgaGFyZExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/ICgyICogc3IgKiBkcikgPj4gOCA6IDI1NSAtICgoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpKSA+PiA4KVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKDIgKiBzZyAqIGRnKSA+PiA4IDogMjU1IC0gKCgyICogKDI1NSAtIHNnKSAqICgyNTUgLSBkZykpID4+IDgpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoMiAqIHNiICogZGIpID4+IDggOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2IpICogKDI1NSAtIGRiKSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKlxuICogSWYgc3JjIDwgMTI4OiBCdXJuKGRzdCwgMiAqIHNyYylcbiAqIElmIHNyYyA+PSAxMjg6IERvZGdlKGRzdCwgMiAqIChzcmMgLSAxMjgpKVxuICovXG5leHBvcnQgY29uc3Qgdml2aWRMaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgoMjU1IC0gZHIpIDw8IDgpIC8gKDIgKiBzcikpIHwgMCkpIDogKHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMiAqICgyNTUgLSBzcikpKSB8IDApKVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvICgyICogc2cpKSB8IDApKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSlcbiAgY29uc3QgYmIgPSBzYiA8IDEyOCA/IChzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoKCgyNTUgLSBkYikgPDwgOCkgLyAoMiAqIHNiKSkgfCAwKSkgOiAoc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvICgyICogKDI1NSAtIHNiKSkpIHwgMCkpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgMiAqIHNyYyAtIDI1NSAoQ2xhbXBlZCB0byAwLTI1NSkgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJMaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyVSA9IGRyICsgMiAqIHNyIC0gMjU1XG4gIGNvbnN0IGJnVSA9IGRnICsgMiAqIHNnIC0gMjU1XG4gIGNvbnN0IGJiVSA9IGRiICsgMiAqIHNiIC0gMjU1XG5cbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVSA+IDI1NSA/IDI1NSA6IGJyVVxuICBjb25zdCBiZyA9IGJnVSA8IDAgPyAwIDogYmdVID4gMjU1ID8gMjU1IDogYmdVXG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlUgPiAyNTUgPyAyNTUgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyBtaW4oZHN0LCAyICogc3JjKSA6IG1heChkc3QsIDIgKiAoc3JjIC0gMTI4KSkgKi9cbmV4cG9ydCBjb25zdCBwaW5MaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoZHIgPCAyICogc3IgPyBkciA6IDIgKiBzcikgOiAoZHIgPiAyICogc3IgLSAyNTYgPyBkciA6IDIgKiBzciAtIDI1NilcbiAgY29uc3QgYmcgPSBzZyA8IDEyOCA/IChkZyA8IDIgKiBzZyA/IGRnIDogMiAqIHNnKSA6IChkZyA+IDIgKiBzZyAtIDI1NiA/IGRnIDogMiAqIHNnIC0gMjU2KVxuICBjb25zdCBiYiA9IHNiIDwgMTI4ID8gKGRiIDwgMiAqIHNiID8gZGIgOiAyICogc2IpIDogKGRiID4gMiAqIHNiIC0gMjU2ID8gZGIgOiAyICogc2IgLSAyNTYpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogKFZpdmlkIExpZ2h0IGxvZ2ljIGZvcmNlZCB0byAwIG9yIDI1NSkgKi9cbmV4cG9ydCBjb25zdCBoYXJkTWl4RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAoc3IgPCAxMjggPyAoc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgoMjU1IC0gZHIpIDw8IDgpIC8gKDIgKiBzcikpIHwgMCkpIDogKHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMiAqICgyNTUgLSBzcikpKSB8IDApKSkgPCAxMjggPyAwIDogMjU1XG4gIGNvbnN0IGJnID0gKHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvICgyICogc2cpKSB8IDApKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpIDwgMTI4ID8gMCA6IDI1NVxuICBjb25zdCBiYiA9IChzYiA8IDEyOCA/IChzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoKCgyNTUgLSBkYikgPDwgOCkgLyAoMiAqIHNiKSkgfCAwKSkgOiAoc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvICgyICogKDI1NSAtIHNiKSkpIHwgMCkpKSA8IDEyOCA/IDAgOiAyNTVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBNYXRoLmFicyhzcmMgLSBkc3QpICovXG5leHBvcnQgY29uc3QgZGlmZmVyZW5jZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnJEID0gKHNyYyAmIDB4RkYpIC0gZHJcbiAgY29uc3QgYmdEID0gKChzcmMgPj4+IDgpICYgMHhGRikgLSBkZ1xuICBjb25zdCBiYkQgPSAoKHNyYyA+Pj4gMTYpICYgMHhGRikgLSBkYlxuXG4gIGNvbnN0IGJyID0gYnJEIDwgMCA/IC1ickQgOiBickRcbiAgY29uc3QgYmcgPSBiZ0QgPCAwID8gLWJnRCA6IGJnRFxuICBjb25zdCBiYiA9IGJiRCA8IDAgPyAtYmJEIDogYmJEXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgc3JjIC0gKChkc3QgKiBzcmMpID4+IDcpICovXG5leHBvcnQgY29uc3QgZXhjbHVzaW9uRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBkciArIHNyIC0gKChkciAqIHNyKSA+PiA3KVxuICBjb25zdCBiZyA9IGRnICsgc2cgLSAoKGRnICogc2cpID4+IDcpXG4gIGNvbnN0IGJiID0gZGIgKyBzYiAtICgoZGIgKiBzYikgPj4gNylcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBNYXRoLm1heCgwLCBkc3QgLSBzcmMpICovXG5leHBvcnQgY29uc3Qgc3VidHJhY3RGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiclUgPSBkciAtIHNyXG4gIGNvbnN0IGJnVSA9IGRnIC0gc2dcbiAgY29uc3QgYmJVID0gZGIgLSBzYlxuXG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclVcbiAgY29uc3QgYmcgPSBiZ1UgPCAwID8gMCA6IGJnVVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvIHNyKSAqL1xuZXhwb3J0IGNvbnN0IGRpdmlkZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyBzcikgfCAwKVxuICBjb25zdCBiZyA9IHNnID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gc2cpIHwgMClcbiAgY29uc3QgYmIgPSBzYiA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvIHNiKSB8IDApXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgQkFTRV9GQVNUX0JMRU5EX01PREVfRlVOQ1RJT05TOiBSZWNvcmQ8bnVtYmVyLCBCbGVuZENvbG9yMzI+ID0ge1xuICBbQmFzZUJsZW5kTW9kZS5vdmVyd3JpdGVdOiBvdmVyd3JpdGVGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5zb3VyY2VPdmVyXTogc291cmNlT3ZlckZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmRhcmtlbl06IGRhcmtlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLm11bHRpcGx5XTogbXVsdGlwbHlGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5jb2xvckJ1cm5dOiBjb2xvckJ1cm5GYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJCdXJuXTogbGluZWFyQnVybkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmRhcmtlckNvbG9yXTogZGFya2VyRmFzdCxcblxuICBbQmFzZUJsZW5kTW9kZS5saWdodGVuXTogbGlnaHRlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNjcmVlbl06IHNjcmVlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmNvbG9yRG9kZ2VdOiBjb2xvckRvZGdlRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyRG9kZ2VdOiBsaW5lYXJEb2RnZUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpZ2h0ZXJDb2xvcl06IGxpZ2h0ZXJGYXN0LFxuXG4gIFtCYXNlQmxlbmRNb2RlLm92ZXJsYXldOiBvdmVybGF5RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc29mdExpZ2h0XTogc29mdExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuaGFyZExpZ2h0XTogaGFyZExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUudml2aWRMaWdodF06IHZpdmlkTGlnaHRGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJMaWdodF06IGxpbmVhckxpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUucGluTGlnaHRdOiBwaW5MaWdodEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRNaXhdOiBoYXJkTWl4RmFzdCxcblxuICBbQmFzZUJsZW5kTW9kZS5kaWZmZXJlbmNlXTogZGlmZmVyZW5jZUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmV4Y2x1c2lvbl06IGV4Y2x1c2lvbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnN1YnRyYWN0XTogc3VidHJhY3RGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5kaXZpZGVdOiBkaXZpZGVGYXN0LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUZhc3RCbGVuZE1vZGVSZWdpc3RyeShuYW1lID0gJ2Zhc3QnKSB7XG4gIHJldHVybiBtYWtlQmxlbmRNb2RlUmVnaXN0cnkoQmFzZUJsZW5kTW9kZSwgQkFTRV9GQVNUX0JMRU5EX01PREVfRlVOQ1RJT05TLCBuYW1lKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwritePerfect = overwriteBase;\nexport const sourceOverPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 255) return src;\n if (sa === 0) return dst;\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return src;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const invA = 255 - sa;\n // Exact division by 255 using bit-shifts\n // Formula: (v + 1 + (v >> 8)) >> 8\n const tR = sr * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = sg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = sb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = sr < dr ? sr : dr;\n const bg = sg < dg ? sg : dg;\n const bb = sb < db ? sb : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (src * dst) / 255 */\nexport const multiplyPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Calculate base multiply result: (sr * dr) / 255\n const mR = sr * dr;\n const br = mR + 1 + (mR >> 8) >> 8;\n const mG = sg * dg;\n const bg = mG + 1 + (mG >> 8) >> 8;\n const mB = sb * db;\n const bb = mB + 1 + (mB >> 8) >> 8;\n\n // If fully opaque, return with full alpha\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** 255 - (255-src)/dst */\nexport const colorBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Color Burn Core Math: 255 - ((255 - dst) * 255 / src)\n // We use | 0 to truncate the division result immediately.\n const resR = dr === 255 ? 255 : sr === 0 ? 0 : 255 - ((255 - dr) * 255 / sr | 0);\n const br = resR < 0 ? 0 : resR;\n const resG = dg === 255 ? 255 : sg === 0 ? 0 : 255 - ((255 - dg) * 255 / sg | 0);\n const bg = resG < 0 ? 0 : resG;\n const resB = db === 255 ? 255 : sb === 0 ? 0 : 255 - ((255 - db) * 255 / sb | 0);\n const bb = resB < 0 ? 0 : resB;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst - 255 */\nexport const linearBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255;\n const br = brU < 0 ? 0 : brU;\n const bgU = dg + sg - 255;\n const bg = bgU < 0 ? 0 : bgU;\n const bbU = db + sb - 255;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkerPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb;\n if (lumSrc < lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(src, dst) */\nexport const lightenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = (src & 0xFF) > dr ? src & 0xFF : dr;\n const bg = (src >>> 8 & 0xFF) > dg ? src >>> 8 & 0xFF : dg;\n const bb = (src >>> 16 & 0xFF) > db ? src >>> 16 & 0xFF : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = 255 - ((255 - (src & 0xFF)) * (255 - dr) / 255 | 0);\n const bg = 255 - ((255 - (src >>> 8 & 0xFF)) * (255 - dg) / 255 | 0);\n const bb = 255 - ((255 - (src >>> 16 & 0xFF)) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Color Dodge Core Math: (dst * 255) / (255 - src)\n // We use ternary checks to handle the sr === 255 division-by-zero guard.\n const resR = sr === 255 ? 255 : dr * 255 / (255 - sr) | 0;\n const br = resR > 255 ? 255 : resR;\n const resG = sg === 255 ? 255 : dg * 255 / (255 - sg) | 0;\n const bg = resG > 255 ? 255 : resG;\n const resB = sb === 255 ? 255 : db * 255 / (255 - sb) | 0;\n const bb = resB > 255 ? 255 : resB;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst */\nexport const linearDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brU = (src & 0xFF) + dr;\n const br = brU > 255 ? 255 : brU;\n const bgU = (src >>> 8 & 0xFF) + dg;\n const bg = bgU > 255 ? 255 : bgU;\n const bbU = (src >>> 16 & 0xFF) + db;\n const bb = bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const lighterPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // Selection Logic (Base result)\n let br, bg, bb;\n if (lumSrc > lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);\n const bg = dg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);\n const bb = db < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const mR = sr * dr;\n const scR = (255 - sr) * (255 - dr);\n const br = (255 - dr) * (mR + 1 + (mR >> 8) >> 8) + dr * (255 - (scR + 1 + (scR >> 8) >> 8)) + 1 + ((255 - dr) * (mR + 1 + (mR >> 8) >> 8) + dr * (255 - (scR + 1 + (scR >> 8) >> 8)) >> 8) >> 8;\n const mG = sg * dg;\n const scG = (255 - sg) * (255 - dg);\n const bg = (255 - dg) * (mG + 1 + (mG >> 8) >> 8) + dg * (255 - (scG + 1 + (scG >> 8) >> 8)) + 1 + ((255 - dg) * (mG + 1 + (mG >> 8) >> 8) + dg * (255 - (scG + 1 + (scG >> 8) >> 8)) >> 8) >> 8;\n const mB = sb * db;\n const scB = (255 - sb) * (255 - db);\n const bb = (255 - db) * (mB + 1 + (mB >> 8) >> 8) + db * (255 - (scB + 1 + (scB >> 8) >> 8)) + 1 + ((255 - db) * (mB + 1 + (mB >> 8) >> 8) + db * (255 - (scB + 1 + (scB >> 8) >> 8)) >> 8) >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);\n const bg = sg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);\n const bb = sb < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0);\n const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0);\n const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr + 2 * sr - 255;\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;\n const bgU = dg + 2 * sg - 255;\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;\n const bbU = db + 2 * sb - 255;\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? dr < sr << 1 ? dr : sr << 1 : dr > sr - 128 << 1 ? dr : sr - 128 << 1;\n const bg = sg < 128 ? dg < sg << 1 ? dg : sg << 1 : dg > sg - 128 << 1 ? dg : sg - 128 << 1;\n const bb = sb < 128 ? db < sb << 1 ? db : sb << 1 : db > sb - 128 << 1 ? db : sb - 128 << 1;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;\n const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;\n const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.abs(src - dst) */\nexport const differencePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = dr > sr ? dr - sr : sr - dr;\n const bg = dg > sg ? dg - sg : sg - dg;\n const bb = db > sb ? db - sb : sb - db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const r2 = dr * sr;\n const br = dr + sr - (r2 + r2 + 1 + (r2 + r2 >> 8) >> 8);\n const g2 = dg * sg;\n const bg = dg + sg - (g2 + g2 + 1 + (g2 + g2 >> 8) >> 8);\n const b2 = db * sb;\n const bb = db + sb - (b2 + b2 + 1 + (b2 + b2 >> 8) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(0, dst - src) */\nexport const subtractPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr - sr;\n const br = brU < 0 ? 0 : brU;\n const bgU = dg - sg;\n const bg = bgU < 0 ? 0 : bgU;\n const bbU = db - sb;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const dividePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 0 ? 255 : Math.min(255, dr * 255 / sr | 0);\n const bg = sg === 0 ? 255 : Math.min(255, dg * 255 / sg | 0);\n const bb = sb === 0 ? 255 : Math.min(255, db * 255 / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const BASE_PERFECT_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwritePerfect,\n [BaseBlendMode.sourceOver]: sourceOverPerfect,\n [BaseBlendMode.darken]: darkenPerfect,\n [BaseBlendMode.multiply]: multiplyPerfect,\n [BaseBlendMode.colorBurn]: colorBurnPerfect,\n [BaseBlendMode.linearBurn]: linearBurnPerfect,\n [BaseBlendMode.darkerColor]: darkerPerfect,\n [BaseBlendMode.lighten]: lightenPerfect,\n [BaseBlendMode.screen]: screenPerfect,\n [BaseBlendMode.colorDodge]: colorDodgePerfect,\n [BaseBlendMode.linearDodge]: linearDodgePerfect,\n [BaseBlendMode.lighterColor]: lighterPerfect,\n [BaseBlendMode.overlay]: overlayPerfect,\n [BaseBlendMode.softLight]: softLightPerfect,\n [BaseBlendMode.hardLight]: hardLightPerfect,\n [BaseBlendMode.vividLight]: vividLightPerfect,\n [BaseBlendMode.linearLight]: linearLightPerfect,\n [BaseBlendMode.pinLight]: pinLightPerfect,\n [BaseBlendMode.hardMix]: hardMixPerfect,\n [BaseBlendMode.difference]: differencePerfect,\n [BaseBlendMode.exclusion]: exclusionPerfect,\n [BaseBlendMode.subtract]: subtractPerfect,\n [BaseBlendMode.divide]: dividePerfect\n};\nexport function makePerfectBlendModeRegistry(name = 'perfect') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_PERFECT_BLEND_MODE_FUNCTIONS, name);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBCYXNlQmxlbmRNb2RlLCBvdmVyd3JpdGVCYXNlIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcbmltcG9ydCB7IG1ha2VCbGVuZE1vZGVSZWdpc3RyeSB9IGZyb20gJy4vQmxlbmRNb2RlUmVnaXN0cnknXG5cbmV4cG9ydCBjb25zdCBvdmVyd3JpdGVQZXJmZWN0ID0gb3ZlcndyaXRlQmFzZVxuXG5leHBvcnQgY29uc3Qgc291cmNlT3ZlclBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiBzcmNcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG4gIGlmIChkYSA9PT0gMCkgcmV0dXJuIHNyY1xuXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgLy8gRXhhY3QgZGl2aXNpb24gYnkgMjU1IHVzaW5nIGJpdC1zaGlmdHNcbiAgLy8gRm9ybXVsYTogKHYgKyAxICsgKHYgPj4gOCkpID4+IDhcbiAgY29uc3QgdFIgPSAoc3IgKiBzYSArIGRyICogaW52QSlcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IChzZyAqIHNhICsgZGcgKiBpbnZBKVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IHRCID0gKHNiICogc2EgKyBkYiAqIGludkEpXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEEgPSAoMjU1ICogc2EgKyBkYSAqIGludkEpXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IGRhcmtlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiciA9IHNyIDwgZHIgPyBzciA6IGRyXG4gIGNvbnN0IGJnID0gc2cgPCBkZyA/IHNnIDogZGdcbiAgY29uc3QgYmIgPSBzYiA8IGRiID8gc2IgOiBkYlxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiAoc3JjICogZHN0KSAvIDI1NSAqL1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkZcbiAgY29uc3QgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkZcbiAgY29uc3QgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRlxuICBjb25zdCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRlxuICBjb25zdCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyBDYWxjdWxhdGUgYmFzZSBtdWx0aXBseSByZXN1bHQ6IChzciAqIGRyKSAvIDI1NVxuICBjb25zdCBtUiA9IHNyICogZHJcbiAgY29uc3QgYnIgPSAobVIgKyAxICsgKG1SID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgbUcgPSBzZyAqIGRnXG4gIGNvbnN0IGJnID0gKG1HICsgMSArIChtRyA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1CID0gc2IgKiBkYlxuICBjb25zdCBiYiA9IChtQiArIDEgKyAobUIgPj4gOCkpID4+IDhcblxuICAvLyBJZiBmdWxseSBvcGFxdWUsIHJldHVybiB3aXRoIGZ1bGwgYWxwaGFcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIDI1NSAtICgyNTUtc3JjKS9kc3QgKi9cbmV4cG9ydCBjb25zdCBjb2xvckJ1cm5QZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBzciA9IHNyYyAmIDB4RkZcbiAgY29uc3Qgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkZcbiAgY29uc3Qgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gQ29sb3IgQnVybiBDb3JlIE1hdGg6IDI1NSAtICgoMjU1IC0gZHN0KSAqIDI1NSAvIHNyYylcbiAgLy8gV2UgdXNlIHwgMCB0byB0cnVuY2F0ZSB0aGUgZGl2aXNpb24gcmVzdWx0IGltbWVkaWF0ZWx5LlxuICBjb25zdCByZXNSID0gZHIgPT09IDI1NSA/IDI1NSA6IHNyID09PSAwID8gMCA6IDI1NSAtICgoKDI1NSAtIGRyKSAqIDI1NSAvIHNyKSB8IDApXG4gIGNvbnN0IGJyID0gcmVzUiA8IDAgPyAwIDogcmVzUlxuXG4gIGNvbnN0IHJlc0cgPSBkZyA9PT0gMjU1ID8gMjU1IDogc2cgPT09IDAgPyAwIDogMjU1IC0gKCgoMjU1IC0gZGcpICogMjU1IC8gc2cpIHwgMClcbiAgY29uc3QgYmcgPSByZXNHIDwgMCA/IDAgOiByZXNHXG5cbiAgY29uc3QgcmVzQiA9IGRiID09PSAyNTUgPyAyNTUgOiBzYiA9PT0gMCA/IDAgOiAyNTUgLSAoKCgyNTUgLSBkYikgKiAyNTUgLyBzYikgfCAwKVxuICBjb25zdCBiYiA9IHJlc0IgPCAwID8gMCA6IHJlc0JcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAtIDI1NSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckJ1cm5QZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gTWF0aDogQmFzZSArIEJsZW5kIC0gMjU1IChjbGFtcGVkIHRvIDApXG4gIGNvbnN0IGJyVSA9IGRyICsgc3IgLSAyNTVcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZ1UgPSBkZyArIHNnIC0gMjU1XG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1VcbiAgY29uc3QgYmJVID0gZGIgKyBzYiAtIDI1NVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgZGFya2VyUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gMS4gQ2FsY3VsYXRlIEx1bWlub3NpdHkgKFBob3Rvc2hvcCBXZWlnaHRzOiBSOjAuMywgRzowLjU5LCBCOjAuMTEpXG4gIC8vIFNjYWxlZCBieSAyNTYgZm9yIGludGVnZXIgbWF0aDogNzcsIDE1MSwgMjhcbiAgY29uc3QgbHVtU3JjID0gKHNyICogNzcgKyBzZyAqIDE1MSArIHNiICogMjgpXG4gIGNvbnN0IGx1bURzdCA9IChkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4KVxuXG4gIC8vIDIuIFNlbGVjdGlvbiBMb2dpY1xuICAvLyBQaWNrIHRoZSBwZXJjZXB0dWFsbHkgZGFya2VyIHBpeGVsXG4gIGxldCBiciwgYmcsIGJiXG4gIGlmIChsdW1TcmMgPCBsdW1Ec3QpIHtcbiAgICBiciA9IHNyXG4gICAgYmcgPSBzZ1xuICAgIGJiID0gc2JcbiAgfSBlbHNlIHtcbiAgICBiciA9IGRyXG4gICAgYmcgPSBkZ1xuICAgIGJiID0gZGJcbiAgfVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyAzLiBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoc3JjLCBkc3QpICovXG5leHBvcnQgY29uc3QgbGlnaHRlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyID0gKHNyYyAmIDB4RkYpID4gZHIgPyAoc3JjICYgMHhGRikgOiBkclxuICBjb25zdCBiZyA9ICgoc3JjID4+PiA4KSAmIDB4RkYpID4gZGcgPyAoKHNyYyA+Pj4gOCkgJiAweEZGKSA6IGRnXG4gIGNvbnN0IGJiID0gKChzcmMgPj4+IDE2KSAmIDB4RkYpID4gZGIgPyAoKHNyYyA+Pj4gMTYpICYgMHhGRikgOiBkYlxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqXG4gKiAyNTUgLSAoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSlcbiAqL1xuZXhwb3J0IGNvbnN0IHNjcmVlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAyNTUgLSAoKCgyNTUgLSAoc3JjICYgMHhGRikpICogKDI1NSAtIGRyKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiZyA9IDI1NSAtICgoKDI1NSAtICgoc3JjID4+PiA4KSAmIDB4RkYpKSAqICgyNTUgLSBkZykgLyAyNTUpIHwgMClcbiAgY29uc3QgYmIgPSAyNTUgLSAoKCgyNTUgLSAoKHNyYyA+Pj4gMTYpICYgMHhGRikpICogKDI1NSAtIGRiKSAvIDI1NSkgfCAwKVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRzdCA8PCA4KSAvICgyNTUgLSBzcmMpKSAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yRG9kZ2VQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBzciA9IHNyYyAmIDB4RkZcbiAgY29uc3Qgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkZcbiAgY29uc3Qgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gQ29sb3IgRG9kZ2UgQ29yZSBNYXRoOiAoZHN0ICogMjU1KSAvICgyNTUgLSBzcmMpXG4gIC8vIFdlIHVzZSB0ZXJuYXJ5IGNoZWNrcyB0byBoYW5kbGUgdGhlIHNyID09PSAyNTUgZGl2aXNpb24tYnktemVybyBndWFyZC5cbiAgY29uc3QgcmVzUiA9IHNyID09PSAyNTUgPyAyNTUgOiAoZHIgKiAyNTUgLyAoMjU1IC0gc3IpKSB8IDBcbiAgY29uc3QgYnIgPSByZXNSID4gMjU1ID8gMjU1IDogcmVzUlxuXG4gIGNvbnN0IHJlc0cgPSBzZyA9PT0gMjU1ID8gMjU1IDogKGRnICogMjU1IC8gKDI1NSAtIHNnKSkgfCAwXG4gIGNvbnN0IGJnID0gcmVzRyA+IDI1NSA/IDI1NSA6IHJlc0dcblxuICBjb25zdCByZXNCID0gc2IgPT09IDI1NSA/IDI1NSA6IChkYiAqIDI1NSAvICgyNTUgLSBzYikpIHwgMFxuICBjb25zdCBiYiA9IHJlc0IgPiAyNTUgPyAyNTUgOiByZXNCXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgKyBkc3QgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJEb2RnZVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyVSA9IChzcmMgJiAweEZGKSArIGRyXG4gIGNvbnN0IGJyID0gYnJVID4gMjU1ID8gMjU1IDogYnJVXG4gIGNvbnN0IGJnVSA9ICgoc3JjID4+PiA4KSAmIDB4RkYpICsgZGdcbiAgY29uc3QgYmcgPSBiZ1UgPiAyNTUgPyAyNTUgOiBiZ1VcbiAgY29uc3QgYmJVID0gKChzcmMgPj4+IDE2KSAmIDB4RkYpICsgZGJcbiAgY29uc3QgYmIgPSBiYlUgPiAyNTUgPyAyNTUgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IGxpZ2h0ZXJQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIHVzZXMgV2VpZ2h0czogUjowLjMsIEc6MC41OSwgQjowLjExKVxuICAvLyBXZSB1c2UgaW50ZWdlciBtYXRoIChzY2FsZWQgYnkgMjU2KSBmb3Igc3BlZWQuXG4gIGNvbnN0IGx1bVNyYyA9IChzciAqIDc3ICsgc2cgKiAxNTEgKyBzYiAqIDI4KVxuICBjb25zdCBsdW1Ec3QgPSAoZHIgKiA3NyArIGRnICogMTUxICsgZGIgKiAyOClcblxuICAvLyBTZWxlY3Rpb24gTG9naWMgKEJhc2UgcmVzdWx0KVxuICBsZXQgYnIsIGJnLCBiYlxuICBpZiAobHVtU3JjID4gbHVtRHN0KSB7XG4gICAgYnIgPSBzclxuICAgIGJnID0gc2dcbiAgICBiYiA9IHNiXG4gIH0gZWxzZSB7XG4gICAgYnIgPSBkclxuICAgIGJnID0gZGdcbiAgICBiYiA9IGRiXG4gIH1cblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyAoMiAqIHNyYyAqIGRzdCkgOiAoMjU1IC0gMiAqICgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpICovXG5leHBvcnQgY29uc3Qgb3ZlcmxheVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IGRyIDwgMTI4ID8gKDIgKiBzciAqIGRyIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc3IpICogKDI1NSAtIGRyKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiZyA9IGRnIDwgMTI4ID8gKDIgKiBzZyAqIGRnIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2cpICogKDI1NSAtIGRnKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiYiA9IGRiIDwgMTI4ID8gKDIgKiBzYiAqIGRiIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2IpICogKDI1NSAtIGRiKSAvIDI1NSkgfCAwKVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqICgoMjU1IC0gZHN0KSAqICgoc3JjICogZHN0KSA+PiA4KSArIGRzdCAqICgyNTUgLSAoKCgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpID4+IDgpKSkgPj4gOCAqL1xuZXhwb3J0IGNvbnN0IHNvZnRMaWdodFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IG1SID0gKHNyICogZHIpXG4gIGNvbnN0IHNjUiA9ICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpXG4gIGNvbnN0IGJyID0gKCgyNTUgLSBkcikgKiAoKG1SICsgMSArIChtUiA+PiA4KSkgPj4gOCkgKyBkciAqICgyNTUgLSAoKHNjUiArIDEgKyAoc2NSID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZHIpICogKChtUiArIDEgKyAobVIgPj4gOCkpID4+IDgpICsgZHIgKiAoMjU1IC0gKChzY1IgKyAxICsgKHNjUiA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1HID0gKHNnICogZGcpXG4gIGNvbnN0IHNjRyA9ICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpXG4gIGNvbnN0IGJnID0gKCgyNTUgLSBkZykgKiAoKG1HICsgMSArIChtRyA+PiA4KSkgPj4gOCkgKyBkZyAqICgyNTUgLSAoKHNjRyArIDEgKyAoc2NHID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZGcpICogKChtRyArIDEgKyAobUcgPj4gOCkpID4+IDgpICsgZGcgKiAoMjU1IC0gKChzY0cgKyAxICsgKHNjRyA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1CID0gKHNiICogZGIpXG4gIGNvbnN0IHNjQiA9ICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpXG4gIGNvbnN0IGJiID0gKCgyNTUgLSBkYikgKiAoKG1CICsgMSArIChtQiA+PiA4KSkgPj4gOCkgKyBkYiAqICgyNTUgLSAoKHNjQiArIDEgKyAoc2NCID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZGIpICogKChtQiArIDEgKyAobUIgPj4gOCkpID4+IDgpICsgZGIgKiAoMjU1IC0gKChzY0IgKyAxICsgKHNjQiA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBJZiBzcmMgPCAxMjggKDUwJSBncmF5KSwgTXVsdGlwbHk7IG90aGVyd2lzZSwgU2NyZWVuICovXG5leHBvcnQgY29uc3QgaGFyZExpZ2h0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoMiAqIHNyICogZHIgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpIC8gMjU1KSB8IDApXG4gIGNvbnN0IGJnID0gc2cgPCAxMjggPyAoMiAqIHNnICogZGcgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpIC8gMjU1KSB8IDApXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoMiAqIHNiICogZGIgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpIC8gMjU1KSB8IDApXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKipcbiAqIElmIHNyYyA8IDEyODogQnVybihkc3QsIDIgKiBzcmMpXG4gKiBJZiBzcmMgPj0gMTI4OiBEb2RnZShkc3QsIDIgKiAoc3JjIC0gMTI4KSlcbiAqL1xuZXhwb3J0IGNvbnN0IHZpdmlkTGlnaHRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/IChzciA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAoMjU1IC0gKCgoMjU1IC0gZHIpICogMjU1IC8gKDIgKiBzcikpIHwgMCkpKSkgOiAoc3IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkciAqIDI1NSAvICgyICogKDI1NSAtIHNyKSkpIHwgMCkpKVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsICgyNTUgLSAoKCgyNTUgLSBkZykgKiAyNTUgLyAoMiAqIHNnKSkgfCAwKSkpKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnICogMjU1IC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgKDI1NSAtICgoKDI1NSAtIGRiKSAqIDI1NSAvICgyICogc2IpKSB8IDApKSkpIDogKHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGIgKiAyNTUgLyAoMiAqICgyNTUgLSBzYikpKSB8IDApKSlcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBkc3QgKyAyICogc3JjIC0gMjU1IChDbGFtcGVkIHRvIDAtMjU1KSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckxpZ2h0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyVSA9IGRyICsgMiAqIHNyIC0gMjU1XG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclUgPiAyNTUgPyAyNTUgOiBiclVcbiAgY29uc3QgYmdVID0gZGcgKyAyICogc2cgLSAyNTVcbiAgY29uc3QgYmcgPSBiZ1UgPCAwID8gMCA6IGJnVSA+IDI1NSA/IDI1NSA6IGJnVVxuICBjb25zdCBiYlUgPSBkYiArIDIgKiBzYiAtIDI1NVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVID4gMjU1ID8gMjU1IDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3JjIDwgMTI4ID8gbWluKGRzdCwgMiAqIHNyYykgOiBtYXgoZHN0LCAyICogKHNyYyAtIDEyOCkpICovXG5leHBvcnQgY29uc3QgcGluTGlnaHRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGXG4gIGNvbnN0IHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGXG4gIGNvbnN0IHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoZHIgPCAoc3IgPDwgMSkgPyBkciA6IChzciA8PCAxKSkgOiAoZHIgPiAoKHNyIC0gMTI4KSA8PCAxKSA/IGRyIDogKChzciAtIDEyOCkgPDwgMSkpXG4gIGNvbnN0IGJnID0gc2cgPCAxMjggPyAoZGcgPCAoc2cgPDwgMSkgPyBkZyA6IChzZyA8PCAxKSkgOiAoZGcgPiAoKHNnIC0gMTI4KSA8PCAxKSA/IGRnIDogKChzZyAtIDEyOCkgPDwgMSkpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoZGIgPCAoc2IgPDwgMSkgPyBkYiA6IChzYiA8PCAxKSkgOiAoZGIgPiAoKHNiIC0gMTI4KSA8PCAxKSA/IGRiIDogKChzYiAtIDEyOCkgPDwgMSkpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIChWaXZpZCBMaWdodCBsb2dpYyBmb3JjZWQgdG8gMCBvciAyNTUpICovXG5leHBvcnQgY29uc3QgaGFyZE1peFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IChzciA8IDEyOCA/IChzciA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAoMjU1IC0gKCgoMjU1IC0gZHIpICogMjU1IC8gKDIgKiBzcikpIHwgMCkpKSkgOiAoc3IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkciAqIDI1NSAvICgyICogKDI1NSAtIHNyKSkpIHwgMCkpKSkgPCAxMjggPyAwIDogMjU1XG4gIGNvbnN0IGJnID0gKHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsICgyNTUgLSAoKCgyNTUgLSBkZykgKiAyNTUgLyAoMiAqIHNnKSkgfCAwKSkpKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnICogMjU1IC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpKSA8IDEyOCA/IDAgOiAyNTVcbiAgY29uc3QgYmIgPSAoc2IgPCAxMjggPyAoc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgKDI1NSAtICgoKDI1NSAtIGRiKSAqIDI1NSAvICgyICogc2IpKSB8IDApKSkpIDogKHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGIgKiAyNTUgLyAoMiAqICgyNTUgLSBzYikpKSB8IDApKSkpIDwgMTI4ID8gMCA6IDI1NVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIE1hdGguYWJzKHNyYyAtIGRzdCkgKi9cbmV4cG9ydCBjb25zdCBkaWZmZXJlbmNlUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBkciA+IHNyID8gZHIgLSBzciA6IHNyIC0gZHJcbiAgY29uc3QgYmcgPSBkZyA+IHNnID8gZGcgLSBzZyA6IHNnIC0gZGdcbiAgY29uc3QgYmIgPSBkYiA+IHNiID8gZGIgLSBzYiA6IHNiIC0gZGJcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgc3JjIC0gKChkc3QgKiBzcmMpID4+IDcpICovXG5leHBvcnQgY29uc3QgZXhjbHVzaW9uUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkZcbiAgY29uc3QgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkZcbiAgY29uc3QgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRlxuICBjb25zdCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRlxuICBjb25zdCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCByMiA9IGRyICogc3JcbiAgY29uc3QgYnIgPSBkciArIHNyIC0gKCgocjIgKyByMikgKyAxICsgKChyMiArIHIyKSA+PiA4KSkgPj4gOClcblxuICBjb25zdCBnMiA9IGRnICogc2dcbiAgY29uc3QgYmcgPSBkZyArIHNnIC0gKCgoZzIgKyBnMikgKyAxICsgKChnMiArIGcyKSA+PiA4KSkgPj4gOClcblxuICBjb25zdCBiMiA9IGRiICogc2JcbiAgY29uc3QgYmIgPSBkYiArIHNiIC0gKCgoYjIgKyBiMikgKyAxICsgKChiMiArIGIyKSA+PiA4KSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoMCwgZHN0IC0gc3JjKSAqL1xuZXhwb3J0IGNvbnN0IHN1YnRyYWN0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyVSA9IGRyIC0gc3JcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZ1UgPSBkZyAtIHNnXG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1VcbiAgY29uc3QgYmJVID0gZGIgLSBzYlxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvIHNyKSAqL1xuZXhwb3J0IGNvbnN0IGRpdmlkZVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IHNyID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRyICogMjU1IC8gc3IpIHwgMCkpXG4gIGNvbnN0IGJnID0gc2cgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGcgKiAyNTUgLyBzZykgfCAwKSlcbiAgY29uc3QgYmIgPSBzYiA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiAqIDI1NSAvIHNiKSB8IDApKVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IEJBU0VfUEVSRkVDVF9CTEVORF9NT0RFX0ZVTkNUSU9OUzogUmVjb3JkPG51bWJlciwgQmxlbmRDb2xvcjMyPiA9IHtcbiAgW0Jhc2VCbGVuZE1vZGUub3ZlcndyaXRlXTogb3ZlcndyaXRlUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlT3Zlcl06IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZW5dOiBkYXJrZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5tdWx0aXBseV06IG11bHRpcGx5UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JCdXJuXTogY29sb3JCdXJuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyQnVybl06IGxpbmVhckJ1cm5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZXJDb2xvcl06IGRhcmtlclBlcmZlY3QsXG5cbiAgW0Jhc2VCbGVuZE1vZGUubGlnaHRlbl06IGxpZ2h0ZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5zY3JlZW5dOiBzY3JlZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5jb2xvckRvZGdlXTogY29sb3JEb2RnZVBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpbmVhckRvZGdlXTogbGluZWFyRG9kZ2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5saWdodGVyQ29sb3JdOiBsaWdodGVyUGVyZmVjdCxcblxuICBbQmFzZUJsZW5kTW9kZS5vdmVybGF5XTogb3ZlcmxheVBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvZnRMaWdodF06IHNvZnRMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRMaWdodF06IGhhcmRMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnZpdmlkTGlnaHRdOiB2aXZpZExpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyTGlnaHRdOiBsaW5lYXJMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnBpbkxpZ2h0XTogcGluTGlnaHRQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5oYXJkTWl4XTogaGFyZE1peFBlcmZlY3QsXG5cbiAgW0Jhc2VCbGVuZE1vZGUuZGlmZmVyZW5jZV06IGRpZmZlcmVuY2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5leGNsdXNpb25dOiBleGNsdXNpb25QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5zdWJ0cmFjdF06IHN1YnRyYWN0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGl2aWRlXTogZGl2aWRlUGVyZmVjdCxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQZXJmZWN0QmxlbmRNb2RlUmVnaXN0cnkobmFtZSA9ICdwZXJmZWN0Jykge1xuICByZXR1cm4gbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5KEJhc2VCbGVuZE1vZGUsIEJBU0VfUEVSRkVDVF9CTEVORF9NT0RFX0ZVTkNUSU9OUywgbmFtZSlcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { BaseBlendMode } from './blend-modes';\nexport function toBlendModeIndexAndName(input: string | number) {\n if (typeof input === 'number') {\n const name = getKeyByValue(BaseBlendMode, input);\n if (name === undefined) throw new Error(`Invalid index: ${input}`);\n return {\n blendIndex: input,\n blendName: name\n };\n }\n const trimmed = input.trim();\n const num = Number(trimmed);\n const isNumeric = trimmed !== '' && !Number.isNaN(num);\n if (isNumeric && Number.isInteger(num)) {\n console.log({\n trimmed,\n num,\n isNumeric,\n isInt: Number.isInteger(num)\n });\n const name = getKeyByValue(BaseBlendMode, num);\n console.log({\n name\n });\n if (name === undefined) throw new Error(`Invalid index: ${num}`);\n return {\n blendIndex: num,\n blendName: name\n };\n }\n if (trimmed in BaseBlendMode) {\n return {\n blendIndex: BaseBlendMode[trimmed as keyof typeof BaseBlendMode],\n blendName: trimmed as keyof typeof BaseBlendMode\n };\n }\n throw new Error(`Invalid blend mode: ${JSON.stringify(input)}`);\n}\nconst getKeyByValue = (obj: any, value: any) => {\n for (const key in obj) {\n if (obj[key] === value) return key;\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUJsZW5kTW9kZSB9IGZyb20gJy4vYmxlbmQtbW9kZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0b0JsZW5kTW9kZUluZGV4QW5kTmFtZShpbnB1dDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgbmFtZSA9IGdldEtleUJ5VmFsdWUoQmFzZUJsZW5kTW9kZSwgaW5wdXQpXG4gICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGV4OiAke2lucHV0fWApXG4gICAgcmV0dXJuIHsgYmxlbmRJbmRleDogaW5wdXQsIGJsZW5kTmFtZTogbmFtZSB9XG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gaW5wdXQudHJpbSgpXG4gIGNvbnN0IG51bSA9IE51bWJlcih0cmltbWVkKVxuICBjb25zdCBpc051bWVyaWMgPSB0cmltbWVkICE9PSAnJyAmJiAhTnVtYmVyLmlzTmFOKG51bSlcblxuICBpZiAoaXNOdW1lcmljICYmIE51bWJlci5pc0ludGVnZXIobnVtKSkge1xuICAgIGNvbnNvbGUubG9nKHtcbiAgICAgIHRyaW1tZWQsXG4gICAgICBudW0sXG4gICAgICBpc051bWVyaWMsXG4gICAgICBpc0ludDogTnVtYmVyLmlzSW50ZWdlcihudW0pLFxuICAgIH0pXG4gICAgY29uc3QgbmFtZSA9IGdldEtleUJ5VmFsdWUoQmFzZUJsZW5kTW9kZSwgbnVtKVxuICAgIGNvbnNvbGUubG9nKHtuYW1lfSlcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kZXg6ICR7bnVtfWApXG4gICAgcmV0dXJuIHsgYmxlbmRJbmRleDogbnVtLCBibGVuZE5hbWU6IG5hbWUgfVxuICB9XG5cbiAgaWYgKHRyaW1tZWQgaW4gQmFzZUJsZW5kTW9kZSkge1xuICAgIHJldHVybiB7XG4gICAgICBibGVuZEluZGV4OiBCYXNlQmxlbmRNb2RlW3RyaW1tZWQgYXMga2V5b2YgdHlwZW9mIEJhc2VCbGVuZE1vZGVdLFxuICAgICAgYmxlbmROYW1lOiB0cmltbWVkIGFzIGtleW9mIHR5cGVvZiBCYXNlQmxlbmRNb2RlLFxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBibGVuZCBtb2RlOiAke0pTT04uc3RyaW5naWZ5KGlucHV0KX1gKVxufVxuXG5jb25zdCBnZXRLZXlCeVZhbHVlID0gKG9iajogYW55LCB2YWx1ZTogYW55KSA9PiB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmpba2V5XSA9PT0gdmFsdWUpIHJldHVybiBrZXlcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export const OFFSCREEN_CANVAS_CTX_FAILED = 'Failed to create OffscreenCanvas context';\nexport const CANVAS_CTX_FAILED = 'Failed to create Canvas context';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IE9GRlNDUkVFTl9DQU5WQVNfQ1RYX0ZBSUxFRCA9ICdGYWlsZWQgdG8gY3JlYXRlIE9mZnNjcmVlbkNhbnZhcyBjb250ZXh0J1xuZXhwb3J0IGNvbnN0IENBTlZBU19DVFhfRkFJTEVEID0gJ0ZhaWxlZCB0byBjcmVhdGUgQ2FudmFzIGNvbnRleHQnXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { CANVAS_CTX_FAILED } from './_constants';\nexport type PixelCanvas = {\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D;\n readonly resize: (w: number, h: number) => void;\n};\n\n/**\n * Ensures the canvas ctx is always set to imageSmoothingEnabled = false.\n * Intended for canvas elements that are already part of the DOM.\n * @see makeReusableCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makePixelCanvas(canvas: HTMLCanvasElement): PixelCanvas {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\n return {\n canvas,\n ctx,\n resize(w: number, h: number) {\n canvas.width = w;\n canvas.height = h;\n ctx.imageSmoothingEnabled = false;\n }\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuL19jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIFBpeGVsQ2FudmFzID0ge1xuICByZWFkb25seSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICByZWFkb25seSBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgcmVhZG9ubHkgcmVzaXplOiAodzogbnVtYmVyLCBoOiBudW1iZXIpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBjYW52YXMgY3R4IGlzIGFsd2F5cyBzZXQgdG8gaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2UuXG4gKiBJbnRlbmRlZCBmb3IgY2FudmFzIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgcGFydCBvZiB0aGUgRE9NLlxuICogQHNlZSBtYWtlUmV1c2FibGVDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQaXhlbENhbnZhcyhcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbik6IFBpeGVsQ2FudmFzIHtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRClcbiAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBjYW52YXMsXG4gICAgY3R4LFxuICAgIHJlc2l6ZSh3OiBudW1iZXIsIGg6IG51bWJlcikge1xuICAgICAgY2FudmFzLndpZHRoID0gd1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhcbiAgICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZVxuICAgIH0sXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { CANVAS_CTX_FAILED } from './_constants';\nexport type ReusableCanvas = {\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D;\n};\n\n/**\n * Creates a reusable canvas and context that are not part of the DOM.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makeReusableCanvas() {\n let canvas: HTMLCanvasElement | null = null;\n let ctx: CanvasRenderingContext2D | null = null;\n function get(width: number, height: number): ReusableCanvas {\n if (canvas === null) {\n canvas = document.createElement('canvas')!;\n ctx = canvas.getContext('2d')!;\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n }\n\n // Resize if needed (resizing auto-clears)\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n ctx!.imageSmoothingEnabled = false;\n } else {\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height);\n }\n return {\n canvas,\n ctx: ctx!\n };\n }\n get.reset = () => {\n canvas = null;\n ctx = null;\n };\n return get;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuL19jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIFJldXNhYmxlQ2FudmFzID0ge1xuICByZWFkb25seSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50XG4gIHJlYWRvbmx5IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJldXNhYmxlIGNhbnZhcyBhbmQgY29udGV4dCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgRE9NLlxuICogRW5zdXJlcyBpdCBpcyBhbHdheXMgc2V0IHRvIGBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlYFxuICogQHNlZSBtYWtlUGl4ZWxDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXVzYWJsZUNhbnZhcygpIHtcbiAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gbnVsbFxuICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbFxuXG4gIGZ1bmN0aW9uIGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFJldXNhYmxlQ2FudmFzIHtcbiAgICBpZiAoY2FudmFzID09PSBudWxsKSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSFcbiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIVxuICAgICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRClcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgaWYgbmVlZGVkIChyZXNpemluZyBhdXRvLWNsZWFycylcbiAgICBpZiAoY2FudmFzLndpZHRoICE9PSB3aWR0aCB8fCBjYW52YXMuaGVpZ2h0ICE9PSBoZWlnaHQpIHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgICBjdHghLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhbWUgc2l6ZSDihpIgbWFudWFsbHkgY2xlYXJcbiAgICAgIGN0eCEuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2FudmFzLCBjdHg6IGN0eCEgfVxuICB9XG5cbiAgZ2V0LnJlc2V0ID0gKCkgPT4ge1xuICAgIGNhbnZhcyA9IG51bGxcbiAgICBjdHggPSBudWxsXG4gIH1cblxuICByZXR1cm4gZ2V0XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Decodes a {@link Blob} (typically PNG) back into an {@link ImageData} object.\n *\n * This function uses hardware-accelerated decoding via {@link createImageBitmap}\n * and processes the data using an {@link OffscreenCanvas} to ensure\n * compatibility with Web Workers.\n *\n * @param blob - The binary image data to decode.\n *\n * @returns A promise resolving to the decoded {@link ImageData}.\n *\n * @throws {Error}\n * Thrown if the blob is corrupted or the browser cannot decode the format.\n *\n * @example\n * ```typescript\n * const blob = await getBlobFromStorage();\n *\n * const imageData = await pngBlobToImageData(blob);\n * ```\n */\nexport async function imgBlobToImageData(blob: Blob): Promise<ImageData> {\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(blob);\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to get 2D context');\n }\n ctx.drawImage(bitmap, 0, 0);\n return ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n } finally {\n bitmap?.close();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWNvZGVzIGEge0BsaW5rIEJsb2J9ICh0eXBpY2FsbHkgUE5HKSBiYWNrIGludG8gYW4ge0BsaW5rIEltYWdlRGF0YX0gb2JqZWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBoYXJkd2FyZS1hY2NlbGVyYXRlZCBkZWNvZGluZyB2aWEge0BsaW5rIGNyZWF0ZUltYWdlQml0bWFwfVxuICogYW5kIHByb2Nlc3NlcyB0aGUgZGF0YSB1c2luZyBhbiB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfSB0byBlbnN1cmVcbiAqIGNvbXBhdGliaWxpdHkgd2l0aCBXZWIgV29ya2Vycy5cbiAqXG4gKiBAcGFyYW0gYmxvYiAtIFRoZSBiaW5hcnkgaW1hZ2UgZGF0YSB0byBkZWNvZGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVjb2RlZCB7QGxpbmsgSW1hZ2VEYXRhfS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqIFRocm93biBpZiB0aGUgYmxvYiBpcyBjb3JydXB0ZWQgb3IgdGhlIGJyb3dzZXIgY2Fubm90IGRlY29kZSB0aGUgZm9ybWF0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBibG9iID0gYXdhaXQgZ2V0QmxvYkZyb21TdG9yYWdlKCk7XG4gKlxuICogY29uc3QgaW1hZ2VEYXRhID0gYXdhaXQgcG5nQmxvYlRvSW1hZ2VEYXRhKGJsb2IpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbWdCbG9iVG9JbWFnZURhdGEoXG4gIGJsb2I6IEJsb2IsXG4pOiBQcm9taXNlPEltYWdlRGF0YT4ge1xuICBsZXQgYml0bWFwOiBJbWFnZUJpdG1hcCB8IG51bGwgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICBiaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChibG9iKVxuXG4gICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhcbiAgICAgIGJpdG1hcC53aWR0aCxcbiAgICAgIGJpdG1hcC5oZWlnaHQsXG4gICAgKVxuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcblxuICAgIGlmICghY3R4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgMkQgY29udGV4dCcpXG4gICAgfVxuXG4gICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApXG5cbiAgICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgYml0bWFwLndpZHRoLFxuICAgICAgYml0bWFwLmhlaWdodCxcbiAgICApXG4gIH0gZmluYWxseSB7XG4gICAgYml0bWFwPy5jbG9zZSgpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { imgBlobToImageData } from '../ImageData/imgBlobToImageData';\n\n/**\n * Extracts {@link ImageData} from a clipboard event if an image is present.\n *\n * This function iterates through the {@link DataTransferItemList} to find\n * the first item with an image MIME type and decodes it.\n *\n * @param clipboardEvent - The event object from a `paste` listener.\n *\n * @returns A promise resolving to {@link ImageData}, or `null` if no\n * image was found in the clipboard.\n *\n * @example\n * ```typescript\n * window.addEventListener('paste', async (event) => {\n * const data = await getImageDataFromClipboard(event)\n * if (data) {\n * console.log('Pasted image dimensions:', data.width, data.height)\n * }\n * });\n * ```\n */\nexport async function getImageDataFromClipboard(clipboardEvent: ClipboardEvent) {\n const items = clipboardEvent?.clipboardData?.items;\n if (!items?.length) return null;\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith('image/')) {\n const blob = item.getAsFile();\n if (!blob) {\n continue;\n }\n return imgBlobToImageData(blob);\n }\n }\n return null;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW1nQmxvYlRvSW1hZ2VEYXRhIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltZ0Jsb2JUb0ltYWdlRGF0YSdcblxuLyoqXG4gKiBFeHRyYWN0cyB7QGxpbmsgSW1hZ2VEYXRhfSBmcm9tIGEgY2xpcGJvYXJkIGV2ZW50IGlmIGFuIGltYWdlIGlzIHByZXNlbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyB0aHJvdWdoIHRoZSB7QGxpbmsgRGF0YVRyYW5zZmVySXRlbUxpc3R9IHRvIGZpbmRcbiAqIHRoZSBmaXJzdCBpdGVtIHdpdGggYW4gaW1hZ2UgTUlNRSB0eXBlIGFuZCBkZWNvZGVzIGl0LlxuICpcbiAqIEBwYXJhbSBjbGlwYm9hcmRFdmVudCAtIFRoZSBldmVudCBvYmplY3QgZnJvbSBhIGBwYXN0ZWAgbGlzdGVuZXIuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byB7QGxpbmsgSW1hZ2VEYXRhfSwgb3IgYG51bGxgIGlmIG5vXG4gKiBpbWFnZSB3YXMgZm91bmQgaW4gdGhlIGNsaXBib2FyZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRJbWFnZURhdGFGcm9tQ2xpcGJvYXJkKGV2ZW50KVxuICogICBpZiAoZGF0YSkge1xuICogICAgIGNvbnNvbGUubG9nKCdQYXN0ZWQgaW1hZ2UgZGltZW5zaW9uczonLCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodClcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEltYWdlRGF0YUZyb21DbGlwYm9hcmQoY2xpcGJvYXJkRXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG4gIGNvbnN0IGl0ZW1zID0gY2xpcGJvYXJkRXZlbnQ/LmNsaXBib2FyZERhdGE/Lml0ZW1zXG4gIGlmICghaXRlbXM/Lmxlbmd0aCkgcmV0dXJuIG51bGxcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldXG5cbiAgICBpZiAoaXRlbS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XG4gICAgICBjb25zdCBibG9iID0gaXRlbS5nZXRBc0ZpbGUoKVxuXG4gICAgICBpZiAoIWJsb2IpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGltZ0Jsb2JUb0ltYWdlRGF0YShibG9iKVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Converts an {@link ImageData} object into a {@link Blob} in PNG format.\n *\n * This operation is asynchronous and uses {@link OffscreenCanvas}\n * to perform the encoding, making it suitable for usage in both the main\n * thread and Web Workers.\n *\n * @param imageData - The pixel data to be encoded.\n *\n * @returns A promise that resolves to a {@link Blob} with the MIME type `image/png`.\n *\n * @throws {Error}\n * Thrown if the {@link OffscreenCanvas} context cannot be initialized or the blob\n * encoding fails.\n *\n * @example\n * ```typescript\n * const blob = await imageDataToImgBlob(imageData);\n * const url = URL.createObjectURL(blob);\n * ```\n */\nexport async function imageDataToImgBlob(imageData: ImageData): Promise<Blob> {\n const canvas = new OffscreenCanvas(imageData.width, imageData.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('could not create 2d context');\n ctx.putImageData(imageData, 0, 0);\n return canvas!.convertToBlob({\n type: 'image/png'\n });\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb252ZXJ0cyBhbiB7QGxpbmsgSW1hZ2VEYXRhfSBvYmplY3QgaW50byBhIHtAbGluayBCbG9ifSBpbiBQTkcgZm9ybWF0LlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGlzIGFzeW5jaHJvbm91cyBhbmQgdXNlcyB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfVxuICogdG8gcGVyZm9ybSB0aGUgZW5jb2RpbmcsIG1ha2luZyBpdCBzdWl0YWJsZSBmb3IgdXNhZ2UgaW4gYm90aCB0aGUgbWFpblxuICogdGhyZWFkIGFuZCBXZWIgV29ya2Vycy5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIHBpeGVsIGRhdGEgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBCbG9ifSB3aXRoIHRoZSBNSU1FIHR5cGUgYGltYWdlL3BuZ2AuXG4gKlxuICogQHRocm93cyB7RXJyb3J9XG4gKiBUaHJvd24gaWYgdGhlIHtAbGluayBPZmZzY3JlZW5DYW52YXN9IGNvbnRleHQgY2Fubm90IGJlIGluaXRpYWxpemVkIG9yIHRoZSBibG9iXG4gKiBlbmNvZGluZyBmYWlscy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYmxvYiA9IGF3YWl0IGltYWdlRGF0YVRvSW1nQmxvYihpbWFnZURhdGEpO1xuICogY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1hZ2VEYXRhVG9JbWdCbG9iKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogUHJvbWlzZTxCbG9iPiB7XG4gIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEuaGVpZ2h0KVxuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICBpZiAoIWN0eCkgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgY3JlYXRlIDJkIGNvbnRleHQnKVxuXG4gIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKVxuICByZXR1cm4gY2FudmFzIS5jb252ZXJ0VG9CbG9iKHtcbiAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcbiAgfSlcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Writes a {@link Blob} image to the system clipboard.\n *\n * @param blob - The image {@link Blob} (typically `image/png`) to copy.\n * @returns A promise that resolves when the clipboard has been updated.\n */\nexport async function writeImgBlobToClipboard(blob: Blob): Promise<void> {\n const item = new ClipboardItem({\n 'image/png': blob\n });\n await navigator.clipboard.write([item]);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXcml0ZXMgYSB7QGxpbmsgQmxvYn0gaW1hZ2UgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQuXG4gKlxuICogQHBhcmFtIGJsb2IgLSBUaGUgaW1hZ2Uge0BsaW5rIEJsb2J9ICh0eXBpY2FsbHkgYGltYWdlL3BuZ2ApIHRvIGNvcHkuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGlwYm9hcmQgaGFzIGJlZW4gdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1nQmxvYlRvQ2xpcGJvYXJkKGJsb2I6IEJsb2IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbSA9IG5ldyBDbGlwYm9hcmRJdGVtKHtcbiAgICAnaW1hZ2UvcG5nJzogYmxvYixcbiAgfSlcblxuICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlKFtpdGVtXSlcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { imageDataToImgBlob } from '../ImageData/imageDataToImgBlob';\nimport { writeImgBlobToClipboard } from './writeImgBlobToClipboard';\n\n/**\n * Converts {@link ImageData} to a PNG {@link Blob} and writes it to the system clipboard.\n * This is a high-level utility that combines {@link imageDataToImgBlob} and\n * {@link writeImgBlobToClipboard}.\n * @param imageData - The image data to copy to the clipboard.\n * @returns A promise that resolves when the image has been successfully copied.\n * @throws {Error}\n * If the conversion to blob fails or clipboard permissions are denied.\n *\n * @example\n * ```typescript\n * const canvas = document.querySelector('canvas')\n * const ctx = canvas.getContext('2d')\n * const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n * await writeImageDataToClipboard(imageData)\n * ```\n */\nexport async function writeImageDataToClipboard(imageData: ImageData): Promise<void> {\n const blob = await imageDataToImgBlob(imageData);\n return writeImgBlobToClipboard(blob);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW1hZ2VEYXRhVG9JbWdCbG9iIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvSW1nQmxvYidcbmltcG9ydCB7IHdyaXRlSW1nQmxvYlRvQ2xpcGJvYXJkIH0gZnJvbSAnLi93cml0ZUltZ0Jsb2JUb0NsaXBib2FyZCdcblxuLyoqXG4gKiBDb252ZXJ0cyB7QGxpbmsgSW1hZ2VEYXRhfSB0byBhIFBORyB7QGxpbmsgQmxvYn0gYW5kIHdyaXRlcyBpdCB0byB0aGUgc3lzdGVtIGNsaXBib2FyZC5cbiAqIFRoaXMgaXMgYSBoaWdoLWxldmVsIHV0aWxpdHkgdGhhdCBjb21iaW5lcyB7QGxpbmsgaW1hZ2VEYXRhVG9JbWdCbG9ifSBhbmRcbiAqIHtAbGluayB3cml0ZUltZ0Jsb2JUb0NsaXBib2FyZH0uXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIGltYWdlIGRhdGEgdG8gY29weSB0byB0aGUgY2xpcGJvYXJkLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaW1hZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvcGllZC5cbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogSWYgdGhlIGNvbnZlcnNpb24gdG8gYmxvYiBmYWlscyBvciBjbGlwYm9hcmQgcGVybWlzc2lvbnMgYXJlIGRlbmllZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignY2FudmFzJylcbiAqIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gKiBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodClcbiAqIGF3YWl0IHdyaXRlSW1hZ2VEYXRhVG9DbGlwYm9hcmQoaW1hZ2VEYXRhKVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YVRvQ2xpcGJvYXJkKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJsb2IgPSBhd2FpdCBpbWFnZURhdGFUb0ltZ0Jsb2IoaW1hZ2VEYXRhKVxuXG4gIHJldHVybiB3cml0ZUltZ0Jsb2JUb0NsaXBib2FyZChibG9iKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export interface HistoryAction {\n undo: () => void;\n redo: () => void;\n dispose?: () => void;\n}\nexport class HistoryManager {\n public undoStack: HistoryAction[];\n public redoStack: HistoryAction[];\n public listeners: Set<() => void>;\n constructor(public maxSteps = 50) {\n this.undoStack = [];\n this.redoStack = [];\n this.listeners = new Set();\n }\n get canUndo() {\n return this.undoStack.length > 0;\n }\n get canRedo() {\n return this.redoStack.length > 0;\n }\n subscribe(fn: () => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n notify() {\n this.listeners.forEach(fn => fn());\n }\n commit(action: HistoryAction) {\n this.undoStack.push(action);\n this.clearRedoStack();\n if (this.undoStack.length > this.maxSteps) {\n this.undoStack.shift()?.dispose?.();\n }\n this.notify();\n }\n undo() {\n let action = this.undoStack.pop();\n if (!action) return;\n this.redoStack.push(action);\n action.undo();\n this.notify();\n }\n redo() {\n let action = this.redoStack.pop();\n if (!action) return;\n this.undoStack.push(action);\n action.redo();\n this.notify();\n }\n clearRedoStack() {\n let length = this.redoStack.length;\n for (let i = 0; i < length; i++) {\n let action = this.redoStack[i];\n if (action) {\n action.dispose?.();\n }\n }\n this.redoStack.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5QWN0aW9uIHtcbiAgdW5kbzogKCkgPT4gdm9pZFxuICByZWRvOiAoKSA9PiB2b2lkXG4gIGRpc3Bvc2U/OiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBIaXN0b3J5TWFuYWdlciB7XG4gIHB1YmxpYyB1bmRvU3RhY2s6IEhpc3RvcnlBY3Rpb25bXVxuICBwdWJsaWMgcmVkb1N0YWNrOiBIaXN0b3J5QWN0aW9uW11cbiAgcHVibGljIGxpc3RlbmVyczogU2V0PCgpID0+IHZvaWQ+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1heFN0ZXBzID0gNTAsXG4gICkge1xuICAgIHRoaXMudW5kb1N0YWNrID0gW11cbiAgICB0aGlzLnJlZG9TdGFjayA9IFtdXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgU2V0KClcbiAgfVxuXG4gIGdldCBjYW5VbmRvKCkge1xuICAgIHJldHVybiB0aGlzLnVuZG9TdGFjay5sZW5ndGggPiAwXG4gIH1cblxuICBnZXQgY2FuUmVkbygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMFxuICB9XG5cbiAgc3Vic2NyaWJlKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuYWRkKGZuKVxuICAgIHJldHVybiAoKSA9PiB0aGlzLmxpc3RlbmVycy5kZWxldGUoZm4pXG4gIH1cblxuICBub3RpZnkoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpXG4gIH1cblxuICBjb21taXQoYWN0aW9uOiBIaXN0b3J5QWN0aW9uKSB7XG4gICAgdGhpcy51bmRvU3RhY2sucHVzaChhY3Rpb24pXG4gICAgdGhpcy5jbGVhclJlZG9TdGFjaygpXG5cbiAgICBpZiAodGhpcy51bmRvU3RhY2subGVuZ3RoID4gdGhpcy5tYXhTdGVwcykge1xuICAgICAgdGhpcy51bmRvU3RhY2suc2hpZnQoKT8uZGlzcG9zZT8uKClcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeSgpXG4gIH1cblxuICB1bmRvKCkge1xuICAgIGxldCBhY3Rpb24gPSB0aGlzLnVuZG9TdGFjay5wb3AoKVxuXG4gICAgaWYgKCFhY3Rpb24pIHJldHVyblxuXG4gICAgdGhpcy5yZWRvU3RhY2sucHVzaChhY3Rpb24pXG4gICAgYWN0aW9uLnVuZG8oKVxuXG4gICAgdGhpcy5ub3RpZnkoKVxuICB9XG5cbiAgcmVkbygpIHtcbiAgICBsZXQgYWN0aW9uID0gdGhpcy5yZWRvU3RhY2sucG9wKClcblxuICAgIGlmICghYWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMudW5kb1N0YWNrLnB1c2goYWN0aW9uKVxuICAgIGFjdGlvbi5yZWRvKClcblxuICAgIHRoaXMubm90aWZ5KClcbiAgfVxuXG4gIGNsZWFyUmVkb1N0YWNrKCkge1xuICAgIGxldCBsZW5ndGggPSB0aGlzLnJlZG9TdGFjay5sZW5ndGhcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhY3Rpb24gPSB0aGlzLnJlZG9TdGFja1tpXVxuXG4gICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgIGFjdGlvbi5kaXNwb3NlPy4oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVkb1N0YWNrLmxlbmd0aCA9IDBcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type PixelPatchTiles = {\n beforeTiles: PixelTile[];\n afterTiles: PixelTile[];\n};\nexport class PixelTile {\n public data32: Uint32Array;\n constructor(public id: number, public tx: number, public ty: number, tileArea: number) {\n this.data32 = new Uint32Array(tileArea);\n }\n}\nexport function applyPatchTiles(target: IPixelData, tiles: PixelTile[], tileSize: number = 256) {\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n if (!tile) continue;\n const dst = target.data32;\n const src = tile.data32;\n const dstWidth = target.width;\n const dstHeight = target.height;\n const startX = tile.tx * tileSize;\n const startY = tile.ty * tileSize;\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX));\n if (copyWidth <= 0) return;\n for (let ly = 0; ly < tileSize; ly++) {\n const globalY = startY + ly;\n\n // Stop if we go below the image\n if (globalY >= dstHeight) break;\n const dstIndex = globalY * dstWidth + startX;\n const srcIndex = ly * tileSize;\n const rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n dst.set(rowData, dstIndex);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgdHlwZSBQaXhlbFBhdGNoVGlsZXMgPSB7XG4gIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXVxuICBhZnRlclRpbGVzOiBQaXhlbFRpbGVbXVxufVxuXG5leHBvcnQgY2xhc3MgUGl4ZWxUaWxlIHtcbiAgcHVibGljIGRhdGEzMjogVWludDMyQXJyYXlcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaWQ6IG51bWJlcixcbiAgICBwdWJsaWMgdHg6IG51bWJlcixcbiAgICBwdWJsaWMgdHk6IG51bWJlcixcbiAgICB0aWxlQXJlYTogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLmRhdGEzMiA9IG5ldyBVaW50MzJBcnJheSh0aWxlQXJlYSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXRjaFRpbGVzKHRhcmdldDogSVBpeGVsRGF0YSwgdGlsZXM6IFBpeGVsVGlsZVtdLCB0aWxlU2l6ZTogbnVtYmVyID0gMjU2KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aWxlID0gdGlsZXNbaV1cblxuICAgIGlmICghdGlsZSkgY29udGludWVcblxuICAgIGNvbnN0IGRzdCA9IHRhcmdldC5kYXRhMzJcbiAgICBjb25zdCBzcmMgPSB0aWxlLmRhdGEzMlxuICAgIGNvbnN0IGRzdFdpZHRoID0gdGFyZ2V0LndpZHRoXG4gICAgY29uc3QgZHN0SGVpZ2h0ID0gdGFyZ2V0LmhlaWdodFxuICAgIGNvbnN0IHN0YXJ0WCA9IHRpbGUudHggKiB0aWxlU2l6ZVxuICAgIGNvbnN0IHN0YXJ0WSA9IHRpbGUudHkgKiB0aWxlU2l6ZVxuXG4gICAgLy8gQ2FsY3VsYXRlIGNsYW1waW5nIHRvIHByZXZlbnQgd3JhcHBpbmcgYXJ0aWZhY3RzIG9uIGltYWdlIGVkZ2VzXG4gICAgY29uc3QgY29weVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGlsZVNpemUsIGRzdFdpZHRoIC0gc3RhcnRYKSlcblxuICAgIGlmIChjb3B5V2lkdGggPD0gMCkgcmV0dXJuXG5cbiAgICBmb3IgKGxldCBseSA9IDA7IGx5IDwgdGlsZVNpemU7IGx5KyspIHtcbiAgICAgIGNvbnN0IGdsb2JhbFkgPSBzdGFydFkgKyBseVxuXG4gICAgICAvLyBTdG9wIGlmIHdlIGdvIGJlbG93IHRoZSBpbWFnZVxuICAgICAgaWYgKGdsb2JhbFkgPj0gZHN0SGVpZ2h0KSBicmVha1xuXG4gICAgICBjb25zdCBkc3RJbmRleCA9IGdsb2JhbFkgKiBkc3RXaWR0aCArIHN0YXJ0WFxuICAgICAgY29uc3Qgc3JjSW5kZXggPSBseSAqIHRpbGVTaXplXG4gICAgICBjb25zdCByb3dEYXRhID0gc3JjLnN1YmFycmF5KHNyY0luZGV4LCBzcmNJbmRleCArIGNvcHlXaWR0aClcblxuICAgICAgZHN0LnNldChyb3dEYXRhLCBkc3RJbmRleClcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { PixelTile } from './PixelPatchTiles';\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[];\n public beforeTiles: PixelTile[];\n public pool: PixelTile[];\n constructor(public target: IPixelData, readonly config: PixelEngineConfig) {\n this.lookup = [];\n this.beforeTiles = [];\n this.pool = [];\n }\n getTile(id: number, tx: number, ty: number): PixelTile {\n let tile = this.pool.pop();\n if (tile) {\n tile.id = id;\n tile.tx = tx;\n tile.ty = ty;\n return tile;\n }\n return new PixelTile(id, tx, ty, this.config.tileArea);\n }\n recyclePatch(patch: PixelPatchTiles) {\n const before = patch.beforeTiles;\n for (let i = 0; i < before.length; i++) {\n let tile = before[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n const after = patch.afterTiles;\n for (let i = 0; i < after.length; i++) {\n let tile = after[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storeTileBeforeState(x: number, y: number): void {\n let target = this.target;\n let shift = this.config.tileShift;\n let columns = target.width + this.config.tileMask >> shift;\n let tx = x >> shift;\n let ty = y >> shift;\n let id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n\n /**\n *\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n * @param w pixel width\n * @param h pixel height\n */\n storeRegionBeforeState(x: number, y: number, w: number, h: number) {\n let target = this.target;\n let shift = this.config.tileShift;\n let columns = target.width + this.config.tileMask >> shift;\n let startX = x >> shift;\n let startY = y >> shift;\n let endX = x + w - 1 >> shift;\n let endY = y + h - 1 >> shift;\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n let id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n }\n }\n extractState(tile: PixelTile) {\n let target = this.target;\n let TILE_SIZE = this.config.tileSize;\n let dst = tile.data32;\n let src = target.data32;\n let startX = tile.tx * TILE_SIZE;\n let startY = tile.ty * TILE_SIZE;\n let targetWidth = target.width;\n let targetHeight = target.height;\n let copyWidth = Math.max(0, Math.min(TILE_SIZE, targetWidth - startX));\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly;\n let dstIndex = ly * TILE_SIZE;\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE);\n continue;\n }\n let srcIndex = globalY * targetWidth + startX;\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n dst.set(rowData, dstIndex);\n if (copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + copyWidth, dstIndex + TILE_SIZE);\n }\n }\n }\n extractAfterTiles(): PixelTile[] {\n let afterTiles: PixelTile[] = [];\n let length = this.beforeTiles.length;\n for (let i = 0; i < length; i++) {\n let beforeTile = this.beforeTiles[i];\n if (beforeTile) {\n let afterTile = this.getTile(beforeTile.id, beforeTile.tx, beforeTile.ty);\n this.extractState(afterTile);\n afterTiles.push(afterTile);\n }\n }\n return afterTiles;\n }\n reset() {\n this.lookup = [];\n this.beforeTiles = [];\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vUGl4ZWxFbmdpbmVDb25maWcnXG5pbXBvcnQgeyB0eXBlIFBpeGVsUGF0Y2hUaWxlcywgUGl4ZWxUaWxlIH0gZnJvbSAnLi9QaXhlbFBhdGNoVGlsZXMnXG5cbmV4cG9ydCBjbGFzcyBQaXhlbEFjY3VtdWxhdG9yIHtcbiAgcHVibGljIGxvb2t1cDogKFBpeGVsVGlsZSB8IHVuZGVmaW5lZClbXVxuICBwdWJsaWMgYmVmb3JlVGlsZXM6IFBpeGVsVGlsZVtdXG4gIHB1YmxpYyBwb29sOiBQaXhlbFRpbGVbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0YXJnZXQ6IElQaXhlbERhdGEsXG4gICAgcmVhZG9ubHkgY29uZmlnOiBQaXhlbEVuZ2luZUNvbmZpZyxcbiAgKSB7XG4gICAgdGhpcy5sb29rdXAgPSBbXVxuICAgIHRoaXMuYmVmb3JlVGlsZXMgPSBbXVxuICAgIHRoaXMucG9vbCA9IFtdXG4gIH1cblxuICBnZXRUaWxlKFxuICAgIGlkOiBudW1iZXIsXG4gICAgdHg6IG51bWJlcixcbiAgICB0eTogbnVtYmVyLFxuICApOiBQaXhlbFRpbGUge1xuICAgIGxldCB0aWxlID0gdGhpcy5wb29sLnBvcCgpXG5cbiAgICBpZiAodGlsZSkge1xuICAgICAgdGlsZS5pZCA9IGlkXG4gICAgICB0aWxlLnR4ID0gdHhcbiAgICAgIHRpbGUudHkgPSB0eVxuXG4gICAgICByZXR1cm4gdGlsZVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGl4ZWxUaWxlKFxuICAgICAgaWQsXG4gICAgICB0eCxcbiAgICAgIHR5LFxuICAgICAgdGhpcy5jb25maWcudGlsZUFyZWEsXG4gICAgKVxuICB9XG5cbiAgcmVjeWNsZVBhdGNoKHBhdGNoOiBQaXhlbFBhdGNoVGlsZXMpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBwYXRjaC5iZWZvcmVUaWxlc1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiZWZvcmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB0aWxlID0gYmVmb3JlW2ldXG5cbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWZ0ZXIgPSBwYXRjaC5hZnRlclRpbGVzXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFmdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdGlsZSA9IGFmdGVyW2ldXG5cbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB4IHBpeGVsIHggY29vcmRpbmF0ZVxuICAgKiBAcGFyYW0geSBwaXhlbCB5IGNvb3JkaW5hdGVcbiAgICovXG4gIHN0b3JlVGlsZUJlZm9yZVN0YXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0XG4gICAgbGV0IHNoaWZ0ID0gdGhpcy5jb25maWcudGlsZVNoaWZ0XG4gICAgbGV0IGNvbHVtbnMgPSAodGFyZ2V0LndpZHRoICsgdGhpcy5jb25maWcudGlsZU1hc2spID4+IHNoaWZ0XG4gICAgbGV0IHR4ID0geCA+PiBzaGlmdFxuICAgIGxldCB0eSA9IHkgPj4gc2hpZnRcbiAgICBsZXQgaWQgPSB0eSAqIGNvbHVtbnMgKyB0eFxuXG4gICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cblxuICAgIGlmICghdGlsZSkge1xuICAgICAgdGlsZSA9IHRoaXMuZ2V0VGlsZShcbiAgICAgICAgaWQsXG4gICAgICAgIHR4LFxuICAgICAgICB0eSxcbiAgICAgIClcblxuICAgICAgdGhpcy5leHRyYWN0U3RhdGUodGlsZSlcbiAgICAgIHRoaXMubG9va3VwW2lkXSA9IHRpbGVcbiAgICAgIHRoaXMuYmVmb3JlVGlsZXMucHVzaCh0aWxlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geCBwaXhlbCB4IGNvb3JkaW5hdGVcbiAgICogQHBhcmFtIHkgcGl4ZWwgeSBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB3IHBpeGVsIHdpZHRoXG4gICAqIEBwYXJhbSBoIHBpeGVsIGhlaWdodFxuICAgKi9cbiAgc3RvcmVSZWdpb25CZWZvcmVTdGF0ZShcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHc6IG51bWJlcixcbiAgICBoOiBudW1iZXIsXG4gICkge1xuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGxldCBzaGlmdCA9IHRoaXMuY29uZmlnLnRpbGVTaGlmdFxuICAgIGxldCBjb2x1bW5zID0gKHRhcmdldC53aWR0aCArIHRoaXMuY29uZmlnLnRpbGVNYXNrKSA+PiBzaGlmdFxuXG4gICAgbGV0IHN0YXJ0WCA9IHggPj4gc2hpZnRcbiAgICBsZXQgc3RhcnRZID0geSA+PiBzaGlmdFxuICAgIGxldCBlbmRYID0gKHggKyB3IC0gMSkgPj4gc2hpZnRcbiAgICBsZXQgZW5kWSA9ICh5ICsgaCAtIDEpID4+IHNoaWZ0XG5cbiAgICBmb3IgKGxldCB0eSA9IHN0YXJ0WTsgdHkgPD0gZW5kWTsgdHkrKykge1xuICAgICAgZm9yIChsZXQgdHggPSBzdGFydFg7IHR4IDw9IGVuZFg7IHR4KyspIHtcbiAgICAgICAgbGV0IGlkID0gdHkgKiBjb2x1bW5zICsgdHhcbiAgICAgICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICB0aWxlID0gdGhpcy5nZXRUaWxlKFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB0eCxcbiAgICAgICAgICAgIHR5LFxuICAgICAgICAgIClcblxuICAgICAgICAgIHRoaXMuZXh0cmFjdFN0YXRlKHRpbGUpXG4gICAgICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZVxuICAgICAgICAgIHRoaXMuYmVmb3JlVGlsZXMucHVzaCh0aWxlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXh0cmFjdFN0YXRlKHRpbGU6IFBpeGVsVGlsZSkge1xuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGxldCBUSUxFX1NJWkUgPSB0aGlzLmNvbmZpZy50aWxlU2l6ZVxuICAgIGxldCBkc3QgPSB0aWxlLmRhdGEzMlxuICAgIGxldCBzcmMgPSB0YXJnZXQuZGF0YTMyXG4gICAgbGV0IHN0YXJ0WCA9IHRpbGUudHggKiBUSUxFX1NJWkVcbiAgICBsZXQgc3RhcnRZID0gdGlsZS50eSAqIFRJTEVfU0laRVxuICAgIGxldCB0YXJnZXRXaWR0aCA9IHRhcmdldC53aWR0aFxuICAgIGxldCB0YXJnZXRIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0XG5cbiAgICBsZXQgY29weVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oVElMRV9TSVpFLCB0YXJnZXRXaWR0aCAtIHN0YXJ0WCkpXG5cbiAgICBmb3IgKGxldCBseSA9IDA7IGx5IDwgVElMRV9TSVpFOyBseSsrKSB7XG4gICAgICBsZXQgZ2xvYmFsWSA9IHN0YXJ0WSArIGx5XG4gICAgICBsZXQgZHN0SW5kZXggPSBseSAqIFRJTEVfU0laRVxuXG4gICAgICBpZiAoZ2xvYmFsWSA8IDAgfHwgZ2xvYmFsWSA+PSB0YXJnZXRIZWlnaHQgfHwgY29weVdpZHRoID09PSAwKSB7XG4gICAgICAgIGRzdC5maWxsKDAsIGRzdEluZGV4LCBkc3RJbmRleCArIFRJTEVfU0laRSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IHNyY0luZGV4ID0gZ2xvYmFsWSAqIHRhcmdldFdpZHRoICsgc3RhcnRYXG4gICAgICBsZXQgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpXG5cbiAgICAgIGRzdC5zZXQocm93RGF0YSwgZHN0SW5kZXgpXG5cbiAgICAgIGlmIChjb3B5V2lkdGggPCBUSUxFX1NJWkUpIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXggKyBjb3B5V2lkdGgsIGRzdEluZGV4ICsgVElMRV9TSVpFKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4dHJhY3RBZnRlclRpbGVzKCk6IFBpeGVsVGlsZVtdIHtcbiAgICBsZXQgYWZ0ZXJUaWxlczogUGl4ZWxUaWxlW10gPSBbXVxuICAgIGxldCBsZW5ndGggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGJlZm9yZVRpbGUgPSB0aGlzLmJlZm9yZVRpbGVzW2ldXG5cbiAgICAgIGlmIChiZWZvcmVUaWxlKSB7XG4gICAgICAgIGxldCBhZnRlclRpbGUgPSB0aGlzLmdldFRpbGUoXG4gICAgICAgICAgYmVmb3JlVGlsZS5pZCxcbiAgICAgICAgICBiZWZvcmVUaWxlLnR4LFxuICAgICAgICAgIGJlZm9yZVRpbGUudHksXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmV4dHJhY3RTdGF0ZShhZnRlclRpbGUpXG4gICAgICAgIGFmdGVyVGlsZXMucHVzaChhZnRlclRpbGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFmdGVyVGlsZXNcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMubG9va3VwID0gW11cbiAgICB0aGlzLmJlZm9yZVRpbGVzID0gW11cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export class PixelEngineConfig {\n public readonly tileSize: number;\n public readonly tileShift: number;\n public readonly tileMask: number;\n public readonly tileArea: number;\n constructor(tileSize: number = 256) {\n // Ensure it's a power of 2 to guarantee bitwise math works\n if ((tileSize & tileSize - 1) !== 0) {\n throw new Error('tileSize must be a power of 2');\n }\n this.tileSize = tileSize;\n this.tileShift = Math.log2(tileSize);\n this.tileMask = tileSize - 1;\n this.tileArea = tileSize * tileSize;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFBpeGVsRW5naW5lQ29uZmlnIHtcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVTaXplOiBudW1iZXJcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVTaGlmdDogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSB0aWxlTWFzazogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSB0aWxlQXJlYTogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IodGlsZVNpemU6IG51bWJlciA9IDI1Nikge1xuICAgIC8vIEVuc3VyZSBpdCdzIGEgcG93ZXIgb2YgMiB0byBndWFyYW50ZWUgYml0d2lzZSBtYXRoIHdvcmtzXG4gICAgaWYgKCh0aWxlU2l6ZSAmICh0aWxlU2l6ZSAtIDEpKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlU2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMicpXG4gICAgfVxuXG4gICAgdGhpcy50aWxlU2l6ZSA9IHRpbGVTaXplXG4gICAgdGhpcy50aWxlU2hpZnQgPSBNYXRoLmxvZzIodGlsZVNpemUpXG4gICAgdGhpcy50aWxlTWFzayA9IHRpbGVTaXplIC0gMVxuICAgIHRoaXMudGlsZUFyZWEgPSB0aWxlU2l6ZSAqIHRpbGVTaXplXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function applyAlphaMaskToPixelData(dst: IPixelData, mask: AlphaMask, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n mw,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n\n // 1. Initial Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dst.width - x);\n h = Math.min(h, dst.height - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Determine Source Dimensions\n const mPitch = mw ?? width;\n if (mPitch <= 0) return;\n const maskHeight = mask.length / mPitch | 0;\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(mPitch, startX + w);\n const sY1 = Math.min(maskHeight, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n\n // This is where your failing tests are now caught\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dst32 = dst.data32;\n const dw = dst.width;\n const dStride = dw - finalW;\n const mStride = mPitch - finalW;\n let dIdx = (y + yShift) * dw + (x + xShift);\n let mIdx = sY0 * mPitch + sX0;\n for (let iy = 0; iy < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const mVal = mask[mIdx];\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - mVal : mVal;\n let weight = 0;\n if (effectiveM === 0) {\n weight = 0;\n } else if (effectiveM === 255) {\n weight = globalAlpha;\n } else if (globalAlpha === 255) {\n weight = effectiveM;\n } else {\n weight = effectiveM * globalAlpha + 128 >> 8;\n }\n if (weight === 0) {\n // Clear alpha channel\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0;\n } else if (weight !== 255) {\n // Merge alpha channel\n const d = dst32[dIdx];\n const da = d >>> 24;\n if (da !== 0) {\n const finalAlpha = da === 255 ? weight : da * weight + 128 >> 8;\n dst32[dIdx] = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIG1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG13LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuXG5cbiAgLy8gMS4gSW5pdGlhbCBEZXN0aW5hdGlvbiBDbGlwcGluZ1xuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG5cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIHcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBoID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKHcgPD0gMCkgcmV0dXJuXG4gIGlmIChoIDw9IDApIHJldHVyblxuXG4gIC8vIDIuIERldGVybWluZSBTb3VyY2UgRGltZW5zaW9uc1xuICBjb25zdCBtUGl0Y2ggPSBtdyA/PyB3aWR0aFxuICBpZiAobVBpdGNoIDw9IDApIHJldHVyblxuICBjb25zdCBtYXNrSGVpZ2h0ID0gKG1hc2subGVuZ3RoIC8gbVBpdGNoKSB8IDBcblxuICAvLyAzLiBTb3VyY2UgQm91bmRzIENsaXBwaW5nXG4gIC8vIENhbGN1bGF0ZSB3aGVyZSB3ZSB3b3VsZCBzdGFydCByZWFkaW5nIGluIHRoZSBtYXNrXG4gIGNvbnN0IHN0YXJ0WCA9IG14ICsgKHggLSB0YXJnZXRYKVxuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSlcblxuICAvLyBGaW5kIHRoZSBzYWZlIG92ZXJsYXAgYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBhbmQgdGhlIG1hc2sgYm91bmRzXG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WClcbiAgY29uc3Qgc1kwID0gTWF0aC5tYXgoMCwgc3RhcnRZKVxuICBjb25zdCBzWDEgPSBNYXRoLm1pbihtUGl0Y2gsIHN0YXJ0WCArIHcpXG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKG1hc2tIZWlnaHQsIHN0YXJ0WSArIGgpXG5cbiAgY29uc3QgZmluYWxXID0gc1gxIC0gc1gwXG4gIGNvbnN0IGZpbmFsSCA9IHNZMSAtIHNZMFxuXG4gIC8vIFRoaXMgaXMgd2hlcmUgeW91ciBmYWlsaW5nIHRlc3RzIGFyZSBub3cgY2F1Z2h0XG4gIGlmIChmaW5hbFcgPD0gMCkgcmV0dXJuXG4gIGlmIChmaW5hbEggPD0gMCkgcmV0dXJuXG5cbiAgLy8gNC4gQWxpZ24gRGVzdGluYXRpb24gd2l0aCBTb3VyY2UgQ2xpcHBpbmdcbiAgLy8gSWYgdGhlIHNvdXJjZSB3YXMgY2xpcHBlZCBvbiB0aGUgdG9wL2xlZnQsIHdlIG11c3Qgc2hpZnQgdGhlIGRlc3RpbmF0aW9uIHN0YXJ0XG4gIGNvbnN0IHhTaGlmdCA9IHNYMCAtIHN0YXJ0WFxuICBjb25zdCB5U2hpZnQgPSBzWTAgLSBzdGFydFlcblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgY29uc3QgZFN0cmlkZSA9IGR3IC0gZmluYWxXXG4gIGNvbnN0IG1TdHJpZGUgPSBtUGl0Y2ggLSBmaW5hbFdcblxuICBsZXQgZElkeCA9ICh5ICsgeVNoaWZ0KSAqIGR3ICsgKHggKyB4U2hpZnQpXG4gIGxldCBtSWR4ID0gc1kwICogbVBpdGNoICsgc1gwXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgdzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IG1hc2tbbUlkeF1cbiAgICAgIC8vIFVuaWZpZWQgbG9naWMgYnJhbmNoIGluc2lkZSB0aGUgaG90IHBhdGhcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgbGV0IHdlaWdodCA9IDBcblxuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMFxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVNID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcbiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEgPT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZlY3RpdmVNXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3ZWlnaHQgPSAoZWZmZWN0aXZlTSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICB9XG5cbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxwaGEgY2hhbm5lbFxuICAgICAgICBkc3QzMltkSWR4XSA9IChkc3QzMltkSWR4XSAmIDB4MDBmZmZmZmYpID4+PiAwXG4gICAgICB9IGVsc2UgaWYgKHdlaWdodCAhPT0gMjU1KSB7XG4gICAgICAgIC8vIE1lcmdlIGFscGhhIGNoYW5uZWxcbiAgICAgICAgY29uc3QgZCA9IGRzdDMyW2RJZHhdXG4gICAgICAgIGNvbnN0IGRhID0gZCA+Pj4gMjRcblxuICAgICAgICBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICBjb25zdCBmaW5hbEFscGhhID0gZGEgPT09IDI1NSA/IHdlaWdodCA6IChkYSAqIHdlaWdodCArIDEyOCkgPj4gOFxuICAgICAgICAgIGRzdDMyW2RJZHhdID0gKChkICYgMHgwMGZmZmZmZikgfCAoZmluYWxBbHBoYSA8PCAyNCkpID4+PiAwXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type HistoryMutator } from '../../_types';\nimport { applyAlphaMaskToPixelData } from '../../PixelData/applyAlphaMaskToPixelData';\nconst defaults = {\n applyAlphaMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyAlphaMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyAlphaMaskToPixelData = defaults.applyAlphaMaskToPixelData\n } = deps;\n return {\n applyAlphaMask: (mask: AlphaMask, opts: ApplyMaskToPixelDataOptions = {}) => {\n let target = writer.target;\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyAlphaMaskToPixelData(target, mask, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5QWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseUFscGhhTWFzazogKG1hc2s6IEFscGhhTWFzaywgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30pID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSB3cml0ZXIudGFyZ2V0XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cylcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n */\nexport function applyBinaryMaskToPixelData(dst: IPixelData, mask: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha = 255,\n mw,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (alpha === 0) return;\n\n // 1. Initial Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dst.width - x);\n h = Math.min(h, dst.height - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Determine Source Dimensions\n const mPitch = mw ?? width;\n if (mPitch <= 0) return;\n const maskHeight = mask.length / mPitch | 0;\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(mPitch, startX + w);\n const sY1 = Math.min(maskHeight, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n\n // This is where your failing tests are now caught\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dst32 = dst.data32;\n const dw = dst.width;\n const dStride = dw - finalW;\n const mStride = mPitch - finalW;\n let dIdx = (y + yShift) * dw + (x + xShift);\n let mIdx = sY0 * mPitch + sX0;\n for (let iy = 0; iy < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const mVal = mask[mIdx];\n // Consistently determines if this pixel should be \"masked out\" (cleared)\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n // Clear alpha channel only (keep RGB)\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0;\n } else if (alpha !== 255) {\n const d = dst32[dIdx];\n const da = d >>> 24;\n\n // If pixel isn't already fully transparent, apply global alpha\n if (da !== 0) {\n const finalAlpha = da === 255 ? alpha : da * alpha + 128 >> 8;\n dst32[dIdx] = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGEgPSAyNTUsXG4gICAgbXcsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGFscGhhID09PSAwKSByZXR1cm5cblxuICAvLyAxLiBJbml0aWFsIERlc3RpbmF0aW9uIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgdyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAodyA8PSAwKSByZXR1cm5cbiAgaWYgKGggPD0gMCkgcmV0dXJuXG5cbiAgLy8gMi4gRGV0ZXJtaW5lIFNvdXJjZSBEaW1lbnNpb25zXG4gIGNvbnN0IG1QaXRjaCA9IG13ID8/IHdpZHRoXG4gIGlmIChtUGl0Y2ggPD0gMCkgcmV0dXJuXG4gIGNvbnN0IG1hc2tIZWlnaHQgPSAobWFzay5sZW5ndGggLyBtUGl0Y2gpIHwgMFxuXG4gIC8vIDMuIFNvdXJjZSBCb3VuZHMgQ2xpcHBpbmdcbiAgLy8gQ2FsY3VsYXRlIHdoZXJlIHdlIHdvdWxkIHN0YXJ0IHJlYWRpbmcgaW4gdGhlIG1hc2tcbiAgY29uc3Qgc3RhcnRYID0gbXggKyAoeCAtIHRhcmdldFgpXG4gIGNvbnN0IHN0YXJ0WSA9IG15ICsgKHkgLSB0YXJnZXRZKVxuXG4gIC8vIEZpbmQgdGhlIHNhZmUgb3ZlcmxhcCBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGFuZCB0aGUgbWFzayBib3VuZHNcbiAgY29uc3Qgc1gwID0gTWF0aC5tYXgoMCwgc3RhcnRYKVxuICBjb25zdCBzWTAgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKG1QaXRjaCwgc3RhcnRYICsgdylcbiAgY29uc3Qgc1kxID0gTWF0aC5taW4obWFza0hlaWdodCwgc3RhcnRZICsgaClcblxuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDBcbiAgY29uc3QgZmluYWxIID0gc1kxIC0gc1kwXG5cbiAgLy8gVGhpcyBpcyB3aGVyZSB5b3VyIGZhaWxpbmcgdGVzdHMgYXJlIG5vdyBjYXVnaHRcbiAgaWYgKGZpbmFsVyA8PSAwKSByZXR1cm5cbiAgaWYgKGZpbmFsSCA8PSAwKSByZXR1cm5cblxuICAvLyA0LiBBbGlnbiBEZXN0aW5hdGlvbiB3aXRoIFNvdXJjZSBDbGlwcGluZ1xuICAvLyBJZiB0aGUgc291cmNlIHdhcyBjbGlwcGVkIG9uIHRoZSB0b3AvbGVmdCwgd2UgbXVzdCBzaGlmdCB0aGUgZGVzdGluYXRpb24gc3RhcnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYXG4gIGNvbnN0IHlTaGlmdCA9IHNZMCAtIHN0YXJ0WVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBkU3RyaWRlID0gZHcgLSBmaW5hbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGZpbmFsV1xuXG4gIGxldCBkSWR4ID0gKHkgKyB5U2hpZnQpICogZHcgKyAoeCArIHhTaGlmdClcbiAgbGV0IG1JZHggPSBzWTAgKiBtUGl0Y2ggKyBzWDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgaDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCB3OyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza1ttSWR4XVxuICAgICAgLy8gQ29uc2lzdGVudGx5IGRldGVybWluZXMgaWYgdGhpcyBwaXhlbCBzaG91bGQgYmUgXCJtYXNrZWQgb3V0XCIgKGNsZWFyZWQpXG4gICAgICBjb25zdCBpc01hc2tlZE91dCA9IGludmVydE1hc2sgPyBtVmFsICE9PSAwIDogbVZhbCA9PT0gMFxuXG4gICAgICBpZiAoaXNNYXNrZWRPdXQpIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxwaGEgY2hhbm5lbCBvbmx5IChrZWVwIFJHQilcbiAgICAgICAgZHN0MzJbZElkeF0gPSAoZHN0MzJbZElkeF0gJiAweDAwZmZmZmZmKSA+Pj4gMFxuICAgICAgfSBlbHNlIGlmIChhbHBoYSAhPT0gMjU1KSB7XG4gICAgICAgIGNvbnN0IGQgPSBkc3QzMltkSWR4XVxuICAgICAgICBjb25zdCBkYSA9IGQgPj4+IDI0XG5cbiAgICAgICAgLy8gSWYgcGl4ZWwgaXNuJ3QgYWxyZWFkeSBmdWxseSB0cmFuc3BhcmVudCwgYXBwbHkgZ2xvYmFsIGFscGhhXG4gICAgICAgIGlmIChkYSAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGZpbmFsQWxwaGEgPSBkYSA9PT0gMjU1ID8gYWxwaGEgOiAoZGEgKiBhbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICAgIGRzdDMyW2RJZHhdID0gKChkICYgMHgwMGZmZmZmZikgfCAoZmluYWxBbHBoYSA8PCAyNCkpID4+PiAwXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type HistoryMutator } from '../../_types';\nimport { applyBinaryMaskToPixelData } from '../../PixelData/applyBinaryMaskToPixelData';\nconst defaults = {\n applyBinaryMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyBinaryMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyBinaryMaskToPixelData = defaults.applyBinaryMaskToPixelData\n } = deps;\n return {\n applyBinaryMask: (mask: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}) => {\n let target = writer.target;\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyBinaryMaskToPixelData(target, mask, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYXBwbHlCaW5hcnlNYXNrOiAobWFzazogQmluYXJ5TWFzaywgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30pID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSB3cml0ZXIudGFyZ2V0XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSh0YXJnZXQsIG1hc2ssIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function getCircleBrushOrPencilBounds(centerX: number, centerY: number, brushSize: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const r = brushSize / 2;\n const minOffset = -Math.ceil(r - 0.5);\n const maxOffset = Math.floor(r - 0.5);\n\n // start is inclusive, end is exclusive\n const startX = Math.floor(centerX + minOffset);\n const startY = Math.floor(centerY + minOffset);\n const endX = Math.floor(centerX + maxOffset) + 1;\n const endY = Math.floor(centerY + maxOffset) + 1;\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const cStartX = Math.max(0, startX);\n const cStartY = Math.max(0, startY);\n const cEndX = Math.min(targetWidth, endX);\n const cEndY = Math.min(targetHeight, endY);\n const w = cEndX - cStartX;\n const h = cEndY - cStartY;\n res.x = cStartX;\n res.y = cStartY;\n res.w = w < 0 ? 0 : w;\n res.h = h < 0 ? 0 : h;\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyhcbiAgY2VudGVyWDogbnVtYmVyLFxuICBjZW50ZXJZOiBudW1iZXIsXG4gIGJydXNoU2l6ZTogbnVtYmVyLFxuICB0YXJnZXRXaWR0aDogbnVtYmVyLFxuICB0YXJnZXRIZWlnaHQ6IG51bWJlcixcbiAgb3V0PzogUmVjdCxcbik6IFJlY3Qge1xuICBjb25zdCByID0gYnJ1c2hTaXplIC8gMlxuXG4gIGNvbnN0IG1pbk9mZnNldCA9IC1NYXRoLmNlaWwociAtIDAuNSlcbiAgY29uc3QgbWF4T2Zmc2V0ID0gTWF0aC5mbG9vcihyIC0gMC41KVxuXG4gIC8vIHN0YXJ0IGlzIGluY2x1c2l2ZSwgZW5kIGlzIGV4Y2x1c2l2ZVxuICBjb25zdCBzdGFydFggPSBNYXRoLmZsb29yKGNlbnRlclggKyBtaW5PZmZzZXQpXG4gIGNvbnN0IHN0YXJ0WSA9IE1hdGguZmxvb3IoY2VudGVyWSArIG1pbk9mZnNldClcbiAgY29uc3QgZW5kWCA9IE1hdGguZmxvb3IoY2VudGVyWCArIG1heE9mZnNldCkgKyAxXG4gIGNvbnN0IGVuZFkgPSBNYXRoLmZsb29yKGNlbnRlclkgKyBtYXhPZmZzZXQpICsgMVxuXG4gIGNvbnN0IHJlcyA9IG91dCA/PyB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNTdGFydFggPSBNYXRoLm1heCgwLCBzdGFydFgpXG4gIGNvbnN0IGNTdGFydFkgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IGNFbmRYID0gTWF0aC5taW4odGFyZ2V0V2lkdGgsIGVuZFgpXG4gIGNvbnN0IGNFbmRZID0gTWF0aC5taW4odGFyZ2V0SGVpZ2h0LCBlbmRZKVxuXG4gIGNvbnN0IHcgPSBjRW5kWCAtIGNTdGFydFhcbiAgY29uc3QgaCA9IGNFbmRZIC0gY1N0YXJ0WVxuXG4gIHJlcy54ID0gY1N0YXJ0WFxuICByZXMueSA9IGNTdGFydFlcbiAgcmVzLncgPSB3IDwgMCA/IDAgOiB3XG4gIHJlcy5oID0gaCA8IDAgPyAwIDogaFxuXG4gIHJldHVybiByZXNcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { getCircleBrushOrPencilBounds } from '../Rect/getCircleBrushOrPencilBounds';\n\n/**\n * Applies a circular brush to pixel data, blending a color with optional falloff.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brushSize The diameter of the brush.\n * @param alpha The overall opacity of the brush (0-255).\n * @default 255\n * @param fallOff A function that returns an alpha multiplier (0-1) based on the normalized distance (0-1) from the circle's center.\n * @param blendFn\n * @param bounds precalculated result from {@link getCircleBrushOrPencilBounds}\n * @default sourceOverPerfect\n */\nexport function applyCircleBrushToPixelData(target: IPixelData, color: Color32, centerX: number, centerY: number, brushSize: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect, bounds?: Rect): void {\n const targetWidth = target.width;\n const targetHeight = target.height;\n\n // Use provided bounds OR calculate them once\n const b = bounds ?? getCircleBrushOrPencilBounds(centerX, centerY, brushSize, targetWidth, targetHeight);\n if (b.w <= 0 || b.h <= 0) return;\n const data32 = target.data32;\n const r = brushSize / 2;\n const rSqr = r * r;\n const invR = 1 / r;\n const centerOffset = brushSize % 2 === 0 ? 0.5 : 0;\n const endX = b.x + b.w;\n const endY = b.y + b.h;\n\n // Anchor the math to the floor of the center for exact pixel art parity\n const fCenterX = Math.floor(centerX);\n const fCenterY = Math.floor(centerY);\n const baseSrcAlpha = color >>> 24;\n const colorRGB = color & 0x00ffffff;\n const isOpaque = alpha === 255;\n const isOverwrite = (blendFn as any).isOverwrite;\n for (let cy = b.y; cy < endY; cy++) {\n const relY = cy - fCenterY + centerOffset;\n const dySqr = relY * relY;\n const rowOffset = cy * targetWidth;\n for (let cx = b.x; cx < endX; cx++) {\n const relX = cx - fCenterX + centerOffset;\n const dSqr = relX * relX + dySqr;\n if (dSqr <= rSqr) {\n const idx = rowOffset + cx;\n let weight = alpha;\n const strength = fallOff(1 - Math.sqrt(dSqr) * invR);\n const maskVal = strength * 255 | 0;\n if (maskVal === 0) continue;\n\n // Match Blitter's weight calculation exactly\n if (isOpaque) {\n weight = maskVal;\n } else if (maskVal !== 255) {\n weight = maskVal * alpha + 128 >> 8;\n }\n\n // Match Blitter's final color calculation exactly\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) continue;\n finalCol = (colorRGB | a << 24) >>> 0 as Color32;\n }\n data32[idx] = blendFn(finalCol, data32[idx] as Color32);\n }\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIElQaXhlbERhdGEsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMnXG5cbi8qKlxuICogQXBwbGllcyBhIGNpcmN1bGFyIGJydXNoIHRvIHBpeGVsIGRhdGEsIGJsZW5kaW5nIGEgY29sb3Igd2l0aCBvcHRpb25hbCBmYWxsb2ZmLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIFBpeGVsRGF0YSB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgVGhlIGJydXNoIGNvbG9yLlxuICogQHBhcmFtIGNlbnRlclggVGhlIGNlbnRlciB4LWNvb3JkaW5hdGUgb2YgdGhlIGJydXNoLlxuICogQHBhcmFtIGNlbnRlclkgVGhlIGNlbnRlciB5LWNvb3JkaW5hdGUgb2YgdGhlIGJydXNoLlxuICogQHBhcmFtIGJydXNoU2l6ZSBUaGUgZGlhbWV0ZXIgb2YgdGhlIGJydXNoLlxuICogQHBhcmFtIGFscGhhIFRoZSBvdmVyYWxsIG9wYWNpdHkgb2YgdGhlIGJydXNoICgwLTI1NSkuXG4gKiBAZGVmYXVsdCAyNTVcbiAqIEBwYXJhbSBmYWxsT2ZmIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGFscGhhIG11bHRpcGxpZXIgKDAtMSkgYmFzZWQgb24gdGhlIG5vcm1hbGl6ZWQgZGlzdGFuY2UgKDAtMSkgZnJvbSB0aGUgY2lyY2xlJ3MgY2VudGVyLlxuICogQHBhcmFtIGJsZW5kRm5cbiAqIEBwYXJhbSBib3VuZHMgcHJlY2FsY3VsYXRlZCByZXN1bHQgZnJvbSB7QGxpbmsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kc31cbiAqIEBkZWZhdWx0IHNvdXJjZU92ZXJQZXJmZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUNpcmNsZUJydXNoVG9QaXhlbERhdGEoXG4gIHRhcmdldDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuICBicnVzaFNpemU6IG51bWJlcixcbiAgYWxwaGEgPSAyNTUsXG4gIGZhbGxPZmY6IChkaXN0OiBudW1iZXIpID0+IG51bWJlcixcbiAgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QsXG4gIGJvdW5kcz86IFJlY3QsXG4pOiB2b2lkIHtcbiAgY29uc3QgdGFyZ2V0V2lkdGggPSB0YXJnZXQud2lkdGhcbiAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gdGFyZ2V0LmhlaWdodFxuXG4gIC8vIFVzZSBwcm92aWRlZCBib3VuZHMgT1IgY2FsY3VsYXRlIHRoZW0gb25jZVxuICBjb25zdCBiID0gYm91bmRzID8/IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgY2VudGVyWCxcbiAgICBjZW50ZXJZLFxuICAgIGJydXNoU2l6ZSxcbiAgICB0YXJnZXRXaWR0aCxcbiAgICB0YXJnZXRIZWlnaHQsXG4gIClcblxuICBpZiAoYi53IDw9IDAgfHwgYi5oIDw9IDApIHJldHVyblxuXG4gIGNvbnN0IGRhdGEzMiA9IHRhcmdldC5kYXRhMzJcbiAgY29uc3QgciA9IGJydXNoU2l6ZSAvIDJcbiAgY29uc3QgclNxciA9IHIgKiByXG4gIGNvbnN0IGludlIgPSAxIC8gclxuXG4gIGNvbnN0IGNlbnRlck9mZnNldCA9IChicnVzaFNpemUgJSAyID09PSAwKSA/IDAuNSA6IDBcblxuICBjb25zdCBlbmRYID0gYi54ICsgYi53XG4gIGNvbnN0IGVuZFkgPSBiLnkgKyBiLmhcblxuICAvLyBBbmNob3IgdGhlIG1hdGggdG8gdGhlIGZsb29yIG9mIHRoZSBjZW50ZXIgZm9yIGV4YWN0IHBpeGVsIGFydCBwYXJpdHlcbiAgY29uc3QgZkNlbnRlclggPSBNYXRoLmZsb29yKGNlbnRlclgpXG4gIGNvbnN0IGZDZW50ZXJZID0gTWF0aC5mbG9vcihjZW50ZXJZKVxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBjb2xvclJHQiA9IGNvbG9yICYgMHgwMGZmZmZmZlxuICBjb25zdCBpc09wYXF1ZSA9IGFscGhhID09PSAyNTVcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlXG5cbiAgZm9yIChsZXQgY3kgPSBiLnk7IGN5IDwgZW5kWTsgY3krKykge1xuICAgIGNvbnN0IHJlbFkgPSAoY3kgLSBmQ2VudGVyWSkgKyBjZW50ZXJPZmZzZXRcbiAgICBjb25zdCBkeVNxciA9IHJlbFkgKiByZWxZXG4gICAgY29uc3Qgcm93T2Zmc2V0ID0gY3kgKiB0YXJnZXRXaWR0aFxuXG4gICAgZm9yIChsZXQgY3ggPSBiLng7IGN4IDwgZW5kWDsgY3grKykge1xuICAgICAgY29uc3QgcmVsWCA9IChjeCAtIGZDZW50ZXJYKSArIGNlbnRlck9mZnNldFxuICAgICAgY29uc3QgZFNxciA9IHJlbFggKiByZWxYICsgZHlTcXJcblxuICAgICAgaWYgKGRTcXIgPD0gclNxcikge1xuICAgICAgICBjb25zdCBpZHggPSByb3dPZmZzZXQgKyBjeFxuICAgICAgICBsZXQgd2VpZ2h0ID0gYWxwaGFcblxuICAgICAgICBjb25zdCBzdHJlbmd0aCA9IGZhbGxPZmYoMSAtIChNYXRoLnNxcnQoZFNxcikgKiBpbnZSKSlcbiAgICAgICAgY29uc3QgbWFza1ZhbCA9IChzdHJlbmd0aCAqIDI1NSkgfCAwXG4gICAgICAgIGlmIChtYXNrVmFsID09PSAwKSBjb250aW51ZVxuXG4gICAgICAgIC8vIE1hdGNoIEJsaXR0ZXIncyB3ZWlnaHQgY2FsY3VsYXRpb24gZXhhY3RseVxuICAgICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgICB3ZWlnaHQgPSBtYXNrVmFsXG4gICAgICAgIH0gZWxzZSBpZiAobWFza1ZhbCAhPT0gMjU1KSB7XG4gICAgICAgICAgd2VpZ2h0ID0gKG1hc2tWYWwgKiBhbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF0Y2ggQmxpdHRlcidzIGZpbmFsIGNvbG9yIGNhbGN1bGF0aW9uIGV4YWN0bHlcbiAgICAgICAgbGV0IGZpbmFsQ29sID0gY29sb3JcbiAgICAgICAgaWYgKHdlaWdodCA8IDI1NSkge1xuICAgICAgICAgIGNvbnN0IGEgPSAoYmFzZVNyY0FscGhhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG4gICAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSBjb250aW51ZVxuICAgICAgICAgIGZpbmFsQ29sID0gKGNvbG9yUkdCIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhMzJbaWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRhdGEzMltpZHhdIGFzIENvbG9yMzIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { applyCircleBrushToPixelData } from '../../PixelData/applyCircleBrushToPixelData';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nconst defaults = {\n applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyCircleBrush = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyCircleBrushToPixelData = defaults.applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCircleBrush(color: Color32, centerX: number, centerY: number, brushSize: number, alpha = 255, fallOff: (dist: number) => number, blendFn?: BlendColor32) {\n const bounds = getCircleBrushOrPencilBounds(centerX, centerY, brushSize, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyCircleBrushToPixelData(writer.target, color, centerX, centerY, brushSize, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSdcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhLFxuICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUNpcmNsZUJydXNoID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhID0gZGVmYXVsdHMuYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhLFxuICAgIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgPSBkZWZhdWx0cy5nZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxuXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYm91bmRzT3V0OiBSZWN0ID0geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2goXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIGNlbnRlclg6IG51bWJlcixcbiAgICAgIGNlbnRlclk6IG51bWJlcixcbiAgICAgIGJydXNoU2l6ZTogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBmYWxsT2ZmOiAoZGlzdDogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICkge1xuXG4gICAgICBjb25zdCBib3VuZHMgPSBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaFNpemUsXG4gICAgICAgIHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBib3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gYm91bmRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YShcbiAgICAgICAgd3JpdGVyLnRhcmdldCxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoU2l6ZSxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGZhbGxPZmYsXG4gICAgICAgIGJsZW5kRm4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Iterates through a line with sub-pixel precision.\n * Guarantees that the first and last points are exactly (x0, y0) and (x1, y1).\n */\nexport function forEachLinePoint(x0: number, y0: number, x1: number, y1: number, callback: (x: number, y: number) => void): void {\n const dx = x1 - x0;\n const dy = y1 - y0;\n\n // Determine the number of steps based on the longest axis\n const steps = Math.max(Math.abs(dx), Math.abs(dy));\n\n // Handle the zero-length line (Single Stamp Case)\n if (steps === 0) {\n callback(x0, y0);\n return;\n }\n const xInc = dx / steps;\n const yInc = dy / steps;\n let curX = x0;\n let curY = y0;\n\n // We add +1 to the loop to ensure we reach the final (x1, y1)\n for (let i = 0; i <= steps; i++) {\n callback(curX, curY);\n curX += xInc;\n curY += yInc;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGEgbGluZSB3aXRoIHN1Yi1waXhlbCBwcmVjaXNpb24uXG4gKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgZXhhY3RseSAoeDAsIHkwKSBhbmQgKHgxLCB5MSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoTGluZVBvaW50KFxuICB4MDogbnVtYmVyLFxuICB5MDogbnVtYmVyLFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICBjYWxsYmFjazogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNvbnN0IGR4ID0geDEgLSB4MFxuICBjb25zdCBkeSA9IHkxIC0geTBcblxuICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzdGVwcyBiYXNlZCBvbiB0aGUgbG9uZ2VzdCBheGlzXG4gIGNvbnN0IHN0ZXBzID0gTWF0aC5tYXgoTWF0aC5hYnMoZHgpLCBNYXRoLmFicyhkeSkpXG5cbiAgLy8gSGFuZGxlIHRoZSB6ZXJvLWxlbmd0aCBsaW5lIChTaW5nbGUgU3RhbXAgQ2FzZSlcbiAgaWYgKHN0ZXBzID09PSAwKSB7XG4gICAgY2FsbGJhY2soeDAsIHkwKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeEluYyA9IGR4IC8gc3RlcHNcbiAgY29uc3QgeUluYyA9IGR5IC8gc3RlcHNcblxuICBsZXQgY3VyWCA9IHgwXG4gIGxldCBjdXJZID0geTBcblxuICAvLyBXZSBhZGQgKzEgdG8gdGhlIGxvb3AgdG8gZW5zdXJlIHdlIHJlYWNoIHRoZSBmaW5hbCAoeDEsIHkxKVxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XG4gICAgY2FsbGJhY2soY3VyWCwgY3VyWSlcbiAgICBjdXJYICs9IHhJbmNcbiAgICBjdXJZICs9IHlJbmNcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendColorPixelDataAlphaMask(dst: IPixelData, color: Color32, mask: AlphaMask, opts: ColorBlendMaskOptions) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mw = width,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0 || !mask) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mw;\n let dIdx = y * dw + x | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n let mStride = mPitch - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const colorRGB = color & 0x00ffffff;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = mask[mIdx];\n const effM = invertMask ? 255 - mVal : mVal;\n if (effM === 0) {\n dIdx++;\n mIdx++;\n continue;\n }\n let weight = globalAlpha;\n if (isOpaque) {\n weight = effM;\n } else if (effM !== 255) {\n weight = effM * globalAlpha + 128 >> 8;\n }\n if (weight === 0) {\n dIdx++;\n mIdx++;\n continue;\n }\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n mIdx++;\n continue;\n }\n finalCol = (colorRGB | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIENvbG9yMzIsIENvbG9yQmxlbmRNYXNrT3B0aW9ucywgSVBpeGVsRGF0YSB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayhcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBjb2xvcjogQ29sb3IzMixcbiAgbWFzazogQWxwaGFNYXNrLFxuICBvcHRzOiBDb2xvckJsZW5kTWFza09wdGlvbnMsXG4pIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBtdyA9IHdpZHRoLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCB8fCAhbWFzaykgcmV0dXJuXG5cbiAgY29uc3QgYmFzZVNyY0FscGhhID0gKGNvbG9yID4+PiAyNClcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlIHx8IGZhbHNlXG5cbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVyblxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuXG5cbiAgY29uc3QgZHggPSAoeCAtIHRhcmdldFgpIHwgMFxuICBjb25zdCBkeSA9ICh5IC0gdGFyZ2V0WSkgfCAwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG13XG5cbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGxldCBtSWR4ID0gKChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KSkgfCAwXG5cbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBsZXQgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGNvbG9yUkdCID0gY29sb3IgJiAweDAwZmZmZmZmXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IG1hc2tbbUlkeF1cbiAgICAgIGNvbnN0IGVmZk0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgaWYgKGVmZk0gPT09IDApIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcblxuICAgICAgaWYgKGlzT3BhcXVlKSB7XG4gICAgICAgIHdlaWdodCA9IGVmZk1cbiAgICAgIH0gZWxzZSBpZiAoZWZmTSAhPT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IChlZmZNICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgIH1cblxuICAgICAgaWYgKHdlaWdodCA9PT0gMCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbENvbCA9IGNvbG9yXG5cbiAgICAgIGlmICh3ZWlnaHQgPCAyNTUpIHtcbiAgICAgICAgY29uc3QgYSA9IChiYXNlU3JjQWxwaGEgKiB3ZWlnaHQgKyAxMjgpID4+IDhcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrXG4gICAgICAgICAgbUlkeCsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9IChjb2xvclJHQiB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG5cbiAgICAgIGRJZHgrK1xuICAgICAgbUlkeCsrXG4gICAgfVxuXG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function getCircleBrushOrPencilStrokeBounds(x0: number, y0: number, x1: number, y1: number, brushSize: number, result: Rect): Rect {\n const r = Math.ceil(brushSize / 2);\n const minX = Math.min(x0, x1) - r;\n const minY = Math.min(y0, y1) - r;\n const maxX = Math.max(x0, x1) + r;\n const maxY = Math.max(x0, y1) + r;\n result.x = Math.floor(minX);\n result.y = Math.floor(minY);\n result.w = Math.ceil(maxX - minX);\n result.h = Math.ceil(maxY - minY);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyhcbiAgeDA6IG51bWJlcixcbiAgeTA6IG51bWJlcixcbiAgeDE6IG51bWJlcixcbiAgeTE6IG51bWJlcixcbiAgYnJ1c2hTaXplOiBudW1iZXIsXG4gIHJlc3VsdDogUmVjdCxcbik6IFJlY3Qge1xuICBjb25zdCByID0gTWF0aC5jZWlsKGJydXNoU2l6ZSAvIDIpXG5cbiAgY29uc3QgbWluWCA9IE1hdGgubWluKHgwLCB4MSkgLSByXG4gIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MCwgeTEpIC0gclxuICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDAsIHgxKSArIHJcbiAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHgwLCB5MSkgKyByXG5cbiAgcmVzdWx0LnggPSBNYXRoLmZsb29yKG1pblgpXG4gIHJlc3VsdC55ID0gTWF0aC5mbG9vcihtaW5ZKVxuICByZXN1bHQudyA9IE1hdGguY2VpbChtYXhYIC0gbWluWClcbiAgcmVzdWx0LmggPSBNYXRoLmNlaWwobWF4WSAtIG1pblkpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type AlphaMask, type HistoryMutator } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nimport { getCircleBrushOrPencilStrokeBounds } from '../../Rect/getCircleBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataAlphaMask,\n getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyCircleBrushStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds = defaults.getCircleBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const circleBrushBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendMaskOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCircleBrushStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushSize: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getCircleBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushSize, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n const mask = new Uint8Array(bw * bh) as AlphaMask;\n const r = brushSize / 2;\n const rSqr = r * r;\n const invR = 1 / r;\n const centerOffset = brushSize % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n // 2. Calculate bounds for this specific stamp\n const {\n x: cbx,\n y: cby,\n w: cbw,\n h: cbh\n } = getCircleBrushOrPencilBounds(px, py, brushSize, targetWidth, targetHeight, circleBrushBounds);\n writer.accumulator.storeRegionBeforeState(cbx, cby, cbw, cbh);\n const startX = Math.max(bx, cbx);\n const startY = Math.max(by, cby);\n const endX = Math.min(bx + bw, cbx + cbw);\n const endY = Math.min(by + bh, cby + cbh);\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = my - fPy + centerOffset;\n const dySqr = dy * dy;\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = mx - fPx + centerOffset;\n const dSqr = dx * dx + dySqr;\n if (dSqr <= rSqr) {\n const maskIdx = maskRowOffset + (mx - bx);\n const dist = Math.sqrt(dSqr) * invR;\n const intensity = fallOff(1 - dist) * 255 | 0;\n if (intensity > mask[maskIdx]) {\n mask[maskIdx] = intensity;\n }\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataAlphaMask(writer.target, color, mask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBbHBoYU1hc2ssXG4gIHR5cGUgQmxlbmRDb2xvcjMyLFxuICB0eXBlIENvbG9yMzIsXG4gIHR5cGUgQ29sb3JCbGVuZE1hc2tPcHRpb25zLFxuICB0eXBlIEhpc3RvcnlNdXRhdG9yLFxuICB0eXBlIFJlY3QsXG59IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZvckVhY2hMaW5lUG9pbnQgfSBmcm9tICcuLi8uLi9BbGdvcml0aG0vZm9yRWFjaExpbmVQb2ludCdcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJ1xuaW1wb3J0IHsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcydcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZm9yRWFjaExpbmVQb2ludCxcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayxcbiAgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbn1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbmV4cG9ydCBjb25zdCBtdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZvckVhY2hMaW5lUG9pbnQgPSBkZWZhdWx0cy5mb3JFYWNoTGluZVBvaW50LFxuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrLFxuICAgIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgPSBkZWZhdWx0cy5nZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxuICAgIGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgPSBkZWZhdWx0cy5nZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxuICB9ID0gZGVwc1xuXG4gIGNvbnN0IHN0cm9rZUJvdW5kc091dDogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgY2lyY2xlQnJ1c2hCb3VuZHM6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGJsZW5kQ29sb3JQaXhlbE9wdGlvbnM6IENvbG9yQmxlbmRNYXNrT3B0aW9ucyA9IHtcbiAgICBhbHBoYTogMjU1LFxuICAgIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDAsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2hTdHJva2UoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHgwOiBudW1iZXIsXG4gICAgICB5MDogbnVtYmVyLFxuICAgICAgeDE6IG51bWJlcixcbiAgICAgIHkxOiBudW1iZXIsXG4gICAgICBicnVzaFNpemU6IG51bWJlcixcbiAgICAgIGFscGhhID0gMjU1LFxuICAgICAgZmFsbE9mZjogKGRpc3Q6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgICAgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QsXG4gICAgKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IGJ4LFxuICAgICAgICB5OiBieSxcbiAgICAgICAgdzogYncsXG4gICAgICAgIGg6IGJoLFxuICAgICAgfSA9IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoeDAsIHkwLCB4MSwgeTEsIGJydXNoU2l6ZSwgc3Ryb2tlQm91bmRzT3V0KVxuXG4gICAgICBpZiAoYncgPD0gMCB8fCBiaCA8PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGJ3ICogYmgpIGFzIEFscGhhTWFza1xuXG4gICAgICBjb25zdCByID0gYnJ1c2hTaXplIC8gMlxuICAgICAgY29uc3QgclNxciA9IHIgKiByXG4gICAgICBjb25zdCBpbnZSID0gMSAvIHJcbiAgICAgIGNvbnN0IGNlbnRlck9mZnNldCA9IChicnVzaFNpemUgJSAyID09PSAwKSA/IDAuNSA6IDBcblxuICAgICAgY29uc3QgdGFyZ2V0V2lkdGggPSB3cml0ZXIudGFyZ2V0LndpZHRoXG4gICAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSB3cml0ZXIudGFyZ2V0LmhlaWdodFxuXG4gICAgICBmb3JFYWNoTGluZVBvaW50KHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICAgIC8vIDIuIENhbGN1bGF0ZSBib3VuZHMgZm9yIHRoaXMgc3BlY2lmaWMgc3RhbXBcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IGNieCxcbiAgICAgICAgICB5OiBjYnksXG4gICAgICAgICAgdzogY2J3LFxuICAgICAgICAgIGg6IGNiaCxcbiAgICAgICAgfSA9IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMocHgsIHB5LCBicnVzaFNpemUsIHRhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHQsIGNpcmNsZUJydXNoQm91bmRzKVxuXG4gICAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKGNieCwgY2J5LCBjYncsIGNiaClcblxuICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1heChieCwgY2J4KVxuICAgICAgICBjb25zdCBzdGFydFkgPSBNYXRoLm1heChieSwgY2J5KVxuICAgICAgICBjb25zdCBlbmRYID0gTWF0aC5taW4oYnggKyBidywgY2J4ICsgY2J3KVxuICAgICAgICBjb25zdCBlbmRZID0gTWF0aC5taW4oYnkgKyBiaCwgY2J5ICsgY2JoKVxuXG4gICAgICAgIGNvbnN0IGZQeCA9IE1hdGguZmxvb3IocHgpXG4gICAgICAgIGNvbnN0IGZQeSA9IE1hdGguZmxvb3IocHkpXG5cbiAgICAgICAgZm9yIChsZXQgbXkgPSBzdGFydFk7IG15IDwgZW5kWTsgbXkrKykge1xuICAgICAgICAgIGNvbnN0IGR5ID0gKG15IC0gZlB5KSArIGNlbnRlck9mZnNldFxuICAgICAgICAgIGNvbnN0IGR5U3FyID0gZHkgKiBkeVxuICAgICAgICAgIGNvbnN0IG1hc2tSb3dPZmZzZXQgPSAobXkgLSBieSkgKiBid1xuXG4gICAgICAgICAgZm9yIChsZXQgbXggPSBzdGFydFg7IG14IDwgZW5kWDsgbXgrKykge1xuICAgICAgICAgICAgY29uc3QgZHggPSAobXggLSBmUHgpICsgY2VudGVyT2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBkU3FyID0gZHggKiBkeCArIGR5U3FyXG5cbiAgICAgICAgICAgIGlmIChkU3FyIDw9IHJTcXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWFza0lkeCA9IG1hc2tSb3dPZmZzZXQgKyAobXggLSBieClcblxuICAgICAgICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5zcXJ0KGRTcXIpICogaW52UlxuICAgICAgICAgICAgICBjb25zdCBpbnRlbnNpdHkgPSAoZmFsbE9mZigxIC0gZGlzdCkgKiAyNTUpIHwgMFxuICAgICAgICAgICAgICBpZiAoaW50ZW5zaXR5ID4gbWFza1ttYXNrSWR4XSkge1xuICAgICAgICAgICAgICAgIG1hc2tbbWFza0lkeF0gPSBpbnRlbnNpdHlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5ibGVuZEZuID0gYmxlbmRGblxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5hbHBoYSA9IGFscGhhXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnggPSBieFxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy55ID0gYnlcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMudyA9IGJ3XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmggPSBiaFxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKHdyaXRlci50YXJnZXQsIGNvbG9yLCBtYXNrLCBibGVuZENvbG9yUGl4ZWxPcHRpb25zKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendColorPixelDataBinaryMask(dst: IPixelData, color: Color32, mask: BinaryMask, opts: ColorBlendMaskOptions = {}) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mw = width,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0 || !mask) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n let baseColorWithGlobalAlpha = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return;\n baseColorWithGlobalAlpha = (color & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mw;\n let dIdx = y * dw + x | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const skipVal = invertMask ? 1 : 0;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n if (mask[mIdx] === skipVal) {\n dIdx++;\n mIdx++;\n continue;\n }\n dst32[dIdx] = blendFn(baseColorWithGlobalAlpha, dst32[dIdx] as Color32);\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBDb2xvckJsZW5kTWFza09wdGlvbnMsIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICBtYXNrOiBCaW5hcnlNYXNrLFxuICBvcHRzOiBDb2xvckJsZW5kTWFza09wdGlvbnMgPSB7fSxcbikge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgdzogd2lkdGggPSBkc3Qud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gZHN0LmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIG13ID0gd2lkdGgsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwIHx8ICFtYXNrKSByZXR1cm5cblxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2VcblxuICBpZiAoYmFzZVNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuXG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgZHN0LndpZHRoIC0geClcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIGRzdC5oZWlnaHQgLSB5KVxuXG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSByZXR1cm5cblxuICBsZXQgYmFzZUNvbG9yV2l0aEdsb2JhbEFscGhhID0gY29sb3JcblxuICBpZiAoZ2xvYmFsQWxwaGEgPCAyNTUpIHtcbiAgICBjb25zdCBhID0gKGJhc2VTcmNBbHBoYSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm5cbiAgICBiYXNlQ29sb3JXaXRoR2xvYmFsQWxwaGEgPSAoKGNvbG9yICYgMHgwMGZmZmZmZikgfCAoYSA8PCAyNCkpID4+PiAwIGFzIENvbG9yMzJcbiAgfVxuXG4gIGNvbnN0IGR4ID0gKHggLSB0YXJnZXRYKSB8IDBcbiAgY29uc3QgZHkgPSAoeSAtIHRhcmdldFkpIHwgMFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBtd1xuXG4gIGxldCBkSWR4ID0gKHkgKiBkdyArIHgpIHwgMFxuICBsZXQgbUlkeCA9ICgobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkpIHwgMFxuXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcbiAgY29uc3Qgc2tpcFZhbCA9IGludmVydE1hc2sgPyAxIDogMFxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGlmIChtYXNrW21JZHhdID09PSBza2lwVmFsKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgZHN0MzJbZElkeF0gPSBibGVuZEZuKGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type BinaryMask, type HistoryMutator } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nimport { getCircleBrushOrPencilStrokeBounds } from '../../Rect/getCircleBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataBinaryMask,\n getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyCirclePencilStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n getCircleBrushOrPencilStrokeBounds = defaults.getCircleBrushOrPencilStrokeBounds,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const circlePencilBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendMaskOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCirclePencilStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushSize: number, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getCircleBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushSize, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n const mask = new Uint8Array(bw * bh) as BinaryMask;\n const r = brushSize / 2;\n const rSqr = r * r;\n const centerOffset = brushSize % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n // 2. Calculate bounds for this specific stamp\n const {\n x: cbx,\n y: cby,\n w: cbw,\n h: cbh\n } = getCircleBrushOrPencilBounds(px, py, brushSize, targetWidth, targetHeight, circlePencilBounds);\n writer.accumulator.storeRegionBeforeState(cbx, cby, cbw, cbh);\n const startX = Math.max(bx, cbx);\n const startY = Math.max(by, cby);\n const endX = Math.min(bx + bw, cbx + cbw);\n const endY = Math.min(by + bh, cby + cbh);\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = my - fPy + centerOffset;\n const dySqr = dy * dy;\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = mx - fPx + centerOffset;\n const dSqr = dx * dx + dySqr;\n if (dSqr <= rSqr) {\n const maskIdx = maskRowOffset + (mx - bx);\n mask[maskIdx] = 1;\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataBinaryMask(writer.target, color, mask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBCaW5hcnlNYXNrLFxuICB0eXBlIEJsZW5kQ29sb3IzMixcbiAgdHlwZSBDb2xvcjMyLFxuICB0eXBlIENvbG9yQmxlbmRNYXNrT3B0aW9ucyxcbiAgdHlwZSBIaXN0b3J5TXV0YXRvcixcbiAgdHlwZSBSZWN0LFxufSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBmb3JFYWNoTGluZVBvaW50IH0gZnJvbSAnLi4vLi4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcydcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZm9yRWFjaExpbmVQb2ludCxcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5Q2lyY2xlUGVuY2lsU3Ryb2tlID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZm9yRWFjaExpbmVQb2ludCA9IGRlZmF1bHRzLmZvckVhY2hMaW5lUG9pbnQsXG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgfSA9IGRlcHNcblxuICBjb25zdCBzdHJva2VCb3VuZHNPdXQ6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNpcmNsZVBlbmNpbEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgYmxlbmRDb2xvclBpeGVsT3B0aW9uczogQ29sb3JCbGVuZE1hc2tPcHRpb25zID0ge1xuICAgIGFscGhhOiAyNTUsXG4gICAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3QsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXBwbHlDaXJjbGVQZW5jaWxTdHJva2UoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHgwOiBudW1iZXIsXG4gICAgICB5MDogbnVtYmVyLFxuICAgICAgeDE6IG51bWJlcixcbiAgICAgIHkxOiBudW1iZXIsXG4gICAgICBicnVzaFNpemU6IG51bWJlcixcbiAgICAgIGFscGhhID0gMjU1LFxuICAgICAgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QsXG4gICAgKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IGJ4LFxuICAgICAgICB5OiBieSxcbiAgICAgICAgdzogYncsXG4gICAgICAgIGg6IGJoLFxuICAgICAgfSA9IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoeDAsIHkwLCB4MSwgeTEsIGJydXNoU2l6ZSwgc3Ryb2tlQm91bmRzT3V0KVxuXG4gICAgICBpZiAoYncgPD0gMCB8fCBiaCA8PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGJ3ICogYmgpIGFzIEJpbmFyeU1hc2tcblxuICAgICAgY29uc3QgciA9IGJydXNoU2l6ZSAvIDJcbiAgICAgIGNvbnN0IHJTcXIgPSByICogclxuICAgICAgY29uc3QgY2VudGVyT2Zmc2V0ID0gKGJydXNoU2l6ZSAlIDIgPT09IDApID8gMC41IDogMFxuXG4gICAgICBjb25zdCB0YXJnZXRXaWR0aCA9IHdyaXRlci50YXJnZXQud2lkdGhcbiAgICAgIGNvbnN0IHRhcmdldEhlaWdodCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0XG5cbiAgICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgICAgLy8gMi4gQ2FsY3VsYXRlIGJvdW5kcyBmb3IgdGhpcyBzcGVjaWZpYyBzdGFtcFxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogY2J4LFxuICAgICAgICAgIHk6IGNieSxcbiAgICAgICAgICB3OiBjYncsXG4gICAgICAgICAgaDogY2JoLFxuICAgICAgICB9ID0gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyhweCwgcHksIGJydXNoU2l6ZSwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCwgY2lyY2xlUGVuY2lsQm91bmRzKVxuXG4gICAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKGNieCwgY2J5LCBjYncsIGNiaClcblxuICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1heChieCwgY2J4KVxuICAgICAgICBjb25zdCBzdGFydFkgPSBNYXRoLm1heChieSwgY2J5KVxuICAgICAgICBjb25zdCBlbmRYID0gTWF0aC5taW4oYnggKyBidywgY2J4ICsgY2J3KVxuICAgICAgICBjb25zdCBlbmRZID0gTWF0aC5taW4oYnkgKyBiaCwgY2J5ICsgY2JoKVxuXG4gICAgICAgIGNvbnN0IGZQeCA9IE1hdGguZmxvb3IocHgpXG4gICAgICAgIGNvbnN0IGZQeSA9IE1hdGguZmxvb3IocHkpXG5cbiAgICAgICAgZm9yIChsZXQgbXkgPSBzdGFydFk7IG15IDwgZW5kWTsgbXkrKykge1xuICAgICAgICAgIGNvbnN0IGR5ID0gKG15IC0gZlB5KSArIGNlbnRlck9mZnNldFxuICAgICAgICAgIGNvbnN0IGR5U3FyID0gZHkgKiBkeVxuICAgICAgICAgIGNvbnN0IG1hc2tSb3dPZmZzZXQgPSAobXkgLSBieSkgKiBid1xuXG4gICAgICAgICAgZm9yIChsZXQgbXggPSBzdGFydFg7IG14IDwgZW5kWDsgbXgrKykge1xuICAgICAgICAgICAgY29uc3QgZHggPSAobXggLSBmUHgpICsgY2VudGVyT2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBkU3FyID0gZHggKiBkeCArIGR5U3FyXG5cbiAgICAgICAgICAgIGlmIChkU3FyIDw9IHJTcXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWFza0lkeCA9IG1hc2tSb3dPZmZzZXQgKyAobXggLSBieClcbiAgICAgICAgICAgICAgbWFza1ttYXNrSWR4XSA9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuYmxlbmRGbiA9IGJsZW5kRm5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuYWxwaGEgPSBhbHBoYVxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy54ID0gYnhcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMueSA9IGJ5XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLncgPSBid1xuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5oID0gYmhcblxuICAgICAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sod3JpdGVyLnRhcmdldCwgY29sb3IsIG1hc2ssIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function getRectBrushOrPencilBounds(centerX: number, centerY: number, brushWidth: number, brushHeight: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const startX = Math.floor(centerX - brushWidth / 2);\n const startY = Math.floor(centerY - brushHeight / 2);\n const endX = startX + brushWidth;\n const endY = startY + brushHeight;\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const cStartX = Math.max(0, startX);\n const cStartY = Math.max(0, startY);\n const cEndX = Math.min(targetWidth, endX);\n const cEndY = Math.min(targetHeight, endY);\n const w = cEndX - cStartX;\n const h = cEndY - cStartY;\n res.x = cStartX;\n res.y = cStartY;\n res.w = w < 0 ? 0 : w;\n res.h = h < 0 ? 0 : h;\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuICBicnVzaFdpZHRoOiBudW1iZXIsXG4gIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gIHRhcmdldFdpZHRoOiBudW1iZXIsXG4gIHRhcmdldEhlaWdodDogbnVtYmVyLFxuICBvdXQ/OiBSZWN0LFxuKTogUmVjdCB7XG4gIGNvbnN0IHN0YXJ0WCA9IE1hdGguZmxvb3IoY2VudGVyWCAtIGJydXNoV2lkdGggLyAyKVxuICBjb25zdCBzdGFydFkgPSBNYXRoLmZsb29yKGNlbnRlclkgLSBicnVzaEhlaWdodCAvIDIpXG4gIGNvbnN0IGVuZFggPSBzdGFydFggKyBicnVzaFdpZHRoXG4gIGNvbnN0IGVuZFkgPSBzdGFydFkgKyBicnVzaEhlaWdodFxuXG4gIGNvbnN0IHJlcyA9IG91dCA/PyB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNTdGFydFggPSBNYXRoLm1heCgwLCBzdGFydFgpXG4gIGNvbnN0IGNTdGFydFkgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IGNFbmRYID0gTWF0aC5taW4odGFyZ2V0V2lkdGgsIGVuZFgpXG4gIGNvbnN0IGNFbmRZID0gTWF0aC5taW4odGFyZ2V0SGVpZ2h0LCBlbmRZKVxuXG4gIGNvbnN0IHcgPSBjRW5kWCAtIGNTdGFydFhcbiAgY29uc3QgaCA9IGNFbmRZIC0gY1N0YXJ0WVxuXG4gIHJlcy54ID0gY1N0YXJ0WFxuICByZXMueSA9IGNTdGFydFlcbiAgcmVzLncgPSB3IDwgMCA/IDAgOiB3XG4gIHJlcy5oID0gaCA8IDAgPyAwIDogaFxuXG4gIHJldHVybiByZXNcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { getRectBrushOrPencilBounds } from '../Rect/getRectBrushOrPencilBounds';\nexport function applyRectBrushToPixelData(target: IPixelData, color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect, bounds?: Rect): void {\n const targetWidth = target.width;\n const targetHeight = target.height;\n const b = bounds ?? getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, targetWidth, targetHeight);\n if (b.w <= 0 || b.h <= 0) return;\n const data32 = target.data32;\n const baseColor = color & 0x00ffffff;\n const baseSrcAlpha = color >>> 24;\n const isOpaque = alpha === 255;\n const invHalfW = 1 / (brushWidth / 2);\n const invHalfH = 1 / (brushHeight / 2);\n\n // Restore the pixel-art centering logic\n const centerOffsetX = brushWidth % 2 === 0 ? 0.5 : 0;\n const centerOffsetY = brushHeight % 2 === 0 ? 0.5 : 0;\n const fCenterX = Math.floor(centerX);\n const fCenterY = Math.floor(centerY);\n const endX = b.x + b.w;\n const endY = b.y + b.h;\n const isOverwrite = (blendFn as any).isOverwrite;\n for (let py = b.y; py < endY; py++) {\n const rowOffset = py * targetWidth;\n const dy = Math.abs(py - fCenterY + centerOffsetY) * invHalfH;\n for (let px = b.x; px < endX; px++) {\n const idx = rowOffset + px;\n const dx = Math.abs(px - fCenterX + centerOffsetX) * invHalfW;\n const dist = dx > dy ? dx : dy;\n const strength = fallOff(dist);\n const maskVal = strength * 255 | 0;\n if (maskVal <= 0) continue;\n let weight = alpha;\n if (isOpaque) {\n weight = maskVal;\n } else if (maskVal !== 255) {\n weight = maskVal * alpha + 128 >> 8;\n }\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) continue;\n finalCol = (a << 24 | baseColor) >>> 0 as Color32;\n }\n data32[idx] = blendFn(finalCol, data32[idx] as Color32);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIElQaXhlbERhdGEsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzIH0gZnJvbSAnLi4vUmVjdC9nZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEoXG4gIHRhcmdldDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuICBicnVzaFdpZHRoOiBudW1iZXIsXG4gIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gIGFscGhhID0gMjU1LFxuICBmYWxsT2ZmOiAoZGlzdDogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBib3VuZHM/OiBSZWN0LFxuKTogdm9pZCB7XG4gIGNvbnN0IHRhcmdldFdpZHRoID0gdGFyZ2V0LndpZHRoXG4gIGNvbnN0IHRhcmdldEhlaWdodCA9IHRhcmdldC5oZWlnaHRcblxuICBjb25zdCBiID0gYm91bmRzID8/IGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgIGNlbnRlclgsXG4gICAgY2VudGVyWSxcbiAgICBicnVzaFdpZHRoLFxuICAgIGJydXNoSGVpZ2h0LFxuICAgIHRhcmdldFdpZHRoLFxuICAgIHRhcmdldEhlaWdodCxcbiAgKVxuXG4gIGlmIChiLncgPD0gMCB8fCBiLmggPD0gMCkgcmV0dXJuXG5cbiAgY29uc3QgZGF0YTMyID0gdGFyZ2V0LmRhdGEzMlxuICBjb25zdCBiYXNlQ29sb3IgPSBjb2xvciAmIDB4MDBmZmZmZmZcbiAgY29uc3QgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0XG4gIGNvbnN0IGlzT3BhcXVlID0gYWxwaGEgPT09IDI1NVxuXG4gIGNvbnN0IGludkhhbGZXID0gMSAvIChicnVzaFdpZHRoIC8gMilcbiAgY29uc3QgaW52SGFsZkggPSAxIC8gKGJydXNoSGVpZ2h0IC8gMilcblxuICAvLyBSZXN0b3JlIHRoZSBwaXhlbC1hcnQgY2VudGVyaW5nIGxvZ2ljXG4gIGNvbnN0IGNlbnRlck9mZnNldFggPSAoYnJ1c2hXaWR0aCAlIDIgPT09IDApID8gMC41IDogMFxuICBjb25zdCBjZW50ZXJPZmZzZXRZID0gKGJydXNoSGVpZ2h0ICUgMiA9PT0gMCkgPyAwLjUgOiAwXG4gIGNvbnN0IGZDZW50ZXJYID0gTWF0aC5mbG9vcihjZW50ZXJYKVxuICBjb25zdCBmQ2VudGVyWSA9IE1hdGguZmxvb3IoY2VudGVyWSlcblxuICBjb25zdCBlbmRYID0gYi54ICsgYi53XG4gIGNvbnN0IGVuZFkgPSBiLnkgKyBiLmhcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlXG5cbiAgZm9yIChsZXQgcHkgPSBiLnk7IHB5IDwgZW5kWTsgcHkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IHB5ICogdGFyZ2V0V2lkdGhcbiAgICBjb25zdCBkeSA9IE1hdGguYWJzKChweSAtIGZDZW50ZXJZKSArIGNlbnRlck9mZnNldFkpICogaW52SGFsZkhcblxuICAgIGZvciAobGV0IHB4ID0gYi54OyBweCA8IGVuZFg7IHB4KyspIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJvd09mZnNldCArIHB4XG5cbiAgICAgIGNvbnN0IGR4ID0gTWF0aC5hYnMoKHB4IC0gZkNlbnRlclgpICsgY2VudGVyT2Zmc2V0WCkgKiBpbnZIYWxmV1xuICAgICAgY29uc3QgZGlzdCA9IGR4ID4gZHkgPyBkeCA6IGR5XG5cbiAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZihkaXN0KVxuICAgICAgY29uc3QgbWFza1ZhbCA9IChzdHJlbmd0aCAqIDI1NSkgfCAwXG5cbiAgICAgIGlmIChtYXNrVmFsIDw9IDApIGNvbnRpbnVlXG5cbiAgICAgIGxldCB3ZWlnaHQgPSBhbHBoYVxuXG4gICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgd2VpZ2h0ID0gbWFza1ZhbFxuICAgICAgfSBlbHNlIGlmIChtYXNrVmFsICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gKG1hc2tWYWwgKiBhbHBoYSArIDEyOCkgPj4gOFxuICAgICAgfVxuXG4gICAgICBsZXQgZmluYWxDb2wgPSBjb2xvclxuXG4gICAgICBpZiAod2VpZ2h0IDwgMjU1KSB7XG4gICAgICAgIGNvbnN0IGEgPSAoYmFzZVNyY0FscGhhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG5cbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSBjb250aW51ZVxuXG4gICAgICAgIGZpbmFsQ29sID0gKChhIDw8IDI0KSB8IGJhc2VDb2xvcikgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkYXRhMzJbaWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRhdGEzMltpZHhdIGFzIENvbG9yMzIpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { applyRectBrushToPixelData } from '../../PixelData/applyRectBrushToPixelData';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nconst defaults = {\n applyRectBrushToPixelData,\n getRectBrushOrPencilBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyRectBrush = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyRectBrushToPixelData = defaults.applyRectBrushToPixelData,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectBrush(color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn?: BlendColor32) {\n const bounds = getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyRectBrushToPixelData(writer.target, color, centerX, centerY, brushWidth, brushHeight, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseVJlY3RCcnVzaCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEgPSBkZWZhdWx0cy5hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhLFxuICAgIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYm91bmRzT3V0OiBSZWN0ID0geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5UmVjdEJydXNoKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBjZW50ZXJYOiBudW1iZXIsXG4gICAgICBjZW50ZXJZOiBudW1iZXIsXG4gICAgICBicnVzaFdpZHRoOiBudW1iZXIsXG4gICAgICBicnVzaEhlaWdodDogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBmYWxsT2ZmOiAoZGlzdDogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICkge1xuXG4gICAgICBjb25zdCBib3VuZHMgPSBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyhcbiAgICAgICAgY2VudGVyWCxcbiAgICAgICAgY2VudGVyWSxcbiAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgIHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBib3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gYm91bmRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEoXG4gICAgICAgIHdyaXRlci50YXJnZXQsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaFdpZHRoLFxuICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGZhbGxPZmYsXG4gICAgICAgIGJsZW5kRm4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function getRectBrushOrPencilStrokeBounds(x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, result: Rect): Rect {\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const minX = Math.min(x0, x1) - halfW;\n const minY = Math.min(y0, y1) - halfH;\n const maxX = Math.max(x0, x1) + halfW;\n const maxY = Math.max(y0, y1) + halfH;\n result.x = Math.floor(minX);\n result.y = Math.floor(minY);\n result.w = Math.ceil(maxX - minX);\n result.h = Math.ceil(maxY - minY);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoXG4gIHgwOiBudW1iZXIsXG4gIHkwOiBudW1iZXIsXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIGJydXNoV2lkdGg6IG51bWJlcixcbiAgYnJ1c2hIZWlnaHQ6IG51bWJlcixcbiAgcmVzdWx0OiBSZWN0LFxuKTogUmVjdCB7XG4gIGNvbnN0IGhhbGZXID0gYnJ1c2hXaWR0aCAvIDJcbiAgY29uc3QgaGFsZkggPSBicnVzaEhlaWdodCAvIDJcblxuICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDAsIHgxKSAtIGhhbGZXXG4gIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MCwgeTEpIC0gaGFsZkhcbiAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgwLCB4MSkgKyBoYWxmV1xuICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTAsIHkxKSArIGhhbGZIXG5cbiAgcmVzdWx0LnggPSBNYXRoLmZsb29yKG1pblgpXG4gIHJlc3VsdC55ID0gTWF0aC5mbG9vcihtaW5ZKVxuICByZXN1bHQudyA9IE1hdGguY2VpbChtYXhYIC0gbWluWClcbiAgcmVzdWx0LmggPSBNYXRoLmNlaWwobWF4WSAtIG1pblkpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type AlphaMask, type HistoryMutator } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nimport { getRectBrushOrPencilStrokeBounds } from '../../Rect/getRectBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataAlphaMask,\n getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyRectBrushStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds = defaults.getRectBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const rectBrushBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectBrushStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getRectBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushWidth, brushHeight, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n const mask = new Uint8Array(bw * bh) as AlphaMask;\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const invHalfW = 1 / halfW;\n const invHalfH = 1 / halfH;\n\n // Restore the pixel-art centering logic\n const centerOffsetX = brushWidth % 2 === 0 ? 0.5 : 0;\n const centerOffsetY = brushHeight % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const {\n x: rbx,\n y: rby,\n w: rbw,\n h: rbh\n } = getRectBrushOrPencilBounds(px, py, brushWidth, brushHeight, targetWidth, targetHeight, rectBrushBounds);\n writer.accumulator.storeRegionBeforeState(rbx, rby, rbw, rbh);\n const startX = Math.max(bx, rbx);\n const startY = Math.max(by, rby);\n const endX = Math.min(bx + bw, rbx + rbw);\n const endY = Math.min(by + bh, rby + rbh);\n\n // Snapped origin for this specific point on the line\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = Math.abs(my - fPy + centerOffsetY) * invHalfH;\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = Math.abs(mx - fPx + centerOffsetX) * invHalfW;\n const maskIdx = maskRowOffset + (mx - bx);\n const dist = dx > dy ? dx : dy;\n const strength = fallOff!(dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n if (intensity > mask[maskIdx]) {\n mask[maskIdx] = intensity;\n }\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataAlphaMask(writer.target, color, mask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBbHBoYU1hc2ssXG4gIHR5cGUgQmxlbmRDb2xvcjMyLFxuICB0eXBlIENvbG9yMzIsXG4gIHR5cGUgQ29sb3JCbGVuZE9wdGlvbnMsXG4gIHR5cGUgSGlzdG9yeU11dGF0b3IsXG4gIHR5cGUgUmVjdCxcbn0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZm9yRWFjaExpbmVQb2ludCB9IGZyb20gJy4uLy4uL0FsZ29yaXRobS9mb3JFYWNoTGluZVBvaW50J1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi8uLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snXG5pbXBvcnQgeyBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZm9yRWFjaExpbmVQb2ludCxcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayxcbiAgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseVJlY3RCcnVzaFN0cm9rZSA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZvckVhY2hMaW5lUG9pbnQgPSBkZWZhdWx0cy5mb3JFYWNoTGluZVBvaW50LFxuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrLFxuICAgIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gICAgZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgPSBkZWZhdWx0cy5nZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbiAgfSA9IGRlcHNcblxuICBjb25zdCBzdHJva2VCb3VuZHNPdXQ6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IHJlY3RCcnVzaEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgYmxlbmRDb2xvclBpeGVsT3B0aW9uczogQ29sb3JCbGVuZE9wdGlvbnMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseVJlY3RCcnVzaFN0cm9rZShcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgeDA6IG51bWJlcixcbiAgICAgIHkwOiBudW1iZXIsXG4gICAgICB4MTogbnVtYmVyLFxuICAgICAgeTE6IG51bWJlcixcbiAgICAgIGJydXNoV2lkdGg6IG51bWJlcixcbiAgICAgIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gICAgICBhbHBoYSA9IDI1NSxcbiAgICAgIGZhbGxPZmY6IChkaXN0OiBudW1iZXIpID0+IG51bWJlcixcbiAgICAgIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgICkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4OiBieCxcbiAgICAgICAgeTogYnksXG4gICAgICAgIHc6IGJ3LFxuICAgICAgICBoOiBiaCxcbiAgICAgIH0gPSBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyhcbiAgICAgICAgeDAsXG4gICAgICAgIHkwLFxuICAgICAgICB4MSxcbiAgICAgICAgeTEsXG4gICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgIGJydXNoSGVpZ2h0LFxuICAgICAgICBzdHJva2VCb3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGlmIChidyA8PSAwIHx8IGJoIDw9IDApIHJldHVyblxuXG4gICAgICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkoYncgKiBiaCkgYXMgQWxwaGFNYXNrXG5cbiAgICAgIGNvbnN0IGhhbGZXID0gYnJ1c2hXaWR0aCAvIDJcbiAgICAgIGNvbnN0IGhhbGZIID0gYnJ1c2hIZWlnaHQgLyAyXG4gICAgICBjb25zdCBpbnZIYWxmVyA9IDEgLyBoYWxmV1xuICAgICAgY29uc3QgaW52SGFsZkggPSAxIC8gaGFsZkhcblxuICAgICAgLy8gUmVzdG9yZSB0aGUgcGl4ZWwtYXJ0IGNlbnRlcmluZyBsb2dpY1xuICAgICAgY29uc3QgY2VudGVyT2Zmc2V0WCA9IChicnVzaFdpZHRoICUgMiA9PT0gMCkgPyAwLjUgOiAwXG4gICAgICBjb25zdCBjZW50ZXJPZmZzZXRZID0gKGJydXNoSGVpZ2h0ICUgMiA9PT0gMCkgPyAwLjUgOiAwXG5cbiAgICAgIGNvbnN0IHRhcmdldFdpZHRoID0gd3JpdGVyLnRhcmdldC53aWR0aFxuICAgICAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gd3JpdGVyLnRhcmdldC5oZWlnaHRcblxuICAgICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogcmJ4LFxuICAgICAgICAgIHk6IHJieSxcbiAgICAgICAgICB3OiByYncsXG4gICAgICAgICAgaDogcmJoLFxuICAgICAgICB9ID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgICAgICAgcHgsXG4gICAgICAgICAgcHksXG4gICAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgcmVjdEJydXNoQm91bmRzLFxuICAgICAgICApXG5cbiAgICAgICAgd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoXG4gICAgICAgICAgcmJ4LFxuICAgICAgICAgIHJieSxcbiAgICAgICAgICByYncsXG4gICAgICAgICAgcmJoLFxuICAgICAgICApXG5cbiAgICAgICAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoYngsIHJieClcbiAgICAgICAgY29uc3Qgc3RhcnRZID0gTWF0aC5tYXgoYnksIHJieSlcbiAgICAgICAgY29uc3QgZW5kWCA9IE1hdGgubWluKGJ4ICsgYncsIHJieCArIHJidylcbiAgICAgICAgY29uc3QgZW5kWSA9IE1hdGgubWluKGJ5ICsgYmgsIHJieSArIHJiaClcblxuICAgICAgICAvLyBTbmFwcGVkIG9yaWdpbiBmb3IgdGhpcyBzcGVjaWZpYyBwb2ludCBvbiB0aGUgbGluZVxuICAgICAgICBjb25zdCBmUHggPSBNYXRoLmZsb29yKHB4KVxuICAgICAgICBjb25zdCBmUHkgPSBNYXRoLmZsb29yKHB5KVxuXG4gICAgICAgIGZvciAobGV0IG15ID0gc3RhcnRZOyBteSA8IGVuZFk7IG15KyspIHtcbiAgICAgICAgICBjb25zdCBkeSA9IE1hdGguYWJzKChteSAtIGZQeSkgKyBjZW50ZXJPZmZzZXRZKSAqIGludkhhbGZIXG4gICAgICAgICAgY29uc3QgbWFza1Jvd09mZnNldCA9IChteSAtIGJ5KSAqIGJ3XG5cbiAgICAgICAgICBmb3IgKGxldCBteCA9IHN0YXJ0WDsgbXggPCBlbmRYOyBteCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkeCA9IE1hdGguYWJzKChteCAtIGZQeCkgKyBjZW50ZXJPZmZzZXRYKSAqIGludkhhbGZXXG4gICAgICAgICAgICBjb25zdCBtYXNrSWR4ID0gbWFza1Jvd09mZnNldCArIChteCAtIGJ4KVxuXG4gICAgICAgICAgICBjb25zdCBkaXN0ID0gZHggPiBkeSA/IGR4IDogZHlcbiAgICAgICAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZiEoZGlzdClcblxuICAgICAgICAgICAgaWYgKHN0cmVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBpbnRlbnNpdHkgPSAoc3RyZW5ndGggKiAyNTUpIHwgMFxuXG4gICAgICAgICAgICAgIGlmIChpbnRlbnNpdHkgPiBtYXNrW21hc2tJZHhdKSB7XG4gICAgICAgICAgICAgICAgbWFza1ttYXNrSWR4XSA9IGludGVuc2l0eVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmJsZW5kRm4gPSBibGVuZEZuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmFscGhhID0gYWxwaGFcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMueCA9IGJ4XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnkgPSBieVxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy53ID0gYndcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuaCA9IGJoXG5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2soXG4gICAgICAgIHdyaXRlci50YXJnZXQsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBtYXNrLFxuICAgICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { applyRectBrushToPixelData } from '../../PixelData/applyRectBrushToPixelData';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nconst defaults = {\n applyRectBrushToPixelData,\n getRectBrushOrPencilBounds,\n fallOff: () => 1\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyRectPencil = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyRectBrushToPixelData = defaults.applyRectBrushToPixelData,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n fallOff = defaults.fallOff\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectPencil(color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, blendFn?: BlendColor32) {\n const bounds = getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyRectBrushToPixelData(writer.target, color, centerX, centerY, brushWidth, brushHeight, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICBmYWxsT2ZmOiAoKSA9PiAxLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseVJlY3RQZW5jaWwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhID0gZGVmYXVsdHMuYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSxcbiAgICBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyA9IGRlZmF1bHRzLmdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICAgIGZhbGxPZmYgPSBkZWZhdWx0cy5mYWxsT2ZmXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYm91bmRzT3V0OiBSZWN0ID0geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5UmVjdFBlbmNpbChcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgY2VudGVyWDogbnVtYmVyLFxuICAgICAgY2VudGVyWTogbnVtYmVyLFxuICAgICAgYnJ1c2hXaWR0aDogbnVtYmVyLFxuICAgICAgYnJ1c2hIZWlnaHQ6IG51bWJlcixcbiAgICAgIGFscGhhID0gMjU1LFxuICAgICAgYmxlbmRGbj86IEJsZW5kQ29sb3IzMixcbiAgICApIHtcblxuICAgICAgY29uc3QgYm91bmRzID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgIGJydXNoSGVpZ2h0LFxuICAgICAgICB3cml0ZXIudGFyZ2V0LndpZHRoLFxuICAgICAgICB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgICAgYm91bmRzT3V0LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHgsIHksIHcsIGggfSA9IGJvdW5kc1xuXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuXG4gICAgICBhcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhKFxuICAgICAgICB3cml0ZXIudGFyZ2V0LFxuICAgICAgICBjb2xvcixcbiAgICAgICAgY2VudGVyWCxcbiAgICAgICAgY2VudGVyWSxcbiAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgIGFscGhhLFxuICAgICAgICBmYWxsT2ZmLFxuICAgICAgICBibGVuZEZuLFxuICAgICAgICBib3VuZHMsXG4gICAgICApXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type BinaryMask, type HistoryMutator } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nimport { getRectBrushOrPencilStrokeBounds } from '../../Rect/getRectBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds,\n blendColorPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyRectPencilStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds = defaults.getRectBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const rectPencilBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectPencilStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getRectBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushWidth, brushHeight, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n const mask = new Uint8Array(bw * bh) as BinaryMask;\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const centerOffset = brushWidth % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const {\n x: rbx,\n y: rby,\n w: rbw,\n h: rbh\n } = getRectBrushOrPencilBounds(px, py, brushWidth, brushHeight, targetWidth, targetHeight, rectPencilBounds);\n writer.accumulator.storeRegionBeforeState(rbx, rby, rbw, rbh);\n const startX = Math.max(bx, rbx);\n const startY = Math.max(by, rby);\n const endX = Math.min(bx + bw, rbx + rbw);\n const endY = Math.min(by + bh, rby + rbh);\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = Math.abs(my - fPy + centerOffset);\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = Math.abs(mx - fPx + centerOffset);\n const maskIdx = maskRowOffset + (mx - bx);\n if (dx <= halfW && dy <= halfH) {\n mask[maskIdx] = 1;\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataBinaryMask(writer.target, color, mask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBCaW5hcnlNYXNrLFxuICB0eXBlIEJsZW5kQ29sb3IzMixcbiAgdHlwZSBDb2xvcjMyLFxuICB0eXBlIENvbG9yQmxlbmRPcHRpb25zLFxuICB0eXBlIEhpc3RvcnlNdXRhdG9yLFxuICB0eXBlIFJlY3QsXG59IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZvckVhY2hMaW5lUG9pbnQgfSBmcm9tICcuLi8uLi9BbGdvcml0aG0vZm9yRWFjaExpbmVQb2ludCdcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snXG5pbXBvcnQgeyBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZm9yRWFjaExpbmVQb2ludCxcbiAgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxuICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayxcbn1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5UmVjdFBlbmNpbFN0cm9rZSA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZvckVhY2hMaW5lUG9pbnQgPSBkZWZhdWx0cy5mb3JFYWNoTGluZVBvaW50LFxuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gICAgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgPSBkZWZhdWx0cy5nZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgICBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyA9IGRlZmF1bHRzLmdldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxuICB9ID0gZGVwc1xuXG4gIGNvbnN0IHN0cm9rZUJvdW5kc091dDogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgcmVjdFBlbmNpbEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgYmxlbmRDb2xvclBpeGVsT3B0aW9uczogQ29sb3JCbGVuZE9wdGlvbnMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseVJlY3RQZW5jaWxTdHJva2UoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHgwOiBudW1iZXIsXG4gICAgICB5MDogbnVtYmVyLFxuICAgICAgeDE6IG51bWJlcixcbiAgICAgIHkxOiBudW1iZXIsXG4gICAgICBicnVzaFdpZHRoOiBudW1iZXIsXG4gICAgICBicnVzaEhlaWdodDogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBibGVuZEZuOiBCbGVuZENvbG9yMzIgPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeDogYngsXG4gICAgICAgIHk6IGJ5LFxuICAgICAgICB3OiBidyxcbiAgICAgICAgaDogYmgsXG4gICAgICB9ID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoXG4gICAgICAgIHgwLFxuICAgICAgICB5MCxcbiAgICAgICAgeDEsXG4gICAgICAgIHkxLFxuICAgICAgICBicnVzaFdpZHRoLFxuICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgc3Ryb2tlQm91bmRzT3V0LFxuICAgICAgKVxuXG4gICAgICBpZiAoYncgPD0gMCB8fCBiaCA8PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGJ3ICogYmgpIGFzIEJpbmFyeU1hc2tcblxuICAgICAgY29uc3QgaGFsZlcgPSBicnVzaFdpZHRoIC8gMlxuICAgICAgY29uc3QgaGFsZkggPSBicnVzaEhlaWdodCAvIDJcbiAgICAgIGNvbnN0IGNlbnRlck9mZnNldCA9IChicnVzaFdpZHRoICUgMiA9PT0gMCkgPyAwLjUgOiAwXG5cbiAgICAgIGNvbnN0IHRhcmdldFdpZHRoID0gd3JpdGVyLnRhcmdldC53aWR0aFxuICAgICAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gd3JpdGVyLnRhcmdldC5oZWlnaHRcblxuICAgICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogcmJ4LFxuICAgICAgICAgIHk6IHJieSxcbiAgICAgICAgICB3OiByYncsXG4gICAgICAgICAgaDogcmJoLFxuICAgICAgICB9ID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgICAgICAgcHgsXG4gICAgICAgICAgcHksXG4gICAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgcmVjdFBlbmNpbEJvdW5kcyxcbiAgICAgICAgKVxuXG4gICAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKFxuICAgICAgICAgIHJieCxcbiAgICAgICAgICByYnksXG4gICAgICAgICAgcmJ3LFxuICAgICAgICAgIHJiaCxcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWF4KGJ4LCByYngpXG4gICAgICAgIGNvbnN0IHN0YXJ0WSA9IE1hdGgubWF4KGJ5LCByYnkpXG4gICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLm1pbihieCArIGJ3LCByYnggKyByYncpXG4gICAgICAgIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihieSArIGJoLCByYnkgKyByYmgpXG5cbiAgICAgICAgY29uc3QgZlB4ID0gTWF0aC5mbG9vcihweClcbiAgICAgICAgY29uc3QgZlB5ID0gTWF0aC5mbG9vcihweSlcblxuICAgICAgICBmb3IgKGxldCBteSA9IHN0YXJ0WTsgbXkgPCBlbmRZOyBteSsrKSB7XG4gICAgICAgICAgY29uc3QgZHkgPSBNYXRoLmFicygobXkgLSBmUHkpICsgY2VudGVyT2Zmc2V0KVxuICAgICAgICAgIGNvbnN0IG1hc2tSb3dPZmZzZXQgPSAobXkgLSBieSkgKiBid1xuXG4gICAgICAgICAgZm9yIChsZXQgbXggPSBzdGFydFg7IG14IDwgZW5kWDsgbXgrKykge1xuICAgICAgICAgICAgY29uc3QgZHggPSBNYXRoLmFicygobXggLSBmUHgpICsgY2VudGVyT2Zmc2V0KVxuICAgICAgICAgICAgY29uc3QgbWFza0lkeCA9IG1hc2tSb3dPZmZzZXQgKyAobXggLSBieClcblxuICAgICAgICAgICAgaWYgKGR4IDw9IGhhbGZXICYmIGR5IDw9IGhhbGZIKSB7XG4gICAgICAgICAgICAgIG1hc2tbbWFza0lkeF0gPSAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmJsZW5kRm4gPSBibGVuZEZuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmFscGhhID0gYWxwaGFcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMueCA9IGJ4XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnkgPSBieVxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy53ID0gYndcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuaCA9IGJoXG5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlci50YXJnZXQsIGNvbG9yLCBtYXNrLCBibGVuZENvbG9yUGl4ZWxPcHRpb25zKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendColorPixelData(dst: IPixelData, color: Color32, opts: ColorBlendOptions = {}) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect\n } = opts;\n if (globalAlpha === 0) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n\n // Clipping\n let x = targetX,\n y = targetY,\n w = width,\n h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // Single-color fills can pre-calculate the source color once\n let finalSrcColor = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return;\n finalSrcColor = (color & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const dst32 = dst.data32;\n const dw = dst.width;\n let dIdx = y * dw + x | 0;\n const dStride = dw - actualW | 0;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = blendFn(finalSrcColor, dst32[dIdx] as Color32);\n dIdx++;\n }\n dIdx += dStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIENvbG9yQmxlbmRPcHRpb25zLCB0eXBlIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kQ29sb3JQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIG9wdHM6IENvbG9yQmxlbmRPcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVyblxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2VcbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVyblxuXG4gIC8vIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WCwgeSA9IHRhcmdldFksIHcgPSB3aWR0aCwgaCA9IGhlaWdodFxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIFNpbmdsZS1jb2xvciBmaWxscyBjYW4gcHJlLWNhbGN1bGF0ZSB0aGUgc291cmNlIGNvbG9yIG9uY2VcbiAgbGV0IGZpbmFsU3JjQ29sb3IgPSBjb2xvclxuICBpZiAoZ2xvYmFsQWxwaGEgPCAyNTUpIHtcbiAgICBjb25zdCBhID0gKGJhc2VTcmNBbHBoYSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm5cbiAgICBmaW5hbFNyY0NvbG9yID0gKChjb2xvciAmIDB4MDBmZmZmZmYpIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gIH1cblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxTcmNDb2xvciwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcbiAgICAgIGRJZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData';\nconst defaults = {\n blendColorPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorBlendColor = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n blendColorPixelData = defaults.blendColorPixelData\n } = deps;\n return {\n blendColor(color: Color32, opts: ColorBlendOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n blendColorPixelData(writer.target, color, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBDb2xvckJsZW5kT3B0aW9ucywgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHsgYmxlbmRDb2xvclBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRDb2xvciA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kQ29sb3JQaXhlbERhdGEgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYmxlbmRDb2xvcihcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgb3B0czogQ29sb3JCbGVuZE9wdGlvbnMgPSB7fSxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gd3JpdGVyLnRhcmdldC53aWR0aCxcbiAgICAgICAgaCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgfSA9IG9wdHNcbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBibGVuZENvbG9yUGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIGNvbG9yLCBvcHRzKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../../_types';\nimport { overwriteFast } from '../../BlendModes/blend-modes-fast';\nexport function mutatorBlendPixel(writer: PixelWriter<any>) {\n return {\n blendPixel(x: number, y: number, color: Color32, alpha: number = 255, blendFn: BlendColor32 = overwriteFast) {\n let target = writer.target;\n let width = target.width;\n let height = target.height;\n if (x < 0 || x >= width || y < 0 || y >= height) return;\n writer.accumulator.storeTileBeforeState(x, y);\n let index = y * width + x;\n let bg = target.data32[index] as Color32;\n let finalColor = color;\n if (alpha < 255) {\n let baseSrcAlpha = color >>> 24;\n let finalAlpha = baseSrcAlpha * alpha + 128 >> 8;\n finalColor = (color & 0x00ffffff | finalAlpha << 24) >>> 0 as Color32;\n }\n target.data32[index] = blendFn(finalColor, bg);\n }\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBvdmVyd3JpdGVGYXN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1mYXN0J1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuZXhwb3J0IGZ1bmN0aW9uIG11dGF0b3JCbGVuZFBpeGVsKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55Pikge1xuICByZXR1cm4ge1xuICAgIGJsZW5kUGl4ZWwoXG4gICAgICB4OiBudW1iZXIsXG4gICAgICB5OiBudW1iZXIsXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIGFscGhhOiBudW1iZXIgPSAyNTUsXG4gICAgICBibGVuZEZuOiBCbGVuZENvbG9yMzIgPSBvdmVyd3JpdGVGYXN0LFxuICAgICkge1xuICAgICAgbGV0IHRhcmdldCA9IHdyaXRlci50YXJnZXRcbiAgICAgIGxldCB3aWR0aCA9IHRhcmdldC53aWR0aFxuICAgICAgbGV0IGhlaWdodCA9IHRhcmdldC5oZWlnaHRcblxuICAgICAgaWYgKHggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA8IDAgfHwgeSA+PSBoZWlnaHQpIHJldHVyblxuXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVUaWxlQmVmb3JlU3RhdGUoeCwgeSlcblxuICAgICAgbGV0IGluZGV4ID0geSAqIHdpZHRoICsgeFxuICAgICAgbGV0IGJnID0gdGFyZ2V0LmRhdGEzMltpbmRleF0gYXMgQ29sb3IzMlxuXG4gICAgICBsZXQgZmluYWxDb2xvciA9IGNvbG9yXG5cbiAgICAgIGlmIChhbHBoYSA8IDI1NSkge1xuICAgICAgICBsZXQgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0XG4gICAgICAgIGxldCBmaW5hbEFscGhhID0gKGJhc2VTcmNBbHBoYSAqIGFscGhhICsgMTI4KSA+PiA4XG5cbiAgICAgICAgZmluYWxDb2xvciA9ICgoKGNvbG9yICYgMHgwMGZmZmZmZikgfCAoZmluYWxBbHBoYSA8PCAyNCkpID4+PiAwKSBhcyBDb2xvcjMyXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5kYXRhMzJbaW5kZXhdID0gYmxlbmRGbihmaW5hbENvbG9yLCBiZylcbiAgICB9LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blits source PixelData into a destination PixelData using 32-bit integer bitwise blending.\n * This function bypasses standard ImageData limitations by operating directly on\n * Uint32Array views. It supports various blend modes, binary/alpha masking, and\n * automatic clipping of both source and destination bounds.\n * @example\n *\n * const dst = new PixelData(ctx.getImageData(0,0,100,100))\n * blendImageData32(dst, sprite, {\n * blendFn: COLOR_32_BLEND_MODES.multiply,\n * mask: brushMask,\n * maskType: MaskType.ALPHA\n * });\n */\nexport function blendPixelData(dst: IPixelData, src: IPixelData, opts: PixelBlendOptions) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n const dst32 = dst.data32;\n const src32 = src.data32;\n const dw = dst.width;\n const sw = src.width;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (!isOpaque) {\n const a = srcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIElQaXhlbERhdGEsIHR5cGUgUGl4ZWxCbGVuZE9wdGlvbnMgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuLyoqXG4gKiBCbGl0cyBzb3VyY2UgUGl4ZWxEYXRhIGludG8gYSBkZXN0aW5hdGlvbiBQaXhlbERhdGEgdXNpbmcgMzItYml0IGludGVnZXIgYml0d2lzZSBibGVuZGluZy5cbiAqIFRoaXMgZnVuY3Rpb24gYnlwYXNzZXMgc3RhbmRhcmQgSW1hZ2VEYXRhIGxpbWl0YXRpb25zIGJ5IG9wZXJhdGluZyBkaXJlY3RseSBvblxuICogVWludDMyQXJyYXkgdmlld3MuIEl0IHN1cHBvcnRzIHZhcmlvdXMgYmxlbmQgbW9kZXMsIGJpbmFyeS9hbHBoYSBtYXNraW5nLCBhbmRcbiAqIGF1dG9tYXRpYyBjbGlwcGluZyBvZiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYm91bmRzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkc3QgPSBuZXcgUGl4ZWxEYXRhKGN0eC5nZXRJbWFnZURhdGEoMCwwLDEwMCwxMDApKVxuICogYmxlbmRJbWFnZURhdGEzMihkc3QsIHNwcml0ZSwge1xuICogICBibGVuZEZuOiBDT0xPUl8zMl9CTEVORF9NT0RFUy5tdWx0aXBseSxcbiAqICAgbWFzazogYnJ1c2hNYXNrLFxuICogICBtYXNrVHlwZTogTWFza1R5cGUuQUxQSEFcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgc3JjOiBJUGl4ZWxEYXRhLFxuICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyxcbikge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgc3g6IHNvdXJjZVggPSAwLFxuICAgIHN5OiBzb3VyY2VZID0gMCxcbiAgICB3OiB3aWR0aCA9IHNyYy53aWR0aCxcbiAgICBoOiBoZWlnaHQgPSBzcmMuaGVpZ2h0LFxuICAgIGFscGhhOiBnbG9iYWxBbHBoYSA9IDI1NSxcbiAgICBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm5cblxuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCBzeCA9IHNvdXJjZVhcbiAgbGV0IHN5ID0gc291cmNlWVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3hcbiAgICB3ICs9IHN4XG4gICAgc3ggPSAwXG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3lcbiAgICBoICs9IHN5XG4gICAgc3kgPSAwXG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyYy53aWR0aCAtIHN4KVxuICBoID0gTWF0aC5taW4oaCwgc3JjLmhlaWdodCAtIHN5KVxuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG5cbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGxldCBzSWR4ID0gKHN5ICogc3cgKyBzeCkgfCAwXG5cbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBzU3RyaWRlID0gKHN3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IGlzT3BhcXVlID0gZ2xvYmFsQWxwaGEgPT09IDI1NVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IGJsZW5kRm4uaXNPdmVyd3JpdGVcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IChzcmNDb2wgPj4+IDI0KVxuXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sXG4gICAgICBpZiAoIWlzT3BhcXVlKSB7XG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG4gICAgICBkSWR4KytcbiAgICAgIHNJZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBzSWR4ICs9IHNTdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { blendPixelData } from '../../PixelData/blendPixelData';\nconst defaults = {\n blendPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorBlendPixelData = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelData = defaults.blendPixelData\n } = deps;\n return {\n blendPixelData(src: IPixelData, opts: PixelBlendOptions) {\n const {\n x = 0,\n y = 0,\n w = src.width,\n h = src.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n blendPixelData(writer.target, src, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgSVBpeGVsRGF0YSwgUGl4ZWxCbGVuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBibGVuZFBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRQaXhlbERhdGEgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZFBpeGVsRGF0YSA9IGRlZmF1bHRzLmJsZW5kUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYmxlbmRQaXhlbERhdGEoXG4gICAgICBzcmM6IElQaXhlbERhdGEsXG4gICAgICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gc3JjLndpZHRoLFxuICAgICAgICBoID0gc3JjLmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuXG4gICAgICBibGVuZFBpeGVsRGF0YSh3cml0ZXIudGFyZ2V0LCBzcmMsIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cblxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link PixelData} buffer with a solid color.\n *\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param rect - A {@link BinaryMaskRect} defining the area to fill.\n */\nexport function fillPixelData(dst: IPixelData, color: Color32, rect?: Partial<BinaryMaskRect>): void;\n/**\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param x - Starting horizontal coordinate.\n * @param y - Starting vertical coordinate.\n * @param w - Width of the fill area.\n * @param h - Height of the fill area.\n * @param mask - A {@link BinaryMaskRect} defining the area to fill\n */\nexport function fillPixelData(dst: IPixelData, color: Color32, x: number, y: number, w: number, h: number, mask?: BinaryMask): void;\nexport function fillPixelData(dst: IPixelData, color: Color32, _x?: Partial<BinaryMaskRect> | number, _y?: number, _w?: number, _h?: number, _mask?: BinaryMask): void {\n let x: number;\n let y: number;\n let w: number;\n let h: number;\n let mask: BinaryMask | undefined;\n if (typeof _x === 'object') {\n x = _x.x ?? 0;\n y = _x.y ?? 0;\n w = _x.w ?? dst.width;\n h = _x.h ?? dst.height;\n mask = _x.mask;\n } else if (typeof _x === 'number') {\n x = _x;\n y = _y!;\n w = _w!;\n h = _h!;\n mask = _mask;\n } else {\n x = 0;\n y = 0;\n w = dst.width;\n h = dst.height;\n }\n const clip = resolveRectClipping(x, y, w, h, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return;\n\n // Use the clipped values\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data32;\n const dw = dst.width;\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (actualW === dw && actualH === dst.height && finalX === 0 && finalY === 0) {\n dst32.fill(color);\n return;\n }\n if (mask) {\n for (let iy = 0; iy < actualH; iy++) {\n const currentY = finalY + iy;\n const maskY = currentY - y;\n const maskOffset = maskY * w;\n for (let ix = 0; ix < actualW; ix++) {\n const currentX = finalX + ix;\n const maskX = currentX - x;\n const maskIndex = maskOffset + maskX;\n const isMasked = mask[maskIndex];\n if (isMasked) {\n const dstIndex = currentY * dw + currentX;\n dst32[dstIndex] = color;\n }\n }\n }\n } else {\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < actualH; iy++) {\n const start = (finalY + iy) * dw + finalX;\n const end = start + actualW;\n dst32.fill(color, start, end);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBCaW5hcnlNYXNrUmVjdCwgQ29sb3IzMiwgSVBpeGVsRGF0YSB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IG1ha2VDbGlwcGVkUmVjdCwgcmVzb2x2ZVJlY3RDbGlwcGluZyB9IGZyb20gJy4uL0ludGVybmFsL3Jlc29sdmVDbGlwcGluZydcbmltcG9ydCB0eXBlIHsgUGl4ZWxEYXRhIH0gZnJvbSAnLi9QaXhlbERhdGEnXG5cbmNvbnN0IFNDUkFUQ0hfUkVDVCA9IG1ha2VDbGlwcGVkUmVjdCgpXG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb3IgdGhlIHtAbGluayBQaXhlbERhdGF9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQge0BsaW5rIFBpeGVsRGF0YX0gdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIHtAbGluayBDb2xvcjMyfSB2YWx1ZSB0byBhcHBseS5cbiAqIEBwYXJhbSByZWN0IC0gQSB7QGxpbmsgQmluYXJ5TWFza1JlY3R9IGRlZmluaW5nIHRoZSBhcmVhIHRvIGZpbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICByZWN0PzogUGFydGlhbDxCaW5hcnlNYXNrUmVjdD4sXG4pOiB2b2lkXG4vKipcbiAqIEBwYXJhbSBkc3QgLSBUaGUgdGFyZ2V0IHtAbGluayBQaXhlbERhdGF9IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSB7QGxpbmsgQ29sb3IzMn0gdmFsdWUgdG8gYXBwbHkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gV2lkdGggb2YgdGhlIGZpbGwgYXJlYS5cbiAqIEBwYXJhbSBoIC0gSGVpZ2h0IG9mIHRoZSBmaWxsIGFyZWEuXG4gKiBAcGFyYW0gbWFzayAtIEEge0BsaW5rIEJpbmFyeU1hc2tSZWN0fSBkZWZpbmluZyB0aGUgYXJlYSB0byBmaWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4gIG1hc2s/OiBCaW5hcnlNYXNrLFxuKTogdm9pZFxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIF94PzogUGFydGlhbDxCaW5hcnlNYXNrUmVjdD4gfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4gIF9tYXNrPzogQmluYXJ5TWFzayxcbik6IHZvaWQge1xuICBsZXQgeDogbnVtYmVyXG4gIGxldCB5OiBudW1iZXJcbiAgbGV0IHc6IG51bWJlclxuICBsZXQgaDogbnVtYmVyXG4gIGxldCBtYXNrOiBCaW5hcnlNYXNrIHwgdW5kZWZpbmVkXG5cbiAgaWYgKHR5cGVvZiBfeCA9PT0gJ29iamVjdCcpIHtcbiAgICB4ID0gX3gueCA/PyAwXG4gICAgeSA9IF94LnkgPz8gMFxuICAgIHcgPSBfeC53ID8/IGRzdC53aWR0aFxuICAgIGggPSBfeC5oID8/IGRzdC5oZWlnaHRcbiAgICBtYXNrID0gX3gubWFza1xuXG4gIH0gZWxzZSBpZiAodHlwZW9mIF94ID09PSAnbnVtYmVyJykge1xuICAgIHggPSBfeFxuICAgIHkgPSBfeSFcbiAgICB3ID0gX3chXG4gICAgaCA9IF9oIVxuICAgIG1hc2sgPSBfbWFza1xuICB9IGVsc2Uge1xuICAgIHggPSAwXG4gICAgeSA9IDBcbiAgICB3ID0gZHN0LndpZHRoXG4gICAgaCA9IGRzdC5oZWlnaHRcbiAgfVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlUmVjdENsaXBwaW5nKHgsIHksIHcsIGgsIGRzdC53aWR0aCwgZHN0LmhlaWdodCwgU0NSQVRDSF9SRUNUKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuXG5cbiAgLy8gVXNlIHRoZSBjbGlwcGVkIHZhbHVlc1xuICBjb25zdCB7XG4gICAgeDogZmluYWxYLFxuICAgIHk6IGZpbmFsWSxcbiAgICB3OiBhY3R1YWxXLFxuICAgIGg6IGFjdHVhbEgsXG4gIH0gPSBjbGlwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG5cbiAgLy8gT3B0aW1pemF0aW9uOiBJZiBmaWxsaW5nIHRoZSBlbnRpcmUgYnVmZmVyLCB1c2UgdGhlIG5hdGl2ZSAuZmlsbCgpXG4gIGlmIChhY3R1YWxXID09PSBkdyAmJiBhY3R1YWxIID09PSBkc3QuaGVpZ2h0ICYmIGZpbmFsWCA9PT0gMCAmJiBmaW5hbFkgPT09IDApIHtcbiAgICBkc3QzMi5maWxsKGNvbG9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG1hc2spIHtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgY29uc3QgY3VycmVudFkgPSBmaW5hbFkgKyBpeVxuICAgICAgY29uc3QgbWFza1kgPSBjdXJyZW50WSAtIHlcbiAgICAgIGNvbnN0IG1hc2tPZmZzZXQgPSBtYXNrWSAqIHdcblxuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgY29uc3QgY3VycmVudFggPSBmaW5hbFggKyBpeFxuICAgICAgICBjb25zdCBtYXNrWCA9IGN1cnJlbnRYIC0geFxuICAgICAgICBjb25zdCBtYXNrSW5kZXggPSBtYXNrT2Zmc2V0ICsgbWFza1hcbiAgICAgICAgY29uc3QgaXNNYXNrZWQgPSBtYXNrW21hc2tJbmRleF1cblxuICAgICAgICBpZiAoaXNNYXNrZWQpIHtcbiAgICAgICAgICBjb25zdCBkc3RJbmRleCA9IGN1cnJlbnRZICogZHcgKyBjdXJyZW50WFxuICAgICAgICAgIGRzdDMyW2RzdEluZGV4XSA9IGNvbG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUm93LWJ5LXJvdyBmaWxsIGZvciBwYXJ0aWFsIHJlY3RhbmdsZXNcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgY29uc3Qgc3RhcnQgPSAoZmluYWxZICsgaXkpICogZHcgKyBmaW5hbFhcbiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgYWN0dWFsV1xuICAgICAgZHN0MzIuZmlsbChjb2xvciwgc3RhcnQsIGVuZClcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32, HistoryMutator } from '../../_types';\nimport { fillPixelData } from '../../PixelData/fillPixelData';\nconst defaults = {\n fillPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorClear = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n clear(rect: Partial<BinaryMaskRect> = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n mask = undefined\n } = rect;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n fillPixelData(writer.target, 0 as Color32, x, y, w, h, mask);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrUmVjdCwgQ29sb3IzMiwgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBmaWxsUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGEnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHsgZmlsbFBpeGVsRGF0YSB9XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuZXhwb3J0IGNvbnN0IG11dGF0b3JDbGVhciA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZpbGxQaXhlbERhdGEgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgY2xlYXIoXG4gICAgICByZWN0OiBQYXJ0aWFsPEJpbmFyeU1hc2tSZWN0PiA9IHt9LFxuICAgICkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHcgPSB3cml0ZXIudGFyZ2V0LndpZHRoLFxuICAgICAgICBoID0gd3JpdGVyLnRhcmdldC5oZWlnaHQsXG4gICAgICAgIG1hc2sgPSB1bmRlZmluZWQsXG4gICAgICB9ID0gcmVjdFxuICAgICAgd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaClcbiAgICAgIGZpbGxQaXhlbERhdGEod3JpdGVyLnRhcmdldCwgMCBhcyBDb2xvcjMyLCB4LCB5LCB3LCBoLCBtYXNrKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { fillPixelData } from '../../PixelData/fillPixelData';\nconst defaults = {\n fillPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorFill = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n fill(color: Color32, rect: Partial<BinaryMaskRect> = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n mask = undefined\n } = rect;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n fillPixelData(writer.target, color, x, y, w, h, mask);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrUmVjdCwgQ29sb3IzMiwgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBmaWxsUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGEnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHsgZmlsbFBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cbmV4cG9ydCBjb25zdCBtdXRhdG9yRmlsbCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZpbGxQaXhlbERhdGEgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgZmlsbChcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgcmVjdDogUGFydGlhbDxCaW5hcnlNYXNrUmVjdD4gPSB7fSxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gd3JpdGVyLnRhcmdldC53aWR0aCxcbiAgICAgICAgaCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBtYXNrID0gdW5kZWZpbmVkLFxuICAgICAgfSA9IHJlY3RcbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBmaWxsUGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIGNvbG9yLCB4LCB5LCB3LCBoLCBtYXNrKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\nexport function invertPixelData(pixelData: IPixelData, opts: PixelMutateOptions = {}): void {\n const dst = pixelData;\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = pixelData.width,\n h: height = pixelData.height,\n mask,\n mw,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n const clip = resolveRectClipping(targetX, targetY, width, height, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return;\n const {\n x,\n y,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mw ?? width;\n const dx = x - targetX;\n const dy = y - targetY;\n let dIdx = y * dw + x;\n let mIdx = (my + dy) * mPitch + (mx + dx);\n const dStride = dw - actualW;\n const mStride = mPitch - actualW;\n\n // Optimization: Split loops to avoid checking `if (mask)` for every pixel.\n if (mask) {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = mask[mIdx];\n const isHit = invertMask ? mVal === 0 : mVal === 1;\n if (isHit) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha (the top 8 bits)\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n dIdx++;\n }\n dIdx += dStride;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFBpeGVsTXV0YXRlT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IG1ha2VDbGlwcGVkUmVjdCwgcmVzb2x2ZVJlY3RDbGlwcGluZyB9IGZyb20gJy4uL0ludGVybmFsL3Jlc29sdmVDbGlwcGluZydcblxuY29uc3QgU0NSQVRDSF9SRUNUID0gbWFrZUNsaXBwZWRSZWN0KClcblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydFBpeGVsRGF0YShcbiAgcGl4ZWxEYXRhOiBJUGl4ZWxEYXRhLFxuICBvcHRzOiBQaXhlbE11dGF0ZU9wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBjb25zdCBkc3QgPSBwaXhlbERhdGFcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gcGl4ZWxEYXRhLndpZHRoLFxuICAgIGg6IGhlaWdodCA9IHBpeGVsRGF0YS5oZWlnaHQsXG4gICAgbWFzayxcbiAgICBtdyxcbiAgICBteCA9IDAsXG4gICAgbXkgPSAwLFxuICAgIGludmVydE1hc2sgPSBmYWxzZSxcbiAgfSA9IG9wdHNcblxuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh0YXJnZXRYLCB0YXJnZXRZLCB3aWR0aCwgaGVpZ2h0LCBkc3Qud2lkdGgsIGRzdC5oZWlnaHQsIFNDUkFUQ0hfUkVDVClcblxuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVyblxuXG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBtdyA/PyB3aWR0aFxuXG4gIGNvbnN0IGR4ID0geCAtIHRhcmdldFhcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WVxuXG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeFxuICBsZXQgbUlkeCA9IChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KVxuXG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGFjdHVhbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGFjdHVhbFdcblxuICAvLyBPcHRpbWl6YXRpb246IFNwbGl0IGxvb3BzIHRvIGF2b2lkIGNoZWNraW5nIGBpZiAobWFzaylgIGZvciBldmVyeSBwaXhlbC5cbiAgaWYgKG1hc2spIHtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgY29uc3QgbVZhbCA9IG1hc2tbbUlkeF1cbiAgICAgICAgY29uc3QgaXNIaXQgPSBpbnZlcnRNYXNrXG4gICAgICAgICAgPyBtVmFsID09PSAwXG4gICAgICAgICAgOiBtVmFsID09PSAxXG5cbiAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgLy8gWE9SIHdpdGggMHgwMEZGRkZGRiBmbGlwcyBSR0IgYml0cyBhbmQgaWdub3JlcyBBbHBoYSAodGhlIHRvcCA4IGJpdHMpXG4gICAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkZcbiAgICAgICAgfVxuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICAgIG1JZHggKz0gbVN0cmlkZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkZcbiAgICAgICAgZElkeCsrXG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { HistoryMutator } from '../../_types';\nimport { invertPixelData } from '../../PixelData/invertPixelData';\nconst defaults = {\n invertPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorInvert = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n invertPixelData = defaults.invertPixelData\n } = deps;\n return {\n invert(opts: PixelMutateOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n invertPixelData(writer.target, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgUGl4ZWxNdXRhdGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgaW52ZXJ0UGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ludmVydFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBpbnZlcnRQaXhlbERhdGEgfVxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbmV4cG9ydCBjb25zdCBtdXRhdG9ySW52ZXJ0ID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgaW52ZXJ0UGl4ZWxEYXRhID0gZGVmYXVsdHMuaW52ZXJ0UGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgaW52ZXJ0KG9wdHM6IFBpeGVsTXV0YXRlT3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuICAgICAgaW52ZXJ0UGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { mutatorApplyAlphaMask } from './PixelMutator/mutatorApplyAlphaMask';\nimport { mutatorApplyBinaryMask } from './PixelMutator/mutatorApplyBinaryMask';\nimport { mutatorApplyCircleBrush } from './PixelMutator/mutatorApplyCircleBrush';\nimport { mutatorApplyCircleBrushStroke } from './PixelMutator/mutatorApplyCircleBrushStroke';\nimport { mutatorApplyCirclePencilStroke } from './PixelMutator/mutatorApplyCirclePencilStroke';\nimport { mutatorApplyRectBrush } from './PixelMutator/mutatorApplyRectBrush';\nimport { mutatorApplyRectBrushStroke } from './PixelMutator/mutatorApplyRectBrushStroke';\nimport { mutatorApplyRectPencil } from './PixelMutator/mutatorApplyRectPencil';\nimport { mutatorApplyRectPencilStroke } from './PixelMutator/mutatorApplyRectPencilStroke';\nimport { mutatorBlendColor } from './PixelMutator/mutatorBlendColor';\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel';\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData';\nimport { mutatorClear } from './PixelMutator/mutatorClear';\nimport { mutatorFill } from './PixelMutator/mutatorFill';\nimport { mutatorInvert } from './PixelMutator/mutatorInvert';\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n ...mutatorApplyAlphaMask(writer),\n ...mutatorApplyBinaryMask(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorBlendColor(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorFill(writer),\n ...mutatorInvert(writer),\n ...mutatorApplyCircleBrush(writer),\n ...mutatorApplyCircleBrushStroke(writer),\n ...mutatorApplyCirclePencilStroke(writer),\n ...mutatorApplyRectBrush(writer),\n ...mutatorApplyRectBrushStroke(writer),\n ...mutatorApplyRectPencil(writer),\n ...mutatorApplyRectPencilStroke(writer),\n ...mutatorClear(writer)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbXV0YXRvckFwcGx5QWxwaGFNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckFwcGx5QWxwaGFNYXNrJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5QmluYXJ5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUJpbmFyeU1hc2snXG5pbXBvcnQgeyBtdXRhdG9yQXBwbHlDaXJjbGVCcnVzaCB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUNpcmNsZUJydXNoJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5Q2lyY2xlQnJ1c2hTdHJva2UgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseUNpcmNsZVBlbmNpbFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUNpcmNsZVBlbmNpbFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RCcnVzaCB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RCcnVzaCdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RCcnVzaFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RCcnVzaFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RQZW5jaWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlSZWN0UGVuY2lsJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5UmVjdFBlbmNpbFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RQZW5jaWxTdHJva2UnXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRDb2xvciB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yJ1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kUGl4ZWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbCdcbmltcG9ydCB7IG11dGF0b3JCbGVuZFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZFBpeGVsRGF0YSdcbmltcG9ydCB7IG11dGF0b3JDbGVhciB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JDbGVhcidcbmltcG9ydCB7IG11dGF0b3JGaWxsIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckZpbGwnXG5pbXBvcnQgeyBtdXRhdG9ySW52ZXJ0IH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckludmVydCdcbmltcG9ydCB0eXBlIHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuL1BpeGVsV3JpdGVyJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUZ1bGxQaXhlbE11dGF0b3Iod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+KSB7XG4gIHJldHVybiB7XG4gICAgLi4ubXV0YXRvckFwcGx5QWxwaGFNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckFwcGx5QmluYXJ5TWFzayh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckJsZW5kUGl4ZWxEYXRhKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3Iod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbCh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JGaWxsKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckludmVydCh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckFwcGx5Q2lyY2xlQnJ1c2god3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckFwcGx5Q2lyY2xlUGVuY2lsU3Ryb2tlKHdyaXRlciksXG5cbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0QnJ1c2god3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0QnJ1c2hTdHJva2Uod3JpdGVyKSxcblxuICAgIC4uLm11dGF0b3JBcHBseVJlY3RQZW5jaWwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0UGVuY2lsU3Ryb2tlKHdyaXRlciksXG5cbiAgICAuLi5tdXRhdG9yQ2xlYXIod3JpdGVyKSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { HistoryManager } from './HistoryManager';\nimport { PixelAccumulator } from './PixelAccumulator';\nimport { PixelEngineConfig } from './PixelEngineConfig';\nimport { applyPatchTiles } from './PixelPatchTiles';\nexport interface PixelWriterOptions {\n maxHistorySteps?: number;\n tileSize?: number;\n historyManager?: HistoryManager;\n}\n\n/**\n * @example\n * const targ = new PixelData(new ImageData(10, 10))\n * const writer = new PixelWriter(targ, (writer) => {\n * return {\n * ...mutatorApplyMask(writer),\n * ...mutatorBlendPixelData(writer),\n * ...mutatorBlendColor(writer),\n * ...mutatorBlendPixel(writer),\n * ...mutatorFill(writer),\n * }\n * })\n *\n * // to import all mutator functions\n * const writer = new PixelWriter(targ, makeFullPixelMutator)\n *\n * writer.withHistory((mutator) => {\n * mutator.applyMask()\n * mutator.blendPixelData()\n * })\n */\nexport class PixelWriter<M> {\n public target: IPixelData;\n public historyManager: HistoryManager;\n public accumulator: PixelAccumulator;\n protected config: PixelEngineConfig;\n readonly mutator: M;\n constructor(target: IPixelData, mutatorFactory: (writer: PixelWriter<any>) => M, {\n tileSize = 256,\n maxHistorySteps = 50,\n historyManager = new HistoryManager(maxHistorySteps)\n }: PixelWriterOptions = {}) {\n this.target = target;\n this.config = new PixelEngineConfig(tileSize);\n this.historyManager = historyManager;\n this.accumulator = new PixelAccumulator(target, this.config);\n this.mutator = mutatorFactory(this);\n }\n withHistory(cb: (mutator: M) => void) {\n cb(this.mutator);\n this.captureHistory();\n }\n captureHistory() {\n const beforeTiles = this.accumulator.beforeTiles;\n if (beforeTiles.length === 0) return;\n const afterTiles = this.accumulator.extractAfterTiles();\n const patch: PixelPatchTiles = {\n beforeTiles: beforeTiles,\n afterTiles: afterTiles\n };\n const target = this.target;\n const tileSize = this.config.tileSize;\n const accumulator = this.accumulator;\n const action: HistoryAction = {\n undo: () => applyPatchTiles(target, patch.beforeTiles, tileSize),\n redo: () => applyPatchTiles(target, patch.afterTiles, tileSize),\n dispose: () => accumulator.recyclePatch(patch)\n };\n this.historyManager.commit(action);\n this.accumulator.reset();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5QWN0aW9uLCBIaXN0b3J5TWFuYWdlciB9IGZyb20gJy4vSGlzdG9yeU1hbmFnZXInXG5pbXBvcnQgeyBQaXhlbEFjY3VtdWxhdG9yIH0gZnJvbSAnLi9QaXhlbEFjY3VtdWxhdG9yJ1xuaW1wb3J0IHsgUGl4ZWxFbmdpbmVDb25maWcgfSBmcm9tICcuL1BpeGVsRW5naW5lQ29uZmlnJ1xuaW1wb3J0IHsgYXBwbHlQYXRjaFRpbGVzLCB0eXBlIFBpeGVsUGF0Y2hUaWxlcyB9IGZyb20gJy4vUGl4ZWxQYXRjaFRpbGVzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsV3JpdGVyT3B0aW9ucyB7XG4gIG1heEhpc3RvcnlTdGVwcz86IG51bWJlclxuICB0aWxlU2l6ZT86IG51bWJlclxuICBoaXN0b3J5TWFuYWdlcj86IEhpc3RvcnlNYW5hZ2VyXG59XG5cbi8qKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRhcmcgPSBuZXcgUGl4ZWxEYXRhKG5ldyBJbWFnZURhdGEoMTAsIDEwKSlcbiAqIGNvbnN0IHdyaXRlciA9IG5ldyBQaXhlbFdyaXRlcih0YXJnLCAod3JpdGVyKSA9PiB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgLi4ubXV0YXRvckFwcGx5TWFzayh3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsRGF0YSh3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZENvbG9yKHdyaXRlciksXG4gKiAgICAgLi4ubXV0YXRvckJsZW5kUGl4ZWwod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yRmlsbCh3cml0ZXIpLFxuICogICB9XG4gKiB9KVxuICpcbiAqIC8vIHRvIGltcG9ydCBhbGwgbXV0YXRvciBmdW5jdGlvbnNcbiAqIGNvbnN0IHdyaXRlciA9IG5ldyBQaXhlbFdyaXRlcih0YXJnLCBtYWtlRnVsbFBpeGVsTXV0YXRvcilcbiAqXG4gKiB3cml0ZXIud2l0aEhpc3RvcnkoKG11dGF0b3IpID0+IHtcbiAqICAgbXV0YXRvci5hcHBseU1hc2soKVxuICogICBtdXRhdG9yLmJsZW5kUGl4ZWxEYXRhKClcbiAqIH0pXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXhlbFdyaXRlcjxNPiB7XG4gIHB1YmxpYyB0YXJnZXQ6IElQaXhlbERhdGFcbiAgcHVibGljIGhpc3RvcnlNYW5hZ2VyOiBIaXN0b3J5TWFuYWdlclxuICBwdWJsaWMgYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3JcbiAgcHJvdGVjdGVkIGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWdcbiAgcmVhZG9ubHkgbXV0YXRvcjogTVxuXG4gIGNvbnN0cnVjdG9yKHRhcmdldDogSVBpeGVsRGF0YSwgbXV0YXRvckZhY3Rvcnk6ICh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4pID0+IE0sIHtcbiAgICB0aWxlU2l6ZSA9IDI1NixcbiAgICBtYXhIaXN0b3J5U3RlcHMgPSA1MCxcbiAgICBoaXN0b3J5TWFuYWdlciA9IG5ldyBIaXN0b3J5TWFuYWdlcihtYXhIaXN0b3J5U3RlcHMpLFxuICB9OiBQaXhlbFdyaXRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGhpcy5jb25maWcgPSBuZXcgUGl4ZWxFbmdpbmVDb25maWcodGlsZVNpemUpXG4gICAgdGhpcy5oaXN0b3J5TWFuYWdlciA9IGhpc3RvcnlNYW5hZ2VyXG4gICAgdGhpcy5hY2N1bXVsYXRvciA9IG5ldyBQaXhlbEFjY3VtdWxhdG9yKHRhcmdldCwgdGhpcy5jb25maWcpXG4gICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvckZhY3RvcnkodGhpcylcbiAgfVxuXG4gIHdpdGhIaXN0b3J5KGNiOiAobXV0YXRvcjogTSkgPT4gdm9pZCkge1xuICAgIGNiKHRoaXMubXV0YXRvcilcblxuICAgIHRoaXMuY2FwdHVyZUhpc3RvcnkoKVxuICB9XG5cbiAgY2FwdHVyZUhpc3RvcnkoKSB7XG4gICAgY29uc3QgYmVmb3JlVGlsZXMgPSB0aGlzLmFjY3VtdWxhdG9yLmJlZm9yZVRpbGVzXG4gICAgaWYgKGJlZm9yZVRpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBhZnRlclRpbGVzID0gdGhpcy5hY2N1bXVsYXRvci5leHRyYWN0QWZ0ZXJUaWxlcygpXG5cbiAgICBjb25zdCBwYXRjaDogUGl4ZWxQYXRjaFRpbGVzID0ge1xuICAgICAgYmVmb3JlVGlsZXM6IGJlZm9yZVRpbGVzLFxuICAgICAgYWZ0ZXJUaWxlczogYWZ0ZXJUaWxlcyxcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5jb25maWcudGlsZVNpemVcbiAgICBjb25zdCBhY2N1bXVsYXRvciA9IHRoaXMuYWNjdW11bGF0b3JcblxuICAgIGNvbnN0IGFjdGlvbjogSGlzdG9yeUFjdGlvbiA9IHtcbiAgICAgIHVuZG86ICgpID0+IGFwcGx5UGF0Y2hUaWxlcyh0YXJnZXQsIHBhdGNoLmJlZm9yZVRpbGVzLCB0aWxlU2l6ZSksXG4gICAgICByZWRvOiAoKSA9PiBhcHBseVBhdGNoVGlsZXModGFyZ2V0LCBwYXRjaC5hZnRlclRpbGVzLCB0aWxlU2l6ZSksXG4gICAgICBkaXNwb3NlOiAoKSA9PiBhY2N1bXVsYXRvci5yZWN5Y2xlUGF0Y2gocGF0Y2gpLFxuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuY29tbWl0KGFjdGlvbilcbiAgICB0aGlzLmFjY3VtdWxhdG9yLnJlc2V0KClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { applyCircleBrushToPixelData } from '../../PixelData/applyCircleBrushToPixelData';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nconst defaults = {\n applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds,\n fallOff: () => 1\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyCirclePencil = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyCircleBrushToPixelData = defaults.applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds,\n fallOff = defaults.fallOff\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCirclePencil(color: Color32, centerX: number, centerY: number, brushSize: number, alpha = 255, blendFn?: BlendColor32) {\n const bounds = getCircleBrushOrPencilBounds(centerX, centerY, brushSize, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyCircleBrushToPixelData(writer.target, color, centerX, centerY, brushSize, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSdcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhLFxuICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxuICBmYWxsT2ZmOiAoKSA9PiAxLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUNpcmNsZVBlbmNpbCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgICBmYWxsT2ZmID0gZGVmYXVsdHMuZmFsbE9mZixcbiAgfSA9IGRlcHNcblxuICBjb25zdCBib3VuZHNPdXQ6IFJlY3QgPSB7IHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfVxuXG4gIHJldHVybiB7XG4gICAgYXBwbHlDaXJjbGVQZW5jaWwoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIGNlbnRlclg6IG51bWJlcixcbiAgICAgIGNlbnRlclk6IG51bWJlcixcbiAgICAgIGJydXNoU2l6ZTogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICkge1xuXG4gICAgICBjb25zdCBib3VuZHMgPSBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaFNpemUsXG4gICAgICAgIHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBib3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gYm91bmRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YShcbiAgICAgICAgd3JpdGVyLnRhcmdldCxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoU2l6ZSxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGZhbGxPZmYsXG4gICAgICAgIGJsZW5kRm4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function copyImageData({\n data,\n width,\n height\n}: ImageDataLike): ImageData {\n return new ImageData(data.slice(), width, height);\n}\nexport function copyImageDataLike({\n data,\n width,\n height\n}: ImageDataLike): ImageDataLike {\n return {\n data: data.slice(),\n width,\n height\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29weUltYWdlRGF0YSh7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfTogSW1hZ2VEYXRhTGlrZSk6IEltYWdlRGF0YSB7XG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGRhdGEuc2xpY2UoKSwgd2lkdGgsIGhlaWdodClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJbWFnZURhdGFMaWtlKHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9OiBJbWFnZURhdGFMaWtlKTogSW1hZ2VEYXRhTGlrZSB7XG4gIHJldHVybiB7XG4gICAgZGF0YTogZGF0YS5zbGljZSgpLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function makeImageDataLike(width: number, height: number, data?: Buffer): ImageDataLike {\n const size = width * height * 4;\n const buffer = data ? new Uint8ClampedArray(data.buffer, data.byteOffset, size) : new Uint8ClampedArray(size);\n return {\n width,\n height,\n data: buffer\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUltYWdlRGF0YUxpa2Uod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE/OiBCdWZmZXIpOiBJbWFnZURhdGFMaWtlIHtcbiAgY29uc3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogNFxuICBjb25zdCBidWZmZXIgPSBkYXRhXG4gICAgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgc2l6ZSlcbiAgICA6IG5ldyBVaW50OENsYW1wZWRBcnJheShzaXplKVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkYXRhOiBidWZmZXIsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { AlphaMask } from '../_types';\n/**\n * Extracts the alpha channel from raw ImageData into an AlphaMask.\n * When possible use {@link pixelDataToAlphaMask} instead.\n * Repeat calls to the same data will use less memory.\n */\nexport function imageDataToAlphaMask(imageData: ImageData): AlphaMask {\n const {\n width,\n height,\n data\n } = imageData;\n\n // Create a 32-bit view of the existing buffer\n const data32 = new Uint32Array(data.buffer, data.byteOffset, data.byteLength >> 2);\n const len = data32.length;\n const mask = new Uint8Array(width * height) as AlphaMask;\n for (let i = 0; i < len; i++) {\n const val = data32[i];\n\n // Extract Alpha (top 8 bits in Little-Endian/ABGR)\n mask[i] = val >>> 24 & 0xff;\n }\n return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2sgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBwaXhlbERhdGFUb0FscGhhTWFzayB9IGZyb20gJy4uL1BpeGVsRGF0YS9waXhlbERhdGFUb0FscGhhTWFzaydcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYWxwaGEgY2hhbm5lbCBmcm9tIHJhdyBJbWFnZURhdGEgaW50byBhbiBBbHBoYU1hc2suXG4gKiBXaGVuIHBvc3NpYmxlIHVzZSB7QGxpbmsgcGl4ZWxEYXRhVG9BbHBoYU1hc2t9IGluc3RlYWQuXG4gKiBSZXBlYXQgY2FsbHMgdG8gdGhlIHNhbWUgZGF0YSB3aWxsIHVzZSBsZXNzIG1lbW9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltYWdlRGF0YVRvQWxwaGFNYXNrKFxuICBpbWFnZURhdGE6IEltYWdlRGF0YSxcbik6IEFscGhhTWFzayB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZGF0YSxcbiAgfSA9IGltYWdlRGF0YVxuXG4gIC8vIENyZWF0ZSBhIDMyLWJpdCB2aWV3IG9mIHRoZSBleGlzdGluZyBidWZmZXJcbiAgY29uc3QgZGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KFxuICAgIGRhdGEuYnVmZmVyLFxuICAgIGRhdGEuYnl0ZU9mZnNldCxcbiAgICBkYXRhLmJ5dGVMZW5ndGggPj4gMixcbiAgKVxuICBjb25zdCBsZW4gPSBkYXRhMzIubGVuZ3RoXG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCkgYXMgQWxwaGFNYXNrXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHZhbCA9IGRhdGEzMltpXVxuXG4gICAgLy8gRXh0cmFjdCBBbHBoYSAodG9wIDggYml0cyBpbiBMaXR0bGUtRW5kaWFuL0FCR1IpXG4gICAgbWFza1tpXSA9ICh2YWwgPj4+IDI0KSAmIDB4ZmZcbiAgfVxuXG4gIHJldHVybiBtYXNrXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeReusableCanvas } from '../Canvas/ReusableCanvas';\nconst get = makeReusableCanvas();\n\n/**\n * Converts an {@link ImageData} object into a base64-encoded Data URL string.\n *\n * @param imageData - The pixel data to be converted.\n *\n * @returns A string representing the image in `image/png` format as a\n * [Data URL](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data).\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n * @example\n * ```typescript\n * const dataUrl = imageDataToDataUrl(imageData);\n * const img = new Image();\n * img.src = dataUrl;\n * ```\n */\nexport function imageDataToDataUrl(imageData: ImageData): string {\n const {\n canvas,\n ctx\n } = get(imageData.width, imageData.height);\n ctx.putImageData(imageData, 0, 0);\n return canvas.toDataURL();\n}\nimageDataToDataUrl.reset = get.reset;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFrZVJldXNhYmxlQ2FudmFzIH0gZnJvbSAnLi4vQ2FudmFzL1JldXNhYmxlQ2FudmFzJ1xuXG5jb25zdCBnZXQgPSBtYWtlUmV1c2FibGVDYW52YXMoKVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIHtAbGluayBJbWFnZURhdGF9IG9iamVjdCBpbnRvIGEgYmFzZTY0LWVuY29kZWQgRGF0YSBVUkwgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBpbWFnZURhdGEgLSBUaGUgcGl4ZWwgZGF0YSB0byBiZSBjb252ZXJ0ZWQuXG4gKlxuICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBpbWFnZSBpbiBgaW1hZ2UvcG5nYCBmb3JtYXQgYXMgYVxuICogW0RhdGEgVVJMXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9VUkkvUmVmZXJlbmNlL1NjaGVtZXMvZGF0YSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHtAbGluayBIVE1MQ2FudmFzRWxlbWVudH0gY29udGV4dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGF0YVVybCA9IGltYWdlRGF0YVRvRGF0YVVybChpbWFnZURhdGEpO1xuICogY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gKiBpbWcuc3JjID0gZGF0YVVybDtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VEYXRhVG9EYXRhVXJsKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjYW52YXMsIGN0eCB9ID0gZ2V0KGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodClcblxuICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMClcbiAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoKVxufVxuXG5pbWFnZURhdGFUb0RhdGFVcmwucmVzZXQgPSBnZXQucmVzZXRcbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * converts {@link ImageData} to a faster Uint32Array\n */\nexport function imageDataToUInt32Array(imageData: ImageDataLike): Uint32Array {\n return new Uint32Array(imageData.data.buffer, imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIGNvbnZlcnRzIHtAbGluayBJbWFnZURhdGF9IHRvIGEgZmFzdGVyIFVpbnQzMkFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSk6IFVpbnQzMkFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShcbiAgICBpbWFnZURhdGEuZGF0YS5idWZmZXIsXG4gICAgaW1hZ2VEYXRhLmRhdGEuYnl0ZU9mZnNldCxcbiAgICAvLyBTaGlmdCByaWdodCBieSAyIGlzIGEgZmFzdCBiaXR3aXNlIGRpdmlzaW9uIGJ5IDQuXG4gICAgaW1hZ2VEYXRhLmRhdGEuYnl0ZUxlbmd0aCA+PiAyLFxuICApXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function invertImageData(imageData: ImageData) {\n const data = imageData.data;\n let length = data.length;\n for (let i = 0; i < length; i += 4) {\n data[i] = 255 - data[i]!;\n data[i + 1] = 255 - data[i + 1]!;\n data[i + 2] = 255 - data[i + 2]!;\n }\n return imageData;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGludmVydEltYWdlRGF0YShpbWFnZURhdGE6IEltYWdlRGF0YSkge1xuICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGFcbiAgbGV0IGxlbmd0aCA9IGRhdGEubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICBkYXRhW2ldID0gMjU1IC0gZGF0YVtpXSFcbiAgICBkYXRhW2kgKyAxXSA9IDI1NSAtIGRhdGFbaSArIDFdIVxuICAgIGRhdGFbaSArIDJdID0gMjU1IC0gZGF0YVtpICsgMl0hXG4gIH1cbiAgcmV0dXJuIGltYWdlRGF0YVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","const resample32Scratch = {\n data: null as null | Int32Array,\n width: 0,\n height: 0\n};\n\n/**\n * @internal\n */\ntype Resample32Result = {\n data: Int32Array;\n width: number;\n height: number;\n};\n\n/**\n * @internal\n */\nexport function resample32(srcData32: Uint32Array | Int32Array, srcW: number, srcH: number, factor: number): Resample32Result {\n const dstW = Math.max(1, srcW * factor | 0);\n const dstH = Math.max(1, srcH * factor | 0);\n const dstData = new Int32Array(dstW * dstH);\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW;\n const scaleY = srcH / dstH;\n for (let y = 0; y < dstH; y++) {\n const srcY = Math.min(srcH - 1, y * scaleY | 0);\n const srcRowOffset = srcY * srcW;\n const dstRowOffset = y * dstW;\n for (let x = 0; x < dstW; x++) {\n const srcX = Math.min(srcW - 1, x * scaleX | 0);\n dstData[dstRowOffset + x] = srcData32[srcRowOffset + srcX]!;\n }\n }\n resample32Scratch.data = dstData;\n resample32Scratch.width = dstW;\n resample32Scratch.height = dstH;\n return resample32Scratch as Resample32Result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmVzYW1wbGUzMlNjcmF0Y2ggPSB7XG4gIGRhdGE6IG51bGwgYXMgbnVsbCB8IEludDMyQXJyYXksXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG59XG5cbi8qKlxuICogIEBpbnRlcm5hbFxuICovXG50eXBlIFJlc2FtcGxlMzJSZXN1bHQgPSB7IGRhdGE6IEludDMyQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cblxuLyoqXG4gKiAgQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNhbXBsZTMyKFxuICBzcmNEYXRhMzI6IFVpbnQzMkFycmF5IHwgSW50MzJBcnJheSxcbiAgc3JjVzogbnVtYmVyLFxuICBzcmNIOiBudW1iZXIsXG4gIGZhY3RvcjogbnVtYmVyLFxuKTogUmVzYW1wbGUzMlJlc3VsdCB7XG4gIGNvbnN0IGRzdFcgPSBNYXRoLm1heCgxLCAoc3JjVyAqIGZhY3RvcikgfCAwKVxuICBjb25zdCBkc3RIID0gTWF0aC5tYXgoMSwgKHNyY0ggKiBmYWN0b3IpIHwgMClcbiAgY29uc3QgZHN0RGF0YSA9IG5ldyBJbnQzMkFycmF5KGRzdFcgKiBkc3RIKVxuXG4gIC8vIFVzZSB0aGUgcmVjaXByb2NhbCB0byBtYXAgYmFjayBwcmVjaXNlbHlcbiAgY29uc3Qgc2NhbGVYID0gc3JjVyAvIGRzdFdcbiAgY29uc3Qgc2NhbGVZID0gc3JjSCAvIGRzdEhcblxuICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzdEg7IHkrKykge1xuICAgIGNvbnN0IHNyY1kgPSBNYXRoLm1pbihzcmNIIC0gMSwgKHkgKiBzY2FsZVkpIHwgMClcbiAgICBjb25zdCBzcmNSb3dPZmZzZXQgPSBzcmNZICogc3JjV1xuICAgIGNvbnN0IGRzdFJvd09mZnNldCA9IHkgKiBkc3RXXG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGRzdFc7IHgrKykge1xuICAgICAgY29uc3Qgc3JjWCA9IE1hdGgubWluKHNyY1cgLSAxLCAoeCAqIHNjYWxlWCkgfCAwKVxuXG4gICAgICBkc3REYXRhW2RzdFJvd09mZnNldCArIHhdID0gc3JjRGF0YTMyW3NyY1Jvd09mZnNldCArIHNyY1hdIVxuICAgIH1cbiAgfVxuXG4gIHJlc2FtcGxlMzJTY3JhdGNoLmRhdGEgPSBkc3REYXRhXG4gIHJlc2FtcGxlMzJTY3JhdGNoLndpZHRoID0gZHN0V1xuICByZXNhbXBsZTMyU2NyYXRjaC5oZWlnaHQgPSBkc3RIXG5cbiAgcmV0dXJuIHJlc2FtcGxlMzJTY3JhdGNoIGFzIFJlc2FtcGxlMzJSZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer);\n const {\n data,\n width,\n height\n } = resample32(src32, source.width, source.height, factor);\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>;\n return new ImageData(uint8ClampedArray, width, height);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNhbXBsZXMgSW1hZ2VEYXRhIGJ5IGEgc3BlY2lmaWMgZmFjdG9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5pbXBvcnQgeyByZXNhbXBsZTMyIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzYW1wbGUzMidcblxuLyoqXG4gKiBSZXNhbXBsZXMgSW1hZ2VEYXRhIGJ5IGEgc3BlY2lmaWMgZmFjdG9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVJbWFnZURhdGEoc291cmNlOiBJbWFnZURhdGEsIGZhY3RvcjogbnVtYmVyKTogSW1hZ2VEYXRhIHtcbiAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc291cmNlLmRhdGEuYnVmZmVyKVxuICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfSA9IHJlc2FtcGxlMzIoc3JjMzIsIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCwgZmFjdG9yKVxuXG4gIGNvbnN0IHVpbnQ4Q2xhbXBlZEFycmF5ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEuYnVmZmVyKSBhcyBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlcj5cbiAgcmV0dXJuIG5ldyBJbWFnZURhdGEodWludDhDbGFtcGVkQXJyYXksIHdpZHRoLCBoZWlnaHQpXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Non destructively resizes the {@link ImageData} buffer to new dimensions, optionally\n * offsetting the original content.\n * This operation creates a new buffer. It does not scale or stretch pixels;\n * instead, it crops or pads the image based on the new dimensions and\n * provides an offset for repositioning.\n *\n * @param current The source {@link ImageDataLike} to resize.\n * @param newWidth The target width in pixels.\n * @param newHeight The target height in pixels.\n * @param offsetX The horizontal offset for placing the\n * original image within the new buffer.\n * @default 0\n * @param offsetY The vertical offset for placing the\n * original image within the new buffer.\n * @default 0\n *\n * @returns A new {@link ImageData} instance with the specified dimensions.\n *\n * @example\n * ```typescript\n * // Centers an 80x80 image in a new 100x100 buffer\n * const resized = resizeImageData(\n * originalData,\n * 100,\n * 100,\n * 10,\n * 10\n * );\n * ```\n */\nexport function resizeImageData(current: ImageDataLike, newWidth: number, newHeight: number, offsetX = 0, offsetY = 0): ImageData {\n const result = new ImageData(newWidth, newHeight);\n const {\n width: oldW,\n height: oldH,\n data: oldData\n } = current;\n const newData = result.data;\n\n // Determine intersection of the old image (at offset) and new canvas bounds\n const x0 = Math.max(0, offsetX);\n const y0 = Math.max(0, offsetY);\n const x1 = Math.min(newWidth, offsetX + oldW);\n const y1 = Math.min(newHeight, offsetY + oldH);\n if (x1 <= x0 || y1 <= y0) {\n return result;\n }\n const rowCount = y1 - y0;\n const rowLen = (x1 - x0) * 4;\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row;\n const srcY = dstY - offsetY;\n const srcX = x0 - offsetX;\n const dstStart = (dstY * newWidth + x0) * 4;\n const srcStart = (srcY * oldW + srcX) * 4;\n newData.set(oldData.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIE5vbiBkZXN0cnVjdGl2ZWx5IHJlc2l6ZXMgdGhlIHtAbGluayBJbWFnZURhdGF9IGJ1ZmZlciB0byBuZXcgZGltZW5zaW9ucywgb3B0aW9uYWxseVxuICogb2Zmc2V0dGluZyB0aGUgb3JpZ2luYWwgY29udGVudC5cbiAqIFRoaXMgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYnVmZmVyLiBJdCBkb2VzIG5vdCBzY2FsZSBvciBzdHJldGNoIHBpeGVscztcbiAqIGluc3RlYWQsIGl0IGNyb3BzIG9yIHBhZHMgdGhlIGltYWdlIGJhc2VkIG9uIHRoZSBuZXcgZGltZW5zaW9ucyBhbmRcbiAqIHByb3ZpZGVzIGFuIG9mZnNldCBmb3IgcmVwb3NpdGlvbmluZy5cbiAqXG4gKiBAcGFyYW0gY3VycmVudCBUaGUgc291cmNlIHtAbGluayBJbWFnZURhdGFMaWtlfSB0byByZXNpemUuXG4gKiBAcGFyYW0gbmV3V2lkdGggVGhlIHRhcmdldCB3aWR0aCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0gbmV3SGVpZ2h0IFRoZSB0YXJnZXQgaGVpZ2h0IGluIHBpeGVscy5cbiAqIEBwYXJhbSBvZmZzZXRYIFRoZSBob3Jpem9udGFsIG9mZnNldCBmb3IgcGxhY2luZyB0aGVcbiAqIG9yaWdpbmFsIGltYWdlIHdpdGhpbiB0aGUgbmV3IGJ1ZmZlci5cbiAqIEBkZWZhdWx0IDBcbiAqIEBwYXJhbSBvZmZzZXRZIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgZm9yIHBsYWNpbmcgdGhlXG4gKiBvcmlnaW5hbCBpbWFnZSB3aXRoaW4gdGhlIG5ldyBidWZmZXIuXG4gKiBAZGVmYXVsdCAwXG4gKlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIEltYWdlRGF0YX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENlbnRlcnMgYW4gODB4ODAgaW1hZ2UgaW4gYSBuZXcgMTAweDEwMCBidWZmZXJcbiAqIGNvbnN0IHJlc2l6ZWQgPSByZXNpemVJbWFnZURhdGEoXG4gKiAgIG9yaWdpbmFsRGF0YSxcbiAqICAgMTAwLFxuICogICAxMDAsXG4gKiAgIDEwLFxuICogICAxMFxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplSW1hZ2VEYXRhKFxuICBjdXJyZW50OiBJbWFnZURhdGFMaWtlLFxuICBuZXdXaWR0aDogbnVtYmVyLFxuICBuZXdIZWlnaHQ6IG51bWJlcixcbiAgb2Zmc2V0WCA9IDAsXG4gIG9mZnNldFkgPSAwLFxuKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEltYWdlRGF0YShuZXdXaWR0aCwgbmV3SGVpZ2h0KVxuICBjb25zdCB7XG4gICAgd2lkdGg6IG9sZFcsXG4gICAgaGVpZ2h0OiBvbGRILFxuICAgIGRhdGE6IG9sZERhdGEsXG4gIH0gPSBjdXJyZW50XG4gIGNvbnN0IG5ld0RhdGEgPSByZXN1bHQuZGF0YVxuXG4gIC8vIERldGVybWluZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9sZCBpbWFnZSAoYXQgb2Zmc2V0KSBhbmQgbmV3IGNhbnZhcyBib3VuZHNcbiAgY29uc3QgeDAgPSBNYXRoLm1heCgwLCBvZmZzZXRYKVxuICBjb25zdCB5MCA9IE1hdGgubWF4KDAsIG9mZnNldFkpXG4gIGNvbnN0IHgxID0gTWF0aC5taW4obmV3V2lkdGgsIG9mZnNldFggKyBvbGRXKVxuICBjb25zdCB5MSA9IE1hdGgubWluKG5ld0hlaWdodCwgb2Zmc2V0WSArIG9sZEgpXG5cbiAgaWYgKHgxIDw9IHgwIHx8IHkxIDw9IHkwKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3Qgcm93Q291bnQgPSB5MSAtIHkwXG4gIGNvbnN0IHJvd0xlbiA9ICh4MSAtIHgwKSAqIDRcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dDb3VudDsgcm93KyspIHtcbiAgICBjb25zdCBkc3RZID0geTAgKyByb3dcbiAgICBjb25zdCBzcmNZID0gZHN0WSAtIG9mZnNldFlcbiAgICBjb25zdCBzcmNYID0geDAgLSBvZmZzZXRYXG5cbiAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICogbmV3V2lkdGggKyB4MCkgKiA0XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSAqIG9sZFcgKyBzcmNYKSAqIDRcblxuICAgIG5ld0RhdGEuc2V0KFxuICAgICAgb2xkRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pLFxuICAgICAgZHN0U3RhcnQsXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type ReusableImageData = ReturnType<typeof makeReusableImageData>;\n\n/**\n * Creates a factory function that manages a single, reusable ImageData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled ImageData instance.\n */\nexport function makeReusableImageData() {\n let imageData: ImageData | null = null;\n\n /**\n * Retrieves an ImageData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached or newly allocated ImageData object.\n */\n return function getReusableImageData(width: number, height: number) {\n const hasInstance = !!imageData;\n const widthMatches = hasInstance && imageData!.width === width;\n const heightMatches = hasInstance && imageData!.height === height;\n if (!widthMatches || !heightMatches) {\n imageData = new ImageData(width, height);\n }\n return imageData!;\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUmV1c2FibGVJbWFnZURhdGEgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlUmV1c2FibGVJbWFnZURhdGE+XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIGEgc2luZ2xlLCByZXVzYWJsZSBJbWFnZURhdGEgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIHVzZWQgdG8gbWluaW1pemUgZ2FyYmFnZSBjb2xsZWN0aW9uIG92ZXJoZWFkIGJ5IHJlY3ljbGluZyB0aGVcbiAqIHVuZGVybHlpbmcgcGl4ZWwgYnVmZmVyIGFjcm9zcyBtdWx0aXBsZSBvcGVyYXRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJldHVybnMgYSBwb29sZWQgSW1hZ2VEYXRhIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJldXNhYmxlSW1hZ2VEYXRhKCkge1xuICBsZXQgaW1hZ2VEYXRhOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gSW1hZ2VEYXRhIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucy5cbiAgICogSWYgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGRpZmZlciBmcm9tIHRoZSBjYWNoZWQgaW5zdGFuY2UsIGEgbmV3IG9uZSBpcyBhbGxvY2F0ZWQuXG4gICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscy5cbiAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBpbiBwaXhlbHMuXG4gICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgYWxsb2NhdGVkIEltYWdlRGF0YSBvYmplY3QuXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UmV1c2FibGVJbWFnZURhdGEod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBoYXNJbnN0YW5jZSA9ICEhaW1hZ2VEYXRhXG4gICAgY29uc3Qgd2lkdGhNYXRjaGVzID0gaGFzSW5zdGFuY2UgJiYgaW1hZ2VEYXRhIS53aWR0aCA9PT0gd2lkdGhcbiAgICBjb25zdCBoZWlnaHRNYXRjaGVzID0gaGFzSW5zdGFuY2UgJiYgaW1hZ2VEYXRhIS5oZWlnaHQgPT09IGhlaWdodFxuXG4gICAgaWYgKCF3aWR0aE1hdGNoZXMgfHwgIWhlaWdodE1hdGNoZXMpIHtcbiAgICAgIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodClcbiAgICB9XG5cbiAgICByZXR1cm4gaW1hZ2VEYXRhIVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_types';\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const uint8 = new Uint8Array(buffer);\n const decoder = new TextDecoder('latin1');\n const binary = decoder.decode(uint8);\n return btoa(binary) as Base64EncodedUInt8Array;\n}\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray<ArrayBuffer> {\n const binary = atob(encoded);\n const bytes = new Uint8ClampedArray(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer)\n };\n}\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any;\n return serializeImageData(imageData) as any;\n}\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n };\n}\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array);\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any;\n}\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any;\n return deserializeImageData(serialized) as any;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCYXNlNjRFbmNvZGVkVUludDhBcnJheSwgSW1hZ2VEYXRhTGlrZSwgU2VyaWFsaXplZEltYWdlRGF0YSB9IGZyb20gJy4uL190eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NEVuY29kZUFycmF5QnVmZmVyKGJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlKTogQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkge1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcilcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignbGF0aW4xJylcbiAgY29uc3QgYmluYXJ5ID0gZGVjb2Rlci5kZWNvZGUodWludDgpXG5cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KSBhcyBCYXNlNjRFbmNvZGVkVUludDhBcnJheVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0RGVjb2RlQXJyYXlCdWZmZXIoZW5jb2RlZDogQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpOiBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlcj4ge1xuICBjb25zdCBiaW5hcnkgPSBhdG9iKGVuY29kZWQpXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJpbmFyeS5sZW5ndGgpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgYnl0ZXNbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKVxuICB9XG4gIHJldHVybiBieXRlc1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBmb3IgdXNlIGluIEpTT04uIFBpeGVsIGRhdGEgaXMgc3RvcmVkIGFzIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUltYWdlRGF0YTxUIGV4dGVuZHMgSW1hZ2VEYXRhTGlrZT4oaW1hZ2VEYXRhOiBUKTogU2VyaWFsaXplZEltYWdlRGF0YSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IGltYWdlRGF0YS53aWR0aCxcbiAgICBoZWlnaHQ6IGltYWdlRGF0YS5oZWlnaHQsXG4gICAgZGF0YTogYmFzZTY0RW5jb2RlQXJyYXlCdWZmZXIoaW1hZ2VEYXRhLmRhdGEuYnVmZmVyKSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTnVsbGFibGVJbWFnZURhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgfCBudWxsPihpbWFnZURhdGE6IFQpOiBUIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBTZXJpYWxpemVkSW1hZ2VEYXRhIHtcbiAgaWYgKCFpbWFnZURhdGEpIHJldHVybiBudWxsIGFzIGFueVxuXG4gIHJldHVybiBzZXJpYWxpemVJbWFnZURhdGEoaW1hZ2VEYXRhKSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUmF3SW1hZ2VEYXRhPFQgZXh0ZW5kcyBTZXJpYWxpemVkSW1hZ2VEYXRhPihzZXJpYWxpemVkOiBUKTogSW1hZ2VEYXRhTGlrZSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHNlcmlhbGl6ZWQud2lkdGgsXG4gICAgaGVpZ2h0OiBzZXJpYWxpemVkLmhlaWdodCxcbiAgICBkYXRhOiBiYXNlNjREZWNvZGVBcnJheUJ1ZmZlcihzZXJpYWxpemVkLmRhdGEgYXMgQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZUltYWdlRGF0YTxUIGV4dGVuZHMgU2VyaWFsaXplZEltYWdlRGF0YT4oc2VyaWFsaXplZDogVCk6IEltYWdlRGF0YSB7XG4gIGNvbnN0IGRhdGEgPSBiYXNlNjREZWNvZGVBcnJheUJ1ZmZlcihzZXJpYWxpemVkLmRhdGEgYXMgQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpXG5cbiAgcmV0dXJuIG5ldyBJbWFnZURhdGEoZGF0YSBhcyBJbWFnZURhdGFBcnJheSwgc2VyaWFsaXplZC53aWR0aCwgc2VyaWFsaXplZC5oZWlnaHQpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVOdWxsYWJsZUltYWdlRGF0YTxUIGV4dGVuZHMgU2VyaWFsaXplZEltYWdlRGF0YSB8IG51bGw+KHNlcmlhbGl6ZWQ6IFQpOiBUIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBJbWFnZURhdGEge1xuICBpZiAoIXNlcmlhbGl6ZWQpIHJldHVybiBudWxsIGFzIGFueVxuICByZXR1cm4gZGVzZXJpYWxpemVJbWFnZURhdGEoc2VyaWFsaXplZCkgYXMgYW55XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function uInt32ArrayToImageData(data: Uint32Array, width: number, height: number): ImageData {\n const buffer = data.buffer as ArrayBuffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n return new ImageData(clampedArray, width, height);\n}\nexport function uInt32ArrayToImageDataLike(data: Uint32Array, width: number, height: number): ImageDataLike {\n const buffer = data.buffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n return {\n width,\n height,\n data: clampedArray\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdUludDMyQXJyYXlUb0ltYWdlRGF0YShcbiAgZGF0YTogVWludDMyQXJyYXksXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgYnVmZmVyID0gZGF0YS5idWZmZXIgYXMgQXJyYXlCdWZmZXJcbiAgY29uc3QgYnl0ZU9mZnNldCA9IGRhdGEuYnl0ZU9mZnNldFxuICBjb25zdCBieXRlTGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoXG4gIGNvbnN0IGNsYW1wZWRBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpXG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGNsYW1wZWRBcnJheSwgd2lkdGgsIGhlaWdodClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVJbnQzMkFycmF5VG9JbWFnZURhdGFMaWtlKFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4pOiBJbWFnZURhdGFMaWtlIHtcbiAgY29uc3QgYnVmZmVyID0gZGF0YS5idWZmZXJcbiAgY29uc3QgYnl0ZU9mZnNldCA9IGRhdGEuYnl0ZU9mZnNldFxuICBjb25zdCBieXRlTGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoXG4gIGNvbnN0IGNsYW1wZWRBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpXG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGRhdGE6IGNsYW1wZWRBcnJheSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_types';\nimport { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Writes image data from a source to a target with support for clipping and alpha masking.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n * @param sx - The x-coordinate in the source to start copying from.\n * @param sy - The y-coordinate in the source to start copying from.\n * @param sw - The width of the rectangle to copy.\n * @param sh - The height of the rectangle to copy.\n * @param mask - An optional Uint8Array mask (0-255). 0 is transparent, 255 is opaque.\n * @param maskType - type of mask\n */\nexport function writeImageData(target: ImageData, source: ImageData, x: number, y: number, sx: number = 0, sy: number = 0, sw: number = source.width, sh: number = source.height, mask: Uint8Array | null = null, maskType: MaskType = MaskType.BINARY): void {\n const dstW = target.width;\n const dstH = target.height;\n const dstData = target.data;\n const srcW = source.width;\n const srcData = source.data;\n const clip = resolveBlitClipping(x, y, sx, sy, sw, sh, dstW, dstH, srcW, source.height, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const useMask = !!mask;\n for (let row = 0; row < copyH; row++) {\n const currentDstY = dstY + row;\n const currentSrcY = srcY + row;\n const dstStart = (currentDstY * dstW + dstX) * 4;\n const srcStart = (currentSrcY * srcW + srcX) * 4;\n if (useMask && mask) {\n for (let ix = 0; ix < copyW; ix++) {\n const mi = currentSrcY * srcW + (srcX + ix);\n const alpha = mask[mi];\n if (alpha === 0) {\n continue;\n }\n const di = dstStart + ix * 4;\n const si = srcStart + ix * 4;\n if (maskType === MaskType.BINARY || alpha === 255) {\n dstData[di] = srcData[si];\n dstData[di + 1] = srcData[si + 1];\n dstData[di + 2] = srcData[si + 2];\n dstData[di + 3] = srcData[si + 3];\n } else {\n const a = alpha / 255;\n const invA = 1 - a;\n dstData[di] = srcData[si] * a + dstData[di] * invA;\n dstData[di + 1] = srcData[si + 1] * a + dstData[di + 1] * invA;\n dstData[di + 2] = srcData[si + 2] * a + dstData[di + 2] * invA;\n dstData[di + 3] = srcData[si + 3] * a + dstData[di + 3] * invA;\n }\n }\n } else {\n const byteLen = copyW * 4;\n const sub = srcData.subarray(srcStart, srcStart + byteLen);\n dstData.set(sub, dstStart);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfQkxJVCA9IG1ha2VDbGlwcGVkQmxpdCgpXG5cbi8qKlxuICogV3JpdGVzIGltYWdlIGRhdGEgZnJvbSBhIHNvdXJjZSB0byBhIHRhcmdldCB3aXRoIHN1cHBvcnQgZm9yIGNsaXBwaW5nIGFuZCBhbHBoYSBtYXNraW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZGVzdGluYXRpb24gSW1hZ2VEYXRhIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBpbiB0aGUgdGFyZ2V0IHdoZXJlIGRyYXdpbmcgc3RhcnRzLlxuICogQHBhcmFtIHkgLSBUaGUgeS1jb29yZGluYXRlIGluIHRoZSB0YXJnZXQgd2hlcmUgZHJhd2luZyBzdGFydHMuXG4gKiBAcGFyYW0gc3ggLSBUaGUgeC1jb29yZGluYXRlIGluIHRoZSBzb3VyY2UgdG8gc3RhcnQgY29weWluZyBmcm9tLlxuICogQHBhcmFtIHN5IC0gVGhlIHktY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbS5cbiAqIEBwYXJhbSBzdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvcHkuXG4gKiBAcGFyYW0gc2ggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdG8gY29weS5cbiAqIEBwYXJhbSBtYXNrIC0gQW4gb3B0aW9uYWwgVWludDhBcnJheSBtYXNrICgwLTI1NSkuIDAgaXMgdHJhbnNwYXJlbnQsIDI1NSBpcyBvcGFxdWUuXG4gKiBAcGFyYW0gbWFza1R5cGUgLSB0eXBlIG9mIG1hc2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhKFxuICB0YXJnZXQ6IEltYWdlRGF0YSxcbiAgc291cmNlOiBJbWFnZURhdGEsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBzeDogbnVtYmVyID0gMCxcbiAgc3k6IG51bWJlciA9IDAsXG4gIHN3OiBudW1iZXIgPSBzb3VyY2Uud2lkdGgsXG4gIHNoOiBudW1iZXIgPSBzb3VyY2UuaGVpZ2h0LFxuICBtYXNrOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4gIG1hc2tUeXBlOiBNYXNrVHlwZSA9IE1hc2tUeXBlLkJJTkFSWSxcbik6IHZvaWQge1xuICBjb25zdCBkc3RXID0gdGFyZ2V0LndpZHRoXG4gIGNvbnN0IGRzdEggPSB0YXJnZXQuaGVpZ2h0XG4gIGNvbnN0IGRzdERhdGEgPSB0YXJnZXQuZGF0YVxuICBjb25zdCBzcmNXID0gc291cmNlLndpZHRoXG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsIHksIHN4LCBzeSwgc3csIHNoLFxuICAgIGRzdFcsIGRzdEgsIHNyY1csIHNvdXJjZS5oZWlnaHQsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IHVzZU1hc2sgPSAhIW1hc2tcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBjdXJyZW50RHN0WSA9IGRzdFkgKyByb3dcbiAgICBjb25zdCBjdXJyZW50U3JjWSA9IHNyY1kgKyByb3dcblxuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGN1cnJlbnREc3RZICogZHN0VyArIGRzdFgpICogNFxuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKGN1cnJlbnRTcmNZICogc3JjVyArIHNyY1gpICogNFxuXG4gICAgaWYgKHVzZU1hc2sgJiYgbWFzaykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGNvcHlXOyBpeCsrKSB7XG4gICAgICAgIGNvbnN0IG1pID0gY3VycmVudFNyY1kgKiBzcmNXICsgKHNyY1ggKyBpeClcbiAgICAgICAgY29uc3QgYWxwaGEgPSBtYXNrW21pXVxuXG4gICAgICAgIGlmIChhbHBoYSA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaSA9IGRzdFN0YXJ0ICsgKGl4ICogNClcbiAgICAgICAgY29uc3Qgc2kgPSBzcmNTdGFydCArIChpeCAqIDQpXG5cbiAgICAgICAgaWYgKG1hc2tUeXBlID09PSBNYXNrVHlwZS5CSU5BUlkgfHwgYWxwaGEgPT09IDI1NSkge1xuICAgICAgICAgIGRzdERhdGFbZGldID0gc3JjRGF0YVtzaV1cbiAgICAgICAgICBkc3REYXRhW2RpICsgMV0gPSBzcmNEYXRhW3NpICsgMV1cbiAgICAgICAgICBkc3REYXRhW2RpICsgMl0gPSBzcmNEYXRhW3NpICsgMl1cbiAgICAgICAgICBkc3REYXRhW2RpICsgM10gPSBzcmNEYXRhW3NpICsgM11cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhID0gYWxwaGEgLyAyNTVcbiAgICAgICAgICBjb25zdCBpbnZBID0gMSAtIGFcblxuICAgICAgICAgIGRzdERhdGFbZGldID0gc3JjRGF0YVtzaV0gKiBhICsgZHN0RGF0YVtkaV0gKiBpbnZBXG4gICAgICAgICAgZHN0RGF0YVtkaSArIDFdID0gc3JjRGF0YVtzaSArIDFdICogYSArIGRzdERhdGFbZGkgKyAxXSAqIGludkFcbiAgICAgICAgICBkc3REYXRhW2RpICsgMl0gPSBzcmNEYXRhW3NpICsgMl0gKiBhICsgZHN0RGF0YVtkaSArIDJdICogaW52QVxuICAgICAgICAgIGRzdERhdGFbZGkgKyAzXSA9IHNyY0RhdGFbc2kgKyAzXSAqIGEgKyBkc3REYXRhW2RpICsgM10gKiBpbnZBXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnl0ZUxlbiA9IGNvcHlXICogNFxuICAgICAgY29uc3Qgc3ViID0gc3JjRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBieXRlTGVuKVxuICAgICAgZHN0RGF0YS5zZXQoc3ViLCBkc3RTdGFydClcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of an {@link ImageData} object.\n *\n * This function performs a direct memory copy from a {@link Uint8ClampedArray}\n * into the target {@link ImageData} buffer. It supports both {@link Rect}\n * objects and discrete coordinates.\n *\n * @param imageData - The target {@link ImageData} to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A {@link Rect} object defining the destination region.\n */\nexport function writeImageDataBuffer(imageData: ImageData, data: Uint8ClampedArray, rect: Rect): void;\n/**\n * @param imageData - The target {@link ImageData} to write into.\n * @param data - The source pixel data (RGBA). Must match the width/height.\n * @param x - The starting horizontal coordinate in the target.\n * @param y - The starting vertical coordinate in the target.\n * @param w - The width of the region to write.\n * @param h - The height of the region to write.\n */\nexport function writeImageDataBuffer(imageData: ImageData, data: Uint8ClampedArray, x: number, y: number, w: number, h: number): void;\nexport function writeImageDataBuffer(imageData: ImageData, data: Uint8ClampedArray, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const {\n width: dstW,\n height: dstH,\n data: dst\n } = imageData;\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const dstStart = ((dstY + row) * dstW + dstX) * 4;\n const srcStart = ((srcY + row) * w + srcX) * 4;\n dst.set(data.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIENvcGllcyBhIHBpeGVsIGJ1ZmZlciBpbnRvIGEgc3BlY2lmaWMgcmVnaW9uIG9mIGFuIHtAbGluayBJbWFnZURhdGF9IG9iamVjdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZGlyZWN0IG1lbW9yeSBjb3B5IGZyb20gYSB7QGxpbmsgVWludDhDbGFtcGVkQXJyYXl9XG4gKiBpbnRvIHRoZSB0YXJnZXQge0BsaW5rIEltYWdlRGF0YX0gYnVmZmVyLiBJdCBzdXBwb3J0cyBib3RoIHtAbGluayBSZWN0fVxuICogb2JqZWN0cyBhbmQgZGlzY3JldGUgY29vcmRpbmF0ZXMuXG4gKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSB0YXJnZXQge0BsaW5rIEltYWdlRGF0YX0gdG8gd3JpdGUgaW50by4gTXVzdCBtYXRjaCB0aGUgcmVjdCB3aWR0aC9oZWlnaHQuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBzb3VyY2UgcGl4ZWwgZGF0YSAoUkdCQSkuXG4gKiBAcGFyYW0gcmVjdCAtIEEge0BsaW5rIFJlY3R9IG9iamVjdCBkZWZpbmluZyB0aGUgZGVzdGluYXRpb24gcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIoXG4gIGltYWdlRGF0YTogSW1hZ2VEYXRhLFxuICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgcmVjdDogUmVjdCxcbik6IHZvaWRcbi8qKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSB0YXJnZXQge0BsaW5rIEltYWdlRGF0YX0gdG8gd3JpdGUgaW50by5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHNvdXJjZSBwaXhlbCBkYXRhIChSR0JBKS4gTXVzdCBtYXRjaCB0aGUgd2lkdGgvaGVpZ2h0LlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIHdyaXRlLlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gd3JpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YUJ1ZmZlcihcbiAgaW1hZ2VEYXRhOiBJbWFnZURhdGEsXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIoXG4gIGltYWdlRGF0YTogSW1hZ2VEYXRhLFxuICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgX3g6IFJlY3QgfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDogeyB4OiBfeCwgeTogX3khLCB3OiBfdyEsIGg6IF9oISB9XG5cbiAgY29uc3QgeyB3aWR0aDogZHN0VywgaGVpZ2h0OiBkc3RILCBkYXRhOiBkc3QgfSA9IGltYWdlRGF0YVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsXG4gICAgeSxcbiAgICAwLFxuICAgIDAsXG4gICAgdyxcbiAgICBoLFxuICAgIGRzdFcsXG4gICAgZHN0SCxcbiAgICB3LFxuICAgIGgsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IHJvd0xlbiA9IGNvcHlXICogNFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKChkc3RZICsgcm93KSAqIGRzdFcgKyBkc3RYKSAqIDRcbiAgICBjb25zdCBzcmNTdGFydCA9ICgoc3JjWSArIHJvdykgKiB3ICsgc3JjWCkgKiA0XG5cbiAgICBkc3Quc2V0KGRhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgcm93TGVuKSwgZHN0U3RhcnQpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Calculates the frequency of each palette index based on the image data.\n * The index of the returned array maps directly to the index of the palette.\n * @param indexedImage - The source image containing data and palette definitions.\n * @returns A typed array where each entry represents the total count of that palette index.\n */\nexport function getIndexedImageColorCounts(indexedImage: IndexedImage): Int32Array {\n const data = indexedImage.data;\n const palette = indexedImage.palette;\n const frequencies = new Int32Array(palette.length);\n for (let i = 0; i < data.length; i++) {\n const colorIndex = data[i]!;\n frequencies[colorIndex]++;\n }\n return frequencies;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbmRleGVkSW1hZ2UgfSBmcm9tICcuL0luZGV4ZWRJbWFnZS50cydcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBwYWxldHRlIGluZGV4IGJhc2VkIG9uIHRoZSBpbWFnZSBkYXRhLlxuICogVGhlIGluZGV4IG9mIHRoZSByZXR1cm5lZCBhcnJheSBtYXBzIGRpcmVjdGx5IHRvIHRoZSBpbmRleCBvZiB0aGUgcGFsZXR0ZS5cbiAqIEBwYXJhbSBpbmRleGVkSW1hZ2UgLSBUaGUgc291cmNlIGltYWdlIGNvbnRhaW5pbmcgZGF0YSBhbmQgcGFsZXR0ZSBkZWZpbml0aW9ucy5cbiAqIEByZXR1cm5zIEEgdHlwZWQgYXJyYXkgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIHRoZSB0b3RhbCBjb3VudCBvZiB0aGF0IHBhbGV0dGUgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmRleGVkSW1hZ2VDb2xvckNvdW50cyhpbmRleGVkSW1hZ2U6IEluZGV4ZWRJbWFnZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBkYXRhID0gaW5kZXhlZEltYWdlLmRhdGFcbiAgY29uc3QgcGFsZXR0ZSA9IGluZGV4ZWRJbWFnZS5wYWxldHRlXG4gIGNvbnN0IGZyZXF1ZW5jaWVzID0gbmV3IEludDMyQXJyYXkocGFsZXR0ZS5sZW5ndGgpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY29sb3JJbmRleCA9IGRhdGFbaV0hXG4gICAgZnJlcXVlbmNpZXNbY29sb3JJbmRleF0rK1xuICB9XG5cbiAgcmV0dXJuIGZyZXF1ZW5jaWVzXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\n\n/**\n * Represents an image using a palette-based indexing system.\n * Instead of storing 4 bytes (RGBA) per pixel, this class stores a single index\n * into a color palette. This format is optimized for memory efficiency and\n * high-speed pattern matching or recoloring operations.\n */\nexport class IndexedImage {\n /** The width of the image in pixels. */\n public readonly width: number;\n /** The height of the image in pixels. */\n public readonly height: number;\n /** Flat array of palette indices. Index = x + (y * width). */\n public readonly data: Int32Array;\n /** The palette of unique 32-bit colors (ABGR/RGBA packed) found in the image. */\n public readonly palette: Uint32Array;\n /** The specific index in the palette reserved for fully transparent pixels. */\n public readonly transparentPalletIndex: number;\n\n /**\n * @param width - Image width.\n * @param height - Image height.\n * @param data - The indexed pixel data.\n * @param palette - The array of packed colors.\n * @param transparentPalletIndex - The index representing alpha 0.\n */\n constructor(width: number, height: number, data: Int32Array, palette: Uint32Array, transparentPalletIndex: number) {\n this.width = width;\n this.height = height;\n this.data = data;\n this.palette = palette;\n this.transparentPalletIndex = transparentPalletIndex;\n }\n\n /**\n * Creates an IndexedImage from standard browser ImageData.\n * @param imageData - The source ImageData to convert.\n * @returns A new IndexedImage instance.\n */\n static fromImageData(imageData: ImageData): IndexedImage {\n return IndexedImage.fromRaw(imageData.data, imageData.width, imageData.height);\n }\n\n /**\n * Creates an IndexedImage from a raw byte buffer and dimensions.\n * Any pixel with an alpha channel of 0 is normalized to the transparent palette index.\n * @param data - Raw RGBA byte data.\n * @param width - Image width.\n * @param height - Image height.\n * @returns A new IndexedImage instance.\n */\n static fromRaw(data: Uint8ClampedArray, width: number, height: number): IndexedImage {\n const buffer = data.buffer;\n const rawData = new Uint32Array(buffer);\n const indexedData = new Int32Array(rawData.length);\n const colorMap = new Map<number, number>();\n const transparentColor = 0;\n const transparentPalletIndex = 0;\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex);\n for (let i = 0; i < rawData.length; i++) {\n const pixel = rawData[i] as number;\n const alpha = pixel >>> 24 & 0xFF;\n const isTransparent = alpha === 0;\n const colorKey = isTransparent ? transparentColor : pixel >>> 0;\n let id = colorMap.get(colorKey);\n if (id === undefined) {\n id = colorMap.size;\n colorMap.set(colorKey, id);\n }\n indexedData[i] = id;\n }\n const palette = Uint32Array.from(colorMap.keys());\n return new IndexedImage(width, height, indexedData, palette, transparentPalletIndex);\n }\n\n /**\n * Retrieves the 32-bit packed color value at the given coordinates.\n * @param x - X coordinate.\n * @param y - Y coordinate.\n * @returns The packed color from the palette.\n */\n public getColorAt(x: number, y: number): Color32 {\n const index = x + y * this.width;\n const paletteIndex = this.data[index];\n return this.palette[paletteIndex] as Color32;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1hZ2UgdXNpbmcgYSBwYWxldHRlLWJhc2VkIGluZGV4aW5nIHN5c3RlbS5cbiAqIEluc3RlYWQgb2Ygc3RvcmluZyA0IGJ5dGVzIChSR0JBKSBwZXIgcGl4ZWwsIHRoaXMgY2xhc3Mgc3RvcmVzIGEgc2luZ2xlIGluZGV4XG4gKiBpbnRvIGEgY29sb3IgcGFsZXR0ZS4gVGhpcyBmb3JtYXQgaXMgb3B0aW1pemVkIGZvciBtZW1vcnkgZWZmaWNpZW5jeSBhbmRcbiAqIGhpZ2gtc3BlZWQgcGF0dGVybiBtYXRjaGluZyBvciByZWNvbG9yaW5nIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleGVkSW1hZ2Uge1xuICAvKiogVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuICovXG4gIHB1YmxpYyByZWFkb25seSB3aWR0aDogbnVtYmVyXG4gIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuICovXG4gIHB1YmxpYyByZWFkb25seSBoZWlnaHQ6IG51bWJlclxuICAvKiogRmxhdCBhcnJheSBvZiBwYWxldHRlIGluZGljZXMuIEluZGV4ID0geCArICh5ICogd2lkdGgpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YTogSW50MzJBcnJheVxuICAvKiogVGhlIHBhbGV0dGUgb2YgdW5pcXVlIDMyLWJpdCBjb2xvcnMgKEFCR1IvUkdCQSBwYWNrZWQpIGZvdW5kIGluIHRoZSBpbWFnZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhbGV0dGU6IFVpbnQzMkFycmF5XG4gIC8qKiBUaGUgc3BlY2lmaWMgaW5kZXggaW4gdGhlIHBhbGV0dGUgcmVzZXJ2ZWQgZm9yIGZ1bGx5IHRyYW5zcGFyZW50IHBpeGVscy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYW5zcGFyZW50UGFsbGV0SW5kZXg6IG51bWJlclxuXG4gIC8qKlxuICAgKiBAcGFyYW0gd2lkdGggLSBJbWFnZSB3aWR0aC5cbiAgICogQHBhcmFtIGhlaWdodCAtIEltYWdlIGhlaWdodC5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5kZXhlZCBwaXhlbCBkYXRhLlxuICAgKiBAcGFyYW0gcGFsZXR0ZSAtIFRoZSBhcnJheSBvZiBwYWNrZWQgY29sb3JzLlxuICAgKiBAcGFyYW0gdHJhbnNwYXJlbnRQYWxsZXRJbmRleCAtIFRoZSBpbmRleCByZXByZXNlbnRpbmcgYWxwaGEgMC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGF0YTogSW50MzJBcnJheSxcbiAgICBwYWxldHRlOiBVaW50MzJBcnJheSxcbiAgICB0cmFuc3BhcmVudFBhbGxldEluZGV4OiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMud2lkdGggPSB3aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIHRoaXMucGFsZXR0ZSA9IHBhbGV0dGVcbiAgICB0aGlzLnRyYW5zcGFyZW50UGFsbGV0SW5kZXggPSB0cmFuc3BhcmVudFBhbGxldEluZGV4XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBJbmRleGVkSW1hZ2UgZnJvbSBzdGFuZGFyZCBicm93c2VyIEltYWdlRGF0YS5cbiAgICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIEEgbmV3IEluZGV4ZWRJbWFnZSBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBmcm9tSW1hZ2VEYXRhKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogSW5kZXhlZEltYWdlIHtcbiAgICByZXR1cm4gSW5kZXhlZEltYWdlLmZyb21SYXcoaW1hZ2VEYXRhLmRhdGEsIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEluZGV4ZWRJbWFnZSBmcm9tIGEgcmF3IGJ5dGUgYnVmZmVyIGFuZCBkaW1lbnNpb25zLlxuICAgKiBBbnkgcGl4ZWwgd2l0aCBhbiBhbHBoYSBjaGFubmVsIG9mIDAgaXMgbm9ybWFsaXplZCB0byB0aGUgdHJhbnNwYXJlbnQgcGFsZXR0ZSBpbmRleC5cbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgUkdCQSBieXRlIGRhdGEuXG4gICAqIEBwYXJhbSB3aWR0aCAtIEltYWdlIHdpZHRoLlxuICAgKiBAcGFyYW0gaGVpZ2h0IC0gSW1hZ2UgaGVpZ2h0LlxuICAgKiBAcmV0dXJucyBBIG5ldyBJbmRleGVkSW1hZ2UgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZnJvbVJhdyhcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBJbmRleGVkSW1hZ2Uge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGRhdGEuYnVmZmVyXG4gICAgY29uc3QgcmF3RGF0YSA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpXG4gICAgY29uc3QgaW5kZXhlZERhdGEgPSBuZXcgSW50MzJBcnJheShyYXdEYXRhLmxlbmd0aClcbiAgICBjb25zdCBjb2xvck1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KClcbiAgICBjb25zdCB0cmFuc3BhcmVudENvbG9yID0gMFxuICAgIGNvbnN0IHRyYW5zcGFyZW50UGFsbGV0SW5kZXggPSAwXG5cbiAgICAvLyBJbml0aWFsaXplIHBhbGV0dGUgd2l0aCBub3JtYWxpemVkIHRyYW5zcGFyZW50IGNvbG9yXG4gICAgY29sb3JNYXAuc2V0KHRyYW5zcGFyZW50Q29sb3IsIHRyYW5zcGFyZW50UGFsbGV0SW5kZXgpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0RhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBpeGVsID0gcmF3RGF0YVtpXSBhcyBudW1iZXJcbiAgICAgIGNvbnN0IGFscGhhID0gKHBpeGVsID4+PiAyNCkgJiAweEZGXG4gICAgICBjb25zdCBpc1RyYW5zcGFyZW50ID0gYWxwaGEgPT09IDBcbiAgICAgIGNvbnN0IGNvbG9yS2V5ID0gaXNUcmFuc3BhcmVudCA/IHRyYW5zcGFyZW50Q29sb3IgOiAocGl4ZWwgPj4+IDApXG5cbiAgICAgIGxldCBpZCA9IGNvbG9yTWFwLmdldChjb2xvcktleSlcblxuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWQgPSBjb2xvck1hcC5zaXplXG4gICAgICAgIGNvbG9yTWFwLnNldChjb2xvcktleSwgaWQpXG4gICAgICB9XG5cbiAgICAgIGluZGV4ZWREYXRhW2ldID0gaWRcbiAgICB9XG5cbiAgICBjb25zdCBwYWxldHRlID0gVWludDMyQXJyYXkuZnJvbShjb2xvck1hcC5rZXlzKCkpXG5cbiAgICByZXR1cm4gbmV3IEluZGV4ZWRJbWFnZShcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgaW5kZXhlZERhdGEsXG4gICAgICBwYWxldHRlLFxuICAgICAgdHJhbnNwYXJlbnRQYWxsZXRJbmRleCxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSAzMi1iaXQgcGFja2VkIGNvbG9yIHZhbHVlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHggLSBYIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSB5IC0gWSBjb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyBUaGUgcGFja2VkIGNvbG9yIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sb3JBdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbG9yMzIge1xuICAgIGNvbnN0IGluZGV4ID0geCArIHkgKiB0aGlzLndpZHRoXG4gICAgY29uc3QgcGFsZXR0ZUluZGV4ID0gdGhpcy5kYXRhW2luZGV4XVxuXG4gICAgcmV0dXJuIHRoaXMucGFsZXR0ZVtwYWxldHRlSW5kZXhdIGFzIENvbG9yMzJcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { packColor } from '../color';\n/**\n * Calculates the area-weighted average color of an IndexedImage.\n * This accounts for how often each palette index appears in the pixel data.\n * @param indexedImage - The IndexedImage containing pixel indices and the palette.\n * @param includeTransparent - Whether to include the transparent pixels in the average.\n * @returns The average RGBA color of the image.\n */\nexport function indexedImageToAverageColor(indexedImage: IndexedImage, includeTransparent: boolean = false): Color32 {\n const {\n data,\n palette,\n transparentPalletIndex\n } = indexedImage;\n const counts = new Uint32Array(palette.length);\n\n // Tally occurrences of each index\n for (let i = 0; i < data.length; i++) {\n const id = data[i]!;\n counts[id]!++;\n }\n let rSum = 0;\n let gSum = 0;\n let bSum = 0;\n let aSum = 0;\n let totalWeight = 0;\n for (let id = 0; id < counts.length; id++) {\n const weight = counts[id]!;\n if (weight === 0) {\n continue;\n }\n if (!includeTransparent && id === transparentPalletIndex) {\n continue;\n }\n const color = palette[id]! >>> 0;\n const r = color & 0xFF;\n const g = color >> 8 & 0xFF;\n const b = color >> 16 & 0xFF;\n const a = color >> 24 & 0xFF;\n rSum += r * weight;\n gSum += g * weight;\n bSum += b * weight;\n aSum += a * weight;\n totalWeight += weight;\n }\n if (totalWeight === 0) {\n return packColor(0, 0, 0, 0);\n }\n const r = rSum / totalWeight | 0;\n const g = gSum / totalWeight | 0;\n const b = bSum / totalWeight | 0;\n const a = aSum / totalWeight | 0;\n return packColor(r, g, b, a);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgcGFja0NvbG9yIH0gZnJvbSAnLi4vY29sb3InXG5pbXBvcnQgdHlwZSB7IEluZGV4ZWRJbWFnZSB9IGZyb20gJy4vSW5kZXhlZEltYWdlJ1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFyZWEtd2VpZ2h0ZWQgYXZlcmFnZSBjb2xvciBvZiBhbiBJbmRleGVkSW1hZ2UuXG4gKiBUaGlzIGFjY291bnRzIGZvciBob3cgb2Z0ZW4gZWFjaCBwYWxldHRlIGluZGV4IGFwcGVhcnMgaW4gdGhlIHBpeGVsIGRhdGEuXG4gKiBAcGFyYW0gaW5kZXhlZEltYWdlIC0gVGhlIEluZGV4ZWRJbWFnZSBjb250YWluaW5nIHBpeGVsIGluZGljZXMgYW5kIHRoZSBwYWxldHRlLlxuICogQHBhcmFtIGluY2x1ZGVUcmFuc3BhcmVudCAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIHRoZSBhdmVyYWdlLlxuICogQHJldHVybnMgVGhlIGF2ZXJhZ2UgUkdCQSBjb2xvciBvZiB0aGUgaW1hZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleGVkSW1hZ2VUb0F2ZXJhZ2VDb2xvcihcbiAgaW5kZXhlZEltYWdlOiBJbmRleGVkSW1hZ2UsXG4gIGluY2x1ZGVUcmFuc3BhcmVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogQ29sb3IzMiB7XG4gIGNvbnN0IHsgZGF0YSwgcGFsZXR0ZSwgdHJhbnNwYXJlbnRQYWxsZXRJbmRleCB9ID0gaW5kZXhlZEltYWdlXG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShwYWxldHRlLmxlbmd0aClcblxuICAvLyBUYWxseSBvY2N1cnJlbmNlcyBvZiBlYWNoIGluZGV4XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGlkID0gZGF0YVtpXSFcbiAgICBjb3VudHNbaWRdISsrXG4gIH1cblxuICBsZXQgclN1bSA9IDBcbiAgbGV0IGdTdW0gPSAwXG4gIGxldCBiU3VtID0gMFxuICBsZXQgYVN1bSA9IDBcbiAgbGV0IHRvdGFsV2VpZ2h0ID0gMFxuXG4gIGZvciAobGV0IGlkID0gMDsgaWQgPCBjb3VudHMubGVuZ3RoOyBpZCsrKSB7XG4gICAgY29uc3Qgd2VpZ2h0ID0gY291bnRzW2lkXSFcblxuICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlVHJhbnNwYXJlbnQgJiYgaWQgPT09IHRyYW5zcGFyZW50UGFsbGV0SW5kZXgpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY29sb3IgPSBwYWxldHRlW2lkXSEgPj4+IDBcblxuICAgIGNvbnN0IHIgPSBjb2xvciAmIDB4RkZcbiAgICBjb25zdCBnID0gKGNvbG9yID4+IDgpICYgMHhGRlxuICAgIGNvbnN0IGIgPSAoY29sb3IgPj4gMTYpICYgMHhGRlxuICAgIGNvbnN0IGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRlxuXG4gICAgclN1bSArPSByICogd2VpZ2h0XG4gICAgZ1N1bSArPSBnICogd2VpZ2h0XG4gICAgYlN1bSArPSBiICogd2VpZ2h0XG4gICAgYVN1bSArPSBhICogd2VpZ2h0XG4gICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0XG4gIH1cblxuICBpZiAodG90YWxXZWlnaHQgPT09IDApIHtcbiAgICByZXR1cm4gcGFja0NvbG9yKDAsIDAsIDAsIDApXG4gIH1cblxuICBjb25zdCByID0gKHJTdW0gLyB0b3RhbFdlaWdodCkgfCAwXG4gIGNvbnN0IGcgPSAoZ1N1bSAvIHRvdGFsV2VpZ2h0KSB8IDBcbiAgY29uc3QgYiA9IChiU3VtIC8gdG90YWxXZWlnaHQpIHwgMFxuICBjb25zdCBhID0gKGFTdW0gLyB0b3RhbFdlaWdodCkgfCAwXG5cbiAgcmV0dXJuIHBhY2tDb2xvcihyLCBnLCBiLCBhKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Converts an IndexedImage back into standard ImageData.\n */\nexport function indexedImageToImageData(indexedImage: IndexedImage): ImageData {\n const {\n width,\n height,\n data,\n palette\n } = indexedImage;\n const result = new ImageData(width, height);\n const data32 = new Uint32Array(result.data.buffer);\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i];\n const color = palette[paletteIndex];\n data32[i] = color;\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbmRleGVkSW1hZ2UgfSBmcm9tICcuL0luZGV4ZWRJbWFnZSdcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBJbmRleGVkSW1hZ2UgYmFjayBpbnRvIHN0YW5kYXJkIEltYWdlRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4ZWRJbWFnZVRvSW1hZ2VEYXRhKGluZGV4ZWRJbWFnZTogSW5kZXhlZEltYWdlKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkYXRhLCBwYWxldHRlIH0gPSBpbmRleGVkSW1hZ2VcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KVxuICBjb25zdCBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0LmRhdGEuYnVmZmVyKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBhbGV0dGVJbmRleCA9IGRhdGFbaV1cbiAgICBjb25zdCBjb2xvciA9IHBhbGV0dGVbcGFsZXR0ZUluZGV4XVxuXG4gICAgZGF0YTMyW2ldID0gY29sb3JcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { IndexedImage } from '../index';\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleIndexedImage(source: IndexedImage, factor: number): IndexedImage {\n const {\n data,\n width,\n height\n } = resample32(source.data, source.width, source.height, factor);\n return new IndexedImage(width, height, data, source.palette, source.transparentPalletIndex);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNhbXBsZXMgYW4gSW5kZXhlZEltYWdlIGJ5IGEgc3BlY2lmaWMgZmFjdG9yIHVzaW5nIG5lYXJlc3QgbmVpZ2hib3JcbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuaW1wb3J0IHsgSW5kZXhlZEltYWdlIH0gZnJvbSAnLi4vaW5kZXgnXG5pbXBvcnQgeyByZXNhbXBsZTMyIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzYW1wbGUzMidcblxuLyoqXG4gKiBSZXNhbXBsZXMgYW4gSW5kZXhlZEltYWdlIGJ5IGEgc3BlY2lmaWMgZmFjdG9yIHVzaW5nIG5lYXJlc3QgbmVpZ2hib3JcbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlSW5kZXhlZEltYWdlKFxuICBzb3VyY2U6IEluZGV4ZWRJbWFnZSxcbiAgZmFjdG9yOiBudW1iZXIsXG4pOiBJbmRleGVkSW1hZ2Uge1xuXG4gIGNvbnN0IHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9ID0gcmVzYW1wbGUzMihcbiAgICBzb3VyY2UuZGF0YSxcbiAgICBzb3VyY2Uud2lkdGgsXG4gICAgc291cmNlLmhlaWdodCxcbiAgICBmYWN0b3IsXG4gIClcblxuICByZXR1cm4gbmV3IEluZGV4ZWRJbWFnZShcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZGF0YSxcbiAgICBzb3VyY2UucGFsZXR0ZSxcbiAgICBzb3VyY2UudHJhbnNwYXJlbnRQYWxsZXRJbmRleCxcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { fileToImageData } from '../../src';\n\n/**\n * A convenience wrapper that extracts the first {@link File} from an\n * {@link HTMLInputElement} change event and converts it into {@link ImageData}.\n *\n * This function handles the boilerplate of accessing the file list and checking\n * for existence. It is ideal for use directly in an `onchange` event listener.\n *\n * @param event - The change {@link Event} from an `<input type=\"file\">` element.\n *\n * @returns A promise that resolves to {@link ImageData} if a file was successfully\n * processed, or `null` if no file was selected or the input was cleared.\n *\n * @example\n * ```typescript\n * const input = document.querySelector('input[type=\"file\"]');\n *\n * input.addEventListener('change', async (event) => {\n * const imageData = await fileInputChangeToImageData(event);\n *\n * if (imageData) {\n * console.log('Image loaded:', imageData.width, imageData.height);\n * }\n * });\n * ```\n */\nexport async function fileInputChangeToImageData(event: Event): Promise<ImageData | null> {\n const target = event.target as HTMLInputElement;\n const file = target.files?.[0];\n if (!file) return null;\n return await fileToImageData(file);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmlsZVRvSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vc3JjJ1xuXG4vKipcbiAqIEEgY29udmVuaWVuY2Ugd3JhcHBlciB0aGF0IGV4dHJhY3RzIHRoZSBmaXJzdCB7QGxpbmsgRmlsZX0gZnJvbSBhblxuICoge0BsaW5rIEhUTUxJbnB1dEVsZW1lbnR9IGNoYW5nZSBldmVudCBhbmQgY29udmVydHMgaXQgaW50byB7QGxpbmsgSW1hZ2VEYXRhfS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGJvaWxlcnBsYXRlIG9mIGFjY2Vzc2luZyB0aGUgZmlsZSBsaXN0IGFuZCBjaGVja2luZ1xuICogZm9yIGV4aXN0ZW5jZS4gSXQgaXMgaWRlYWwgZm9yIHVzZSBkaXJlY3RseSBpbiBhbiBgb25jaGFuZ2VgIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFRoZSBjaGFuZ2Uge0BsaW5rIEV2ZW50fSBmcm9tIGFuIGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIEltYWdlRGF0YX0gaWYgYSBmaWxlIHdhcyBzdWNjZXNzZnVsbHlcbiAqIHByb2Nlc3NlZCwgb3IgYG51bGxgIGlmIG5vIGZpbGUgd2FzIHNlbGVjdGVkIG9yIHRoZSBpbnB1dCB3YXMgY2xlYXJlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpO1xuICpcbiAqIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChldmVudCkgPT4ge1xuICogICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBmaWxlSW5wdXRDaGFuZ2VUb0ltYWdlRGF0YShldmVudCk7XG4gKlxuICogICBpZiAoaW1hZ2VEYXRhKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0ltYWdlIGxvYWRlZDonLCBpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQpO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsZUlucHV0Q2hhbmdlVG9JbWFnZURhdGEoXG4gIGV2ZW50OiBFdmVudCxcbik6IFByb21pc2U8SW1hZ2VEYXRhIHwgbnVsbD4ge1xuICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuXG4gIGNvbnN0IGZpbGUgPSB0YXJnZXQuZmlsZXM/LlswXVxuICBpZiAoIWZpbGUpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVUb0ltYWdlRGF0YShmaWxlKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { OFFSCREEN_CANVAS_CTX_FAILED } from '../Canvas/_constants';\n\n/**\n * Thrown when the user provides a file that isn't an image.\n */\nexport class UnsupportedFormatError extends Error {\n constructor(mimeType: string) {\n super(`File type ${mimeType} is not a supported image format.`);\n this.name = 'UnsupportedFormatError';\n }\n}\n\n/**\n * Converts a browser {@link File} object into {@link ImageData}.\n * This utility handles the full pipeline of image decoding using hardware-accelerated\n * APIs {@link createImageBitmap} and {@link OffscreenCanvas}. It ensures that underlying\n * resources like `ImageBitmap` are properly closed even if the conversion fails.\n *\n * @param file - The image file to convert. Can be null or undefined.\n * @returns A `Promise` resolving to the pixel data as {@link ImageData},\n * or `null` if no file was provided.\n * @throws {@link UnsupportedFormatError}\n * Thrown if the provided file's MIME type does not start with `image/`.\n * @example\n * ```typescript\n * try {\n * const imageData = await fileToImageData(file);\n * if (imageData) {\n * console.log('Pixels:', imageData.data);\n * }\n * } catch (err) {\n * if (err instanceof UnsupportedFormatError) {\n * // Handle bad file type\n * }\n * }\n * ```\n */\nexport async function fileToImageData(file: File | null | undefined): Promise<ImageData | null> {\n if (!file) return null;\n if (!file.type.startsWith('image/')) {\n throw new UnsupportedFormatError(file.type);\n }\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(file);\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(OFFSCREEN_CANVAS_CTX_FAILED);\n ctx.drawImage(bitmap, 0, 0);\n return ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n } finally {\n bitmap?.close();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT0ZGU0NSRUVOX0NBTlZBU19DVFhfRkFJTEVEIH0gZnJvbSAnLi4vQ2FudmFzL19jb25zdGFudHMnXG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHVzZXIgcHJvdmlkZXMgYSBmaWxlIHRoYXQgaXNuJ3QgYW4gaW1hZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEZvcm1hdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtaW1lVHlwZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYEZpbGUgdHlwZSAke21pbWVUeXBlfSBpcyBub3QgYSBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0LmApXG4gICAgdGhpcy5uYW1lID0gJ1Vuc3VwcG9ydGVkRm9ybWF0RXJyb3InXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJyb3dzZXIge0BsaW5rIEZpbGV9IG9iamVjdCBpbnRvIHtAbGluayBJbWFnZURhdGF9LlxuICogVGhpcyB1dGlsaXR5IGhhbmRsZXMgdGhlIGZ1bGwgcGlwZWxpbmUgb2YgaW1hZ2UgZGVjb2RpbmcgdXNpbmcgaGFyZHdhcmUtYWNjZWxlcmF0ZWRcbiAqIEFQSXMge0BsaW5rIGNyZWF0ZUltYWdlQml0bWFwfSBhbmQge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30uIEl0IGVuc3VyZXMgdGhhdCB1bmRlcmx5aW5nXG4gKiByZXNvdXJjZXMgbGlrZSBgSW1hZ2VCaXRtYXBgIGFyZSBwcm9wZXJseSBjbG9zZWQgZXZlbiBpZiB0aGUgY29udmVyc2lvbiBmYWlscy5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBpbWFnZSBmaWxlIHRvIGNvbnZlcnQuIENhbiBiZSBudWxsIG9yIHVuZGVmaW5lZC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmluZyB0byB0aGUgcGl4ZWwgZGF0YSBhcyB7QGxpbmsgSW1hZ2VEYXRhfSxcbiAqIG9yIGBudWxsYCBpZiBubyBmaWxlIHdhcyBwcm92aWRlZC5cbiAqIEB0aHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkRm9ybWF0RXJyb3J9XG4gKiBUaHJvd24gaWYgdGhlIHByb3ZpZGVkIGZpbGUncyBNSU1FIHR5cGUgZG9lcyBub3Qgc3RhcnQgd2l0aCBgaW1hZ2UvYC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBmaWxlVG9JbWFnZURhdGEoZmlsZSk7XG4gKiAgIGlmIChpbWFnZURhdGEpIHtcbiAqICAgICBjb25zb2xlLmxvZygnUGl4ZWxzOicsIGltYWdlRGF0YS5kYXRhKTtcbiAqICAgfVxuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIGlmIChlcnIgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEZvcm1hdEVycm9yKSB7XG4gKiAgICAgLy8gSGFuZGxlIGJhZCBmaWxlIHR5cGVcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaWxlVG9JbWFnZURhdGEoXG4gIGZpbGU6IEZpbGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxJbWFnZURhdGEgfCBudWxsPiB7XG4gIGlmICghZmlsZSkgcmV0dXJuIG51bGxcblxuICBpZiAoIWZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZvcm1hdEVycm9yKGZpbGUudHlwZSlcbiAgfVxuXG4gIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGxcblxuICB0cnkge1xuICAgIGJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGZpbGUpXG5cbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKFxuICAgICAgYml0bWFwLndpZHRoLFxuICAgICAgYml0bWFwLmhlaWdodCxcbiAgICApXG5cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoT0ZGU0NSRUVOX0NBTlZBU19DVFhfRkFJTEVEKVxuXG4gICAgY3R4LmRyYXdJbWFnZShcbiAgICAgIGJpdG1hcCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgIClcblxuICAgIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICBiaXRtYXAud2lkdGgsXG4gICAgICBiaXRtYXAuaGVpZ2h0LFxuICAgIClcbiAgfSBmaW5hbGx5IHtcbiAgICBiaXRtYXA/LmNsb3NlKClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","// Cache the Promise to prevent race conditions during initialization\nlet formatsPromise: Promise<string[]> | null = null;\nconst defaultRasterMimes = ['image/png', 'image/jpeg', 'image/webp', 'image/avif', 'image/gif', 'image/bmp'];\n\n/**\n * Probes the browser environment to determine which image MIME types are\n * supported for pixel-level operations.\n * This function performs a one-time check by attempting to convert a\n * {@link OffscreenCanvas} to MIME types. The result is\n * cached to prevent redundant hardware-accelerated operations on\n * subsequent calls.\n * @param rasterMimes List of MIME types to check\n * @default ['image/png',\n * 'image/jpeg',\n * 'image/webp',\n * 'image/avif',\n * 'image/gif',\n * 'image/bmp']\n * @returns A `Promise` resolving to an array of supported MIME\n * types from the `rasterMimes` list.\n * @throws {Error} If the {@link OffscreenCanvas} context cannot be initialized.\n * @example\n * ```typescript\n * const supported = await getSupportedPixelFormats();\n * if (supported.includes('image/avif')) {\n * console.log('High-efficiency formats available');\n * }\n * ```\n */\nexport async function getSupportedPixelFormats(rasterMimes = defaultRasterMimes): Promise<string[]> {\n if (formatsPromise) {\n return formatsPromise;\n }\n const probeCanvas = async () => {\n const canvas = new OffscreenCanvas(1, 1);\n const results = await Promise.all(rasterMimes.map(async mime => {\n try {\n const blob = await canvas.convertToBlob({\n type: mime\n });\n return blob.type === mime ? mime : null;\n } catch {\n return null;\n }\n }));\n return results.filter((type): type is string => {\n return type !== null;\n });\n };\n\n // By chaining .catch here, the microtask guarantees formatsPromise\n // is assigned the promise BEFORE the catch block runs to reset it.\n formatsPromise = probeCanvas().catch(error => {\n formatsPromise = null;\n throw error;\n });\n return formatsPromise;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ2FjaGUgdGhlIFByb21pc2UgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIGluaXRpYWxpemF0aW9uXG5sZXQgZm9ybWF0c1Byb21pc2U6IFByb21pc2U8c3RyaW5nW10+IHwgbnVsbCA9IG51bGxcblxuY29uc3QgZGVmYXVsdFJhc3Rlck1pbWVzID0gW1xuICAnaW1hZ2UvcG5nJyxcbiAgJ2ltYWdlL2pwZWcnLFxuICAnaW1hZ2Uvd2VicCcsXG4gICdpbWFnZS9hdmlmJyxcbiAgJ2ltYWdlL2dpZicsXG4gICdpbWFnZS9ibXAnLFxuXVxuXG4vKipcbiAqIFByb2JlcyB0aGUgYnJvd3NlciBlbnZpcm9ubWVudCB0byBkZXRlcm1pbmUgd2hpY2ggaW1hZ2UgTUlNRSB0eXBlcyBhcmVcbiAqIHN1cHBvcnRlZCBmb3IgcGl4ZWwtbGV2ZWwgb3BlcmF0aW9ucy5cbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBvbmUtdGltZSBjaGVjayBieSBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgYVxuICoge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30gdG8gTUlNRSB0eXBlcy4gVGhlIHJlc3VsdCBpc1xuICogY2FjaGVkIHRvIHByZXZlbnQgcmVkdW5kYW50IGhhcmR3YXJlLWFjY2VsZXJhdGVkIG9wZXJhdGlvbnMgb25cbiAqIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBAcGFyYW0gcmFzdGVyTWltZXMgTGlzdCBvZiBNSU1FIHR5cGVzIHRvIGNoZWNrXG4gKiBAZGVmYXVsdCBbJ2ltYWdlL3BuZycsXG4gKiAgICdpbWFnZS9qcGVnJyxcbiAqICAgJ2ltYWdlL3dlYnAnLFxuICogICAnaW1hZ2UvYXZpZicsXG4gKiAgICdpbWFnZS9naWYnLFxuICogICAnaW1hZ2UvYm1wJ11cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgTUlNRVxuICogdHlwZXMgZnJvbSB0aGUgYHJhc3Rlck1pbWVzYCBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdXBwb3J0ZWQgPSBhd2FpdCBnZXRTdXBwb3J0ZWRQaXhlbEZvcm1hdHMoKTtcbiAqIGlmIChzdXBwb3J0ZWQuaW5jbHVkZXMoJ2ltYWdlL2F2aWYnKSkge1xuICogICBjb25zb2xlLmxvZygnSGlnaC1lZmZpY2llbmN5IGZvcm1hdHMgYXZhaWxhYmxlJyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN1cHBvcnRlZFBpeGVsRm9ybWF0cyhyYXN0ZXJNaW1lcyA9IGRlZmF1bHRSYXN0ZXJNaW1lcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKGZvcm1hdHNQcm9taXNlKSB7XG4gICAgcmV0dXJuIGZvcm1hdHNQcm9taXNlXG4gIH1cblxuICBjb25zdCBwcm9iZUNhbnZhcyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpXG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByYXN0ZXJNaW1lcy5tYXAoYXN5bmMgKG1pbWUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgY2FudmFzLmNvbnZlcnRUb0Jsb2Ioe1xuICAgICAgICAgICAgdHlwZTogbWltZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuIGJsb2IudHlwZSA9PT0gbWltZSA/IG1pbWUgOiBudWxsXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigodHlwZSk6IHR5cGUgaXMgc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiB0eXBlICE9PSBudWxsXG4gICAgfSlcbiAgfVxuXG4gIC8vIEJ5IGNoYWluaW5nIC5jYXRjaCBoZXJlLCB0aGUgbWljcm90YXNrIGd1YXJhbnRlZXMgZm9ybWF0c1Byb21pc2VcbiAgLy8gaXMgYXNzaWduZWQgdGhlIHByb21pc2UgQkVGT1JFIHRoZSBjYXRjaCBibG9jayBydW5zIHRvIHJlc2V0IGl0LlxuICBmb3JtYXRzUHJvbWlzZSA9IHByb2JlQ2FudmFzKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgZm9ybWF0c1Byb21pc2UgPSBudWxsXG5cbiAgICB0aHJvdyBlcnJvclxuICB9KVxuXG4gIHJldHVybiBmb3JtYXRzUHJvbWlzZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function applyBinaryMaskToAlphaMask(alphaMaskDst: AlphaMask, dstWidth: number, binaryMaskSrc: BinaryMask, srcWidth: number, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: reqWidth = 0,\n h: reqHeight = 0,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (dstWidth <= 0) return;\n if (binaryMaskSrc.length === 0) return;\n if (srcWidth <= 0) return;\n const dstHeight = alphaMaskDst.length / dstWidth | 0;\n const srcHeight = binaryMaskSrc.length / srcWidth | 0;\n if (dstHeight <= 0) return;\n if (srcHeight <= 0) return;\n const dstX0 = Math.max(0, targetX);\n const dstY0 = Math.max(0, targetY);\n const dstX1 = reqWidth > 0 ? Math.min(dstWidth, targetX + reqWidth) : dstWidth;\n const dstY1 = reqHeight > 0 ? Math.min(dstHeight, targetY + reqHeight) : dstHeight;\n if (dstX0 >= dstX1) return;\n if (dstY0 >= dstY1) return;\n const srcX0 = mx + (dstX0 - targetX);\n const srcY0 = my + (dstY0 - targetY);\n if (srcX0 >= srcWidth) return;\n if (srcY0 >= srcHeight) return;\n if (srcX0 + (dstX1 - dstX0) <= 0) return;\n if (srcY0 + (dstY1 - dstY0) <= 0) return;\n const iterW = Math.min(dstX1 - dstX0, srcWidth - srcX0);\n const iterH = Math.min(dstY1 - dstY0, srcHeight - srcY0);\n let dstIdx = dstY0 * dstWidth + dstX0;\n let srcIdx = srcY0 * srcWidth + srcX0;\n if (invertMask) {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW;\n let d = dstIdx;\n let s = srcIdx;\n while (d < dstEnd) {\n // inverted\n if (binaryMaskSrc[s] !== 0) {\n alphaMaskDst[d] = 0;\n }\n d++;\n s++;\n }\n dstIdx += dstWidth;\n srcIdx += srcWidth;\n }\n } else {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW;\n let d = dstIdx;\n let s = srcIdx;\n while (d < dstEnd) {\n // If binary mask is empty, clear the alpha pixel.\n if (binaryMaskSrc[s] === 0) {\n alphaMaskDst[d] = 0;\n }\n d++;\n s++;\n }\n dstIdx += dstWidth;\n srcIdx += srcWidth;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucywgQmluYXJ5TWFzayB9IGZyb20gJy4uL190eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QmluYXJ5TWFza1RvQWxwaGFNYXNrKFxuICBhbHBoYU1hc2tEc3Q6IEFscGhhTWFzayxcbiAgZHN0V2lkdGg6IG51bWJlcixcbiAgYmluYXJ5TWFza1NyYzogQmluYXJ5TWFzayxcbiAgc3JjV2lkdGg6IG51bWJlcixcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHJlcVdpZHRoID0gMCxcbiAgICBoOiByZXFIZWlnaHQgPSAwLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChkc3RXaWR0aCA8PSAwKSByZXR1cm5cbiAgaWYgKGJpbmFyeU1hc2tTcmMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgaWYgKHNyY1dpZHRoIDw9IDApIHJldHVyblxuXG4gIGNvbnN0IGRzdEhlaWdodCA9IChhbHBoYU1hc2tEc3QubGVuZ3RoIC8gZHN0V2lkdGgpIHwgMFxuICBjb25zdCBzcmNIZWlnaHQgPSAoYmluYXJ5TWFza1NyYy5sZW5ndGggLyBzcmNXaWR0aCkgfCAwXG5cbiAgaWYgKGRzdEhlaWdodCA8PSAwKSByZXR1cm5cbiAgaWYgKHNyY0hlaWdodCA8PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3RYMCA9IE1hdGgubWF4KDAsIHRhcmdldFgpXG4gIGNvbnN0IGRzdFkwID0gTWF0aC5tYXgoMCwgdGFyZ2V0WSlcbiAgY29uc3QgZHN0WDEgPSByZXFXaWR0aCA+IDAgPyBNYXRoLm1pbihkc3RXaWR0aCwgdGFyZ2V0WCArIHJlcVdpZHRoKSA6IGRzdFdpZHRoXG4gIGNvbnN0IGRzdFkxID0gcmVxSGVpZ2h0ID4gMCA/IE1hdGgubWluKGRzdEhlaWdodCwgdGFyZ2V0WSArIHJlcUhlaWdodCkgOiBkc3RIZWlnaHRcblxuICBpZiAoZHN0WDAgPj0gZHN0WDEpIHJldHVyblxuICBpZiAoZHN0WTAgPj0gZHN0WTEpIHJldHVyblxuXG4gIGNvbnN0IHNyY1gwID0gbXggKyAoZHN0WDAgLSB0YXJnZXRYKVxuICBjb25zdCBzcmNZMCA9IG15ICsgKGRzdFkwIC0gdGFyZ2V0WSlcblxuICBpZiAoc3JjWDAgPj0gc3JjV2lkdGgpIHJldHVyblxuICBpZiAoc3JjWTAgPj0gc3JjSGVpZ2h0KSByZXR1cm5cbiAgaWYgKHNyY1gwICsgKGRzdFgxIC0gZHN0WDApIDw9IDApIHJldHVyblxuICBpZiAoc3JjWTAgKyAoZHN0WTEgLSBkc3RZMCkgPD0gMCkgcmV0dXJuXG5cbiAgY29uc3QgaXRlclcgPSBNYXRoLm1pbihkc3RYMSAtIGRzdFgwLCBzcmNXaWR0aCAtIHNyY1gwKVxuICBjb25zdCBpdGVySCA9IE1hdGgubWluKGRzdFkxIC0gZHN0WTAsIHNyY0hlaWdodCAtIHNyY1kwKVxuXG4gIGxldCBkc3RJZHggPSBkc3RZMCAqIGRzdFdpZHRoICsgZHN0WDBcbiAgbGV0IHNyY0lkeCA9IHNyY1kwICogc3JjV2lkdGggKyBzcmNYMFxuXG4gIGlmIChpbnZlcnRNYXNrKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaXRlckg7IHJvdysrKSB7XG4gICAgICBjb25zdCBkc3RFbmQgPSBkc3RJZHggKyBpdGVyV1xuICAgICAgbGV0IGQgPSBkc3RJZHhcbiAgICAgIGxldCBzID0gc3JjSWR4XG5cbiAgICAgIHdoaWxlIChkIDwgZHN0RW5kKSB7XG4gICAgICAgIC8vIGludmVydGVkXG4gICAgICAgIGlmIChiaW5hcnlNYXNrU3JjW3NdICE9PSAwKSB7XG4gICAgICAgICAgYWxwaGFNYXNrRHN0W2RdID0gMFxuICAgICAgICB9XG4gICAgICAgIGQrK1xuICAgICAgICBzKytcbiAgICAgIH1cblxuICAgICAgZHN0SWR4ICs9IGRzdFdpZHRoXG4gICAgICBzcmNJZHggKz0gc3JjV2lkdGhcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaXRlckg7IHJvdysrKSB7XG4gICAgICBjb25zdCBkc3RFbmQgPSBkc3RJZHggKyBpdGVyV1xuICAgICAgbGV0IGQgPSBkc3RJZHhcbiAgICAgIGxldCBzID0gc3JjSWR4XG5cbiAgICAgIHdoaWxlIChkIDwgZHN0RW5kKSB7XG4gICAgICAgIC8vIElmIGJpbmFyeSBtYXNrIGlzIGVtcHR5LCBjbGVhciB0aGUgYWxwaGEgcGl4ZWwuXG4gICAgICAgIGlmIChiaW5hcnlNYXNrU3JjW3NdID09PSAwKSB7XG4gICAgICAgICAgYWxwaGFNYXNrRHN0W2RdID0gMFxuICAgICAgICB9XG4gICAgICAgIGQrK1xuICAgICAgICBzKytcbiAgICAgIH1cblxuICAgICAgZHN0SWR4ICs9IGRzdFdpZHRoXG4gICAgICBzcmNJZHggKz0gc3JjV2lkdGhcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Creates a new copy of a mask.\n * Uses the underlying buffer's slice method for high-performance memory copying.\n */\nexport function copyMask<T extends Uint8Array>(src: T): T {\n // Uint8Array.slice() is highly optimized at the engine level\n return src.slice() as T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGNvcHkgb2YgYSBtYXNrLlxuICogVXNlcyB0aGUgdW5kZXJseWluZyBidWZmZXIncyBzbGljZSBtZXRob2QgZm9yIGhpZ2gtcGVyZm9ybWFuY2UgbWVtb3J5IGNvcHlpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5TWFzazxUIGV4dGVuZHMgVWludDhBcnJheT4oc3JjOiBUKTogVCB7XG4gIC8vIFVpbnQ4QXJyYXkuc2xpY2UoKSBpcyBoaWdobHkgb3B0aW1pemVkIGF0IHRoZSBlbmdpbmUgbGV2ZWxcbiAgcmV0dXJuIHNyYy5zbGljZSgpIGFzIFRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Inverts a BinaryMask in-place.\n */\nexport function invertBinaryMask(dst: BinaryMask): void {\n const len = dst.length;\n for (let i = 0; i < len; i++) {\n dst[i] = dst[i] === 0 ? 1 : 0;\n }\n}\n\n/**\n * Inverts an AlphaMask in-place.\n */\nexport function invertAlphaMask(dst: AlphaMask): void {\n const len = dst.length;\n for (let i = 0; i < len; i++) {\n dst[i] = 255 - dst[i];\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIEJpbmFyeU1hc2sgfSBmcm9tICcuLi9pbmRleCdcblxuLyoqXG4gKiBJbnZlcnRzIGEgQmluYXJ5TWFzayBpbi1wbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVydEJpbmFyeU1hc2soZHN0OiBCaW5hcnlNYXNrKTogdm9pZCB7XG4gIGNvbnN0IGxlbiA9IGRzdC5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgZHN0W2ldID0gZHN0W2ldID09PSAwXG4gICAgICA/IDFcbiAgICAgIDogMFxuICB9XG59XG5cbi8qKlxuICogSW52ZXJ0cyBhbiBBbHBoYU1hc2sgaW4tcGxhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnRBbHBoYU1hc2soZHN0OiBBbHBoYU1hc2spOiB2b2lkIHtcbiAgY29uc3QgbGVuID0gZHN0Lmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkc3RbaV0gPSAyNTUgLSBkc3RbaV1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Merges 2 alpha masks values are 0-255\n */\nexport function mergeAlphaMasks(dst: AlphaMask, dstWidth: number, src: AlphaMask, srcWidth: number, opts: MergeAlphaMasksOptions): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n alpha: globalAlpha = 255,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n const dstHeight = dst.length / dstWidth | 0;\n const srcHeight = src.length / srcWidth | 0;\n if (width <= 0) return;\n if (height <= 0) return;\n if (globalAlpha === 0) return;\n const startX = Math.max(0, -targetX, -mx);\n const startY = Math.max(0, -targetY, -my);\n const endX = Math.min(width, dstWidth - targetX, srcWidth - mx);\n const endY = Math.min(height, dstHeight - targetY, srcHeight - my);\n if (startX >= endX) return;\n if (startY >= endY) return;\n for (let iy = startY; iy < endY; iy++) {\n const dy = targetY + iy;\n const sy = my + iy;\n let dIdx = dy * dstWidth + targetX + startX;\n let sIdx = sy * srcWidth + mx + startX;\n for (let ix = startX; ix < endX; ix++) {\n const rawM = src[sIdx];\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - rawM : rawM;\n let weight = 0;\n if (effectiveM === 0) {\n weight = 0;\n } else if (effectiveM === 255) {\n weight = globalAlpha;\n } else if (globalAlpha === 255) {\n weight = effectiveM;\n } else {\n weight = effectiveM * globalAlpha + 128 >> 8;\n }\n if (weight !== 255) {\n if (weight === 0) {\n dst[dIdx] = 0;\n } else {\n const da = dst[dIdx];\n if (da === 255) {\n dst[dIdx] = weight;\n } else if (da !== 0) {\n dst[dIdx] = da * weight + 128 >> 8;\n }\n }\n }\n sIdx++;\n dIdx++;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgTWVyZ2VBbHBoYU1hc2tzT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcblxuLyoqXG4gKiBNZXJnZXMgMiBhbHBoYSBtYXNrcyB2YWx1ZXMgYXJlIDAtMjU1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFscGhhTWFza3MoXG4gIGRzdDogQWxwaGFNYXNrLFxuICBkc3RXaWR0aDogbnVtYmVyLFxuICBzcmM6IEFscGhhTWFzayxcbiAgc3JjV2lkdGg6IG51bWJlcixcbiAgb3B0czogTWVyZ2VBbHBoYU1hc2tzT3B0aW9ucyxcbik6IHZvaWQge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgdzogd2lkdGggPSAwLFxuICAgIGg6IGhlaWdodCA9IDAsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuICBjb25zdCBkc3RIZWlnaHQgPSAoZHN0Lmxlbmd0aCAvIGRzdFdpZHRoKSB8IDBcbiAgY29uc3Qgc3JjSGVpZ2h0ID0gKHNyYy5sZW5ndGggLyBzcmNXaWR0aCkgfCAwXG5cbiAgaWYgKHdpZHRoIDw9IDApIHJldHVyblxuICBpZiAoaGVpZ2h0IDw9IDApIHJldHVyblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVyblxuXG4gIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWF4KDAsIC10YXJnZXRYLCAtbXgpXG4gIGNvbnN0IHN0YXJ0WSA9IE1hdGgubWF4KDAsIC10YXJnZXRZLCAtbXkpXG5cbiAgY29uc3QgZW5kWCA9IE1hdGgubWluKHdpZHRoLCBkc3RXaWR0aCAtIHRhcmdldFgsIHNyY1dpZHRoIC0gbXgpXG4gIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihoZWlnaHQsIGRzdEhlaWdodCAtIHRhcmdldFksIHNyY0hlaWdodCAtIG15KVxuXG4gIGlmIChzdGFydFggPj0gZW5kWCkgcmV0dXJuXG4gIGlmIChzdGFydFkgPj0gZW5kWSkgcmV0dXJuXG5cbiAgZm9yIChsZXQgaXkgPSBzdGFydFk7IGl5IDwgZW5kWTsgaXkrKykge1xuICAgIGNvbnN0IGR5ID0gdGFyZ2V0WSArIGl5XG4gICAgY29uc3Qgc3kgPSBteSArIGl5XG5cbiAgICBsZXQgZElkeCA9IGR5ICogZHN0V2lkdGggKyB0YXJnZXRYICsgc3RhcnRYXG4gICAgbGV0IHNJZHggPSBzeSAqIHNyY1dpZHRoICsgbXggKyBzdGFydFhcblxuICAgIGZvciAobGV0IGl4ID0gc3RhcnRYOyBpeCA8IGVuZFg7IGl4KyspIHtcbiAgICAgIGNvbnN0IHJhd00gPSBzcmNbc0lkeF1cbiAgICAgIC8vIFVuaWZpZWQgbG9naWMgYnJhbmNoIGluc2lkZSB0aGUgaG90IHBhdGhcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU0gPSBpbnZlcnRNYXNrID8gMjU1IC0gcmF3TSA6IHJhd01cblxuICAgICAgbGV0IHdlaWdodCA9IDBcblxuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMFxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVNID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcbiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEgPT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZlY3RpdmVNXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3ZWlnaHQgPSAoZWZmZWN0aXZlTSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICB9XG5cbiAgICAgIGlmICh3ZWlnaHQgIT09IDI1NSkge1xuICAgICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgZHN0W2RJZHhdID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRhID0gZHN0W2RJZHhdXG5cbiAgICAgICAgICBpZiAoZGEgPT09IDI1NSkge1xuICAgICAgICAgICAgZHN0W2RJZHhdID0gd2VpZ2h0XG4gICAgICAgICAgfSBlbHNlIGlmIChkYSAhPT0gMCkge1xuICAgICAgICAgICAgZHN0W2RJZHhdID0gKGRhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNJZHgrK1xuICAgICAgZElkeCsrXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function mergeBinaryMasks(dst: BinaryMask, dstWidth: number, src: BinaryMask, srcWidth: number, opts: MergeAlphaMasksOptions): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (dstWidth <= 0) return;\n if (srcWidth <= 0) return;\n const dstHeight = dst.length / dstWidth | 0;\n const srcHeight = src.length / srcWidth | 0;\n\n // 1. Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dstWidth - x);\n h = Math.min(h, dstHeight - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Source Bounds Clipping (Double Clipping)\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(srcWidth, startX + w);\n const sY1 = Math.min(srcHeight, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 3. Coordinate Alignment\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dStride = dstWidth - finalW;\n const sStride = srcWidth - finalW;\n let dIdx = (y + yShift) * dstWidth + (x + xShift);\n let sIdx = sY0 * srcWidth + sX0;\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = src[sIdx];\n // Determine if the source pixel effectively \"clears\" the destination\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n dst[dIdx] = 0;\n }\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBNZXJnZUFscGhhTWFza3NPcHRpb25zIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlNYXNrcyhcbiAgZHN0OiBCaW5hcnlNYXNrLFxuICBkc3RXaWR0aDogbnVtYmVyLFxuICBzcmM6IEJpbmFyeU1hc2ssXG4gIHNyY1dpZHRoOiBudW1iZXIsXG4gIG9wdHM6IE1lcmdlQWxwaGFNYXNrc09wdGlvbnMsXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gMCxcbiAgICBoOiBoZWlnaHQgPSAwLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuICBpZiAoZHN0V2lkdGggPD0gMCkgcmV0dXJuXG4gIGlmIChzcmNXaWR0aCA8PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3RIZWlnaHQgPSAoZHN0Lmxlbmd0aCAvIGRzdFdpZHRoKSB8IDBcbiAgY29uc3Qgc3JjSGVpZ2h0ID0gKHNyYy5sZW5ndGggLyBzcmNXaWR0aCkgfCAwXG5cbiAgLy8gMS4gRGVzdGluYXRpb24gQ2xpcHBpbmdcbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuXG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICB3ID0gTWF0aC5taW4odywgZHN0V2lkdGggLSB4KVxuICBoID0gTWF0aC5taW4oaCwgZHN0SGVpZ2h0IC0geSlcblxuICBpZiAodyA8PSAwKSByZXR1cm5cbiAgaWYgKGggPD0gMCkgcmV0dXJuXG5cbiAgLy8gMi4gU291cmNlIEJvdW5kcyBDbGlwcGluZyAoRG91YmxlIENsaXBwaW5nKVxuICBjb25zdCBzdGFydFggPSBteCArICh4IC0gdGFyZ2V0WClcbiAgY29uc3Qgc3RhcnRZID0gbXkgKyAoeSAtIHRhcmdldFkpXG5cbiAgY29uc3Qgc1gwID0gTWF0aC5tYXgoMCwgc3RhcnRYKVxuICBjb25zdCBzWTAgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKHNyY1dpZHRoLCBzdGFydFggKyB3KVxuICBjb25zdCBzWTEgPSBNYXRoLm1pbihzcmNIZWlnaHQsIHN0YXJ0WSArIGgpXG5cbiAgY29uc3QgZmluYWxXID0gc1gxIC0gc1gwXG4gIGNvbnN0IGZpbmFsSCA9IHNZMSAtIHNZMFxuXG4gIGlmIChmaW5hbFcgPD0gMCkgcmV0dXJuXG4gIGlmIChmaW5hbEggPD0gMCkgcmV0dXJuXG5cbiAgLy8gMy4gQ29vcmRpbmF0ZSBBbGlnbm1lbnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYXG4gIGNvbnN0IHlTaGlmdCA9IHNZMCAtIHN0YXJ0WVxuXG4gIGNvbnN0IGRTdHJpZGUgPSBkc3RXaWR0aCAtIGZpbmFsV1xuICBjb25zdCBzU3RyaWRlID0gc3JjV2lkdGggLSBmaW5hbFdcblxuICBsZXQgZElkeCA9ICh5ICsgeVNoaWZ0KSAqIGRzdFdpZHRoICsgKHggKyB4U2hpZnQpXG4gIGxldCBzSWR4ID0gc1kwICogc3JjV2lkdGggKyBzWDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgZmluYWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGZpbmFsVzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IHNyY1tzSWR4XVxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzb3VyY2UgcGl4ZWwgZWZmZWN0aXZlbHkgXCJjbGVhcnNcIiB0aGUgZGVzdGluYXRpb25cbiAgICAgIGNvbnN0IGlzTWFza2VkT3V0ID0gaW52ZXJ0TWFzayA/IG1WYWwgIT09IDAgOiBtVmFsID09PSAwXG5cbiAgICAgIGlmIChpc01hc2tlZE91dCkge1xuICAgICAgICBkc3RbZElkeF0gPSAwXG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgfVxuXG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgc0lkeCArPSBzU3RyaWRlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { ImageDataLike, ImageDataLikeConstructor, IPixelData } from '../_types';\nimport { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array';\nexport class PixelData<T extends ImageDataLike = ImageData> implements IPixelData {\n readonly data32: Uint32Array;\n readonly imageData: T;\n readonly width: number;\n readonly height: number;\n constructor(imageData: T) {\n this.data32 = imageDataToUInt32Array(imageData);\n this.imageData = imageData;\n this.width = imageData.width;\n this.height = imageData.height;\n }\n set(imageData: T): void {\n ;\n (this as any).imageData = imageData;\n (this as any).data32 = imageDataToUInt32Array(imageData);\n (this as any).width = imageData.width;\n (this as any).height = imageData.height;\n }\n\n // should only be used for debug and testing\n copy(): PixelData<T> {\n const data = this.imageData.data;\n const buffer = new Uint8ClampedArray(data);\n const Ctor = this.imageData.constructor;\n const isCtorValid = typeof Ctor === 'function';\n let newImageData: T;\n if (isCtorValid && Ctor !== Object) {\n const ImageConstructor = Ctor as ImageDataLikeConstructor<T>;\n newImageData = new ImageConstructor(buffer, this.width, this.height);\n } else {\n newImageData = {\n width: this.width,\n height: this.height,\n data: buffer\n } as unknown as T;\n }\n return new PixelData<T>(newImageData);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlLCBJbWFnZURhdGFMaWtlQ29uc3RydWN0b3IsIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBpbWFnZURhdGFUb1VJbnQzMkFycmF5IH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvVUludDMyQXJyYXknXG5cbmV4cG9ydCBjbGFzcyBQaXhlbERhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgPSBJbWFnZURhdGE+IGltcGxlbWVudHMgSVBpeGVsRGF0YSB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXlcbiAgcmVhZG9ubHkgaW1hZ2VEYXRhOiBUXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXJcbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXJcblxuICBjb25zdHJ1Y3RvcihpbWFnZURhdGE6IFQpIHtcbiAgICB0aGlzLmRhdGEzMiA9IGltYWdlRGF0YVRvVUludDMyQXJyYXkoaW1hZ2VEYXRhKVxuICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhXG4gICAgdGhpcy53aWR0aCA9IGltYWdlRGF0YS53aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodFxuICB9XG5cbiAgc2V0KGltYWdlRGF0YTogVCk6IHZvaWQge1xuICAgIDsodGhpcyBhcyBhbnkpLmltYWdlRGF0YSA9IGltYWdlRGF0YVxuICAgIDsodGhpcyBhcyBhbnkpLmRhdGEzMiA9IGltYWdlRGF0YVRvVUludDMyQXJyYXkoaW1hZ2VEYXRhKVxuICAgIDsodGhpcyBhcyBhbnkpLndpZHRoID0gaW1hZ2VEYXRhLndpZHRoXG4gICAgOyh0aGlzIGFzIGFueSkuaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodFxuICB9XG5cbiAgLy8gc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWcgYW5kIHRlc3RpbmdcbiAgY29weSgpOiBQaXhlbERhdGE8VD4ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmltYWdlRGF0YS5kYXRhXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEpXG4gICAgY29uc3QgQ3RvciA9IHRoaXMuaW1hZ2VEYXRhLmNvbnN0cnVjdG9yXG4gICAgY29uc3QgaXNDdG9yVmFsaWQgPSB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgbGV0IG5ld0ltYWdlRGF0YTogVFxuICAgIGlmIChpc0N0b3JWYWxpZCAmJiBDdG9yICE9PSBPYmplY3QpIHtcbiAgICAgIGNvbnN0IEltYWdlQ29uc3RydWN0b3IgPSBDdG9yIGFzIEltYWdlRGF0YUxpa2VDb25zdHJ1Y3RvcjxUPlxuICAgICAgbmV3SW1hZ2VEYXRhID0gbmV3IEltYWdlQ29uc3RydWN0b3IoXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgdGhpcy53aWR0aCxcbiAgICAgICAgdGhpcy5oZWlnaHQsXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0ltYWdlRGF0YSA9IHtcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICAgIGRhdGE6IGJ1ZmZlcixcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQaXhlbERhdGE8VD4obmV3SW1hZ2VEYXRhKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataAlphaMask(dst: IPixelData, src: IPixelData, alphaMask: AlphaMask, opts: PixelBlendMaskOptions = {}) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mw = src.width,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n\n // 1. Clipping (Matches main branch behavior)\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // 2. Index Setup\n const dw = dst.width;\n const sw = src.width;\n const mPitch = mw;\n\n // dx/dy is the displacement from requested start to clipped start.\n // This keeps the mask locked to the source content during cross-clipping.\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const src32 = src.data32;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite || false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = alphaMask[mIdx];\n const effM = invertMask ? 255 - mVal : mVal;\n\n // Early exit if mask is fully transparent\n if (effM === 0) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n\n // Early exit if source is fully transparent (unless overwriting)\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n\n // Calculate weight using linear logic (Easier for JIT than nested ternaries)\n let weight = globalAlpha;\n if (isOpaque) {\n weight = effM;\n } else if (effM !== 255) {\n weight = effM * globalAlpha + 128 >> 8;\n }\n\n // Zero-weight safety check\n if (weight === 0) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (weight < 255) {\n const a = srcAlpha * weight + 128 >> 8;\n // Final check: weight might have resulted in a transparent pixel\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQ29sb3IzMiwgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFBpeGVsQmxlbmRNYXNrT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGFBbHBoYU1hc2soXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgc3JjOiBJUGl4ZWxEYXRhLFxuICBhbHBoYU1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogUGl4ZWxCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHN4OiBzb3VyY2VYID0gMCxcbiAgICBzeTogc291cmNlWSA9IDAsXG4gICAgdzogd2lkdGggPSBzcmMud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gc3JjLmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIG13ID0gc3JjLndpZHRoLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgc3ggPSBzb3VyY2VYXG4gIGxldCBzeSA9IHNvdXJjZVlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIC8vIDEuIENsaXBwaW5nIChNYXRjaGVzIG1haW4gYnJhbmNoIGJlaGF2aW9yKVxuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeFxuICAgIHcgKz0gc3hcbiAgICBzeCA9IDBcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeVxuICAgIGggKz0gc3lcbiAgICBzeSA9IDBcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpXG4gIGggPSBNYXRoLm1pbihoLCBzcmMuaGVpZ2h0IC0gc3kpXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIDIuIEluZGV4IFNldHVwXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG13XG5cbiAgLy8gZHgvZHkgaXMgdGhlIGRpc3BsYWNlbWVudCBmcm9tIHJlcXVlc3RlZCBzdGFydCB0byBjbGlwcGVkIHN0YXJ0LlxuICAvLyBUaGlzIGtlZXBzIHRoZSBtYXNrIGxvY2tlZCB0byB0aGUgc291cmNlIGNvbnRlbnQgZHVyaW5nIGNyb3NzLWNsaXBwaW5nLlxuICBjb25zdCBkeCA9ICh4IC0gdGFyZ2V0WCkgfCAwXG4gIGNvbnN0IGR5ID0gKHkgLSB0YXJnZXRZKSB8IDBcblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyXG5cbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGxldCBzSWR4ID0gKHN5ICogc3cgKyBzeCkgfCAwXG4gIGxldCBtSWR4ID0gKChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KSkgfCAwXG5cbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBzU3RyaWRlID0gKHN3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IG1TdHJpZGUgPSAobVBpdGNoIC0gYWN0dWFsVykgfCAwXG5cbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBhbHBoYU1hc2tbbUlkeF1cbiAgICAgIGNvbnN0IGVmZk0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgLy8gRWFybHkgZXhpdCBpZiBtYXNrIGlzIGZ1bGx5IHRyYW5zcGFyZW50XG4gICAgICBpZiAoZWZmTSA9PT0gMCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IHNyY0NvbCA+Pj4gMjRcblxuICAgICAgLy8gRWFybHkgZXhpdCBpZiBzb3VyY2UgaXMgZnVsbHkgdHJhbnNwYXJlbnQgKHVubGVzcyBvdmVyd3JpdGluZylcbiAgICAgIGlmIChzcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIHNJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHdlaWdodCB1c2luZyBsaW5lYXIgbG9naWMgKEVhc2llciBmb3IgSklUIHRoYW4gbmVzdGVkIHRlcm5hcmllcylcbiAgICAgIGxldCB3ZWlnaHQgPSBnbG9iYWxBbHBoYVxuICAgICAgaWYgKGlzT3BhcXVlKSB7XG4gICAgICAgIHdlaWdodCA9IGVmZk1cbiAgICAgIH0gZWxzZSBpZiAoZWZmTSAhPT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IChlZmZNICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgIH1cblxuICAgICAgLy8gWmVyby13ZWlnaHQgc2FmZXR5IGNoZWNrXG4gICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbENvbCA9IHNyY0NvbFxuICAgICAgaWYgKHdlaWdodCA8IDI1NSkge1xuICAgICAgICBjb25zdCBhID0gKHNyY0FscGhhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG4gICAgICAgIC8vIEZpbmFsIGNoZWNrOiB3ZWlnaHQgbWlnaHQgaGF2ZSByZXN1bHRlZCBpbiBhIHRyYW5zcGFyZW50IHBpeGVsXG4gICAgICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICAgIGRJZHgrK1xuICAgICAgICAgIHNJZHgrK1xuICAgICAgICAgIG1JZHgrK1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxDb2wgPSAoKHNyY0NvbCAmIDB4MDBmZmZmZmYpIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gICAgICB9XG5cbiAgICAgIGRzdDMyW2RJZHhdID0gYmxlbmRGbihmaW5hbENvbCwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcblxuICAgICAgZElkeCsrXG4gICAgICBzSWR4KytcbiAgICAgIG1JZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBzSWR4ICs9IHNTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataBinaryMask(dst: IPixelData, src: IPixelData, binaryMask: BinaryMask, opts: PixelBlendMaskOptions) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mw = src.width,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n\n // 1. Source Clipping\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n\n // 2. Destination Clipping\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // 3. Coordinate Displacement for Mask Sync\n // dx/dy represents how far the clipped start is from the requested start.\n // This is the stable way to align the mask across all clipping permutations.\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const src32 = src.data32;\n const dw = dst.width;\n const sw = src.width;\n const mPitch = mw;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const skipVal = invertMask ? 1 : 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite || false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n // Binary Mask Check (Earliest exit)\n if (binaryMask[mIdx] === skipVal) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n\n // Source Alpha Check\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (!isOpaque) {\n // Rounding-corrected global alpha application\n const a = srcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBJUGl4ZWxEYXRhLCBQaXhlbEJsZW5kTWFza09wdGlvbnMgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayhcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBzcmM6IElQaXhlbERhdGEsXG4gIGJpbmFyeU1hc2s6IEJpbmFyeU1hc2ssXG4gIG9wdHM6IFBpeGVsQmxlbmRNYXNrT3B0aW9ucyxcbikge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgc3g6IHNvdXJjZVggPSAwLFxuICAgIHN5OiBzb3VyY2VZID0gMCxcbiAgICB3OiB3aWR0aCA9IHNyYy53aWR0aCxcbiAgICBoOiBoZWlnaHQgPSBzcmMuaGVpZ2h0LFxuICAgIGFscGhhOiBnbG9iYWxBbHBoYSA9IDI1NSxcbiAgICBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QsXG4gICAgbXcgPSBzcmMud2lkdGgsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm5cblxuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCBzeCA9IHNvdXJjZVhcbiAgbGV0IHN5ID0gc291cmNlWVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgLy8gMS4gU291cmNlIENsaXBwaW5nXG4gIGlmIChzeCA8IDApIHtcbiAgICB4IC09IHN4XG4gICAgdyArPSBzeFxuICAgIHN4ID0gMFxuICB9XG4gIGlmIChzeSA8IDApIHtcbiAgICB5IC09IHN5XG4gICAgaCArPSBzeVxuICAgIHN5ID0gMFxuICB9XG4gIHcgPSBNYXRoLm1pbih3LCBzcmMud2lkdGggLSBzeClcbiAgaCA9IE1hdGgubWluKGgsIHNyYy5oZWlnaHQgLSBzeSlcblxuICAvLyAyLiBEZXN0aW5hdGlvbiBDbGlwcGluZ1xuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIDMuIENvb3JkaW5hdGUgRGlzcGxhY2VtZW50IGZvciBNYXNrIFN5bmNcbiAgLy8gZHgvZHkgcmVwcmVzZW50cyBob3cgZmFyIHRoZSBjbGlwcGVkIHN0YXJ0IGlzIGZyb20gdGhlIHJlcXVlc3RlZCBzdGFydC5cbiAgLy8gVGhpcyBpcyB0aGUgc3RhYmxlIHdheSB0byBhbGlnbiB0aGUgbWFzayBhY3Jvc3MgYWxsIGNsaXBwaW5nIHBlcm11dGF0aW9ucy5cbiAgY29uc3QgZHggPSAoeCAtIHRhcmdldFgpIHwgMFxuICBjb25zdCBkeSA9ICh5IC0gdGFyZ2V0WSkgfCAwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IHNyYzMyID0gc3JjLmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBzdyA9IHNyYy53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBtd1xuXG4gIGxldCBkSWR4ID0gKHkgKiBkdyArIHgpIHwgMFxuICBsZXQgc0lkeCA9IChzeSAqIHN3ICsgc3gpIHwgMFxuICBsZXQgbUlkeCA9ICgobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkpIHwgMFxuXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3Qgc1N0cmlkZSA9IChzdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBtU3RyaWRlID0gKG1QaXRjaCAtIGFjdHVhbFcpIHwgMFxuXG4gIGNvbnN0IHNraXBWYWwgPSBpbnZlcnRNYXNrID8gMSA6IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIC8vIEJpbmFyeSBNYXNrIENoZWNrIChFYXJsaWVzdCBleGl0KVxuICAgICAgaWYgKGJpbmFyeU1hc2tbbUlkeF0gPT09IHNraXBWYWwpIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIHNJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3JjQ29sID0gc3JjMzJbc0lkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3Qgc3JjQWxwaGEgPSBzcmNDb2wgPj4+IDI0XG5cbiAgICAgIC8vIFNvdXJjZSBBbHBoYSBDaGVja1xuICAgICAgaWYgKHNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgZmluYWxDb2wgPSBzcmNDb2xcbiAgICAgIGlmICghaXNPcGFxdWUpIHtcbiAgICAgICAgLy8gUm91bmRpbmctY29ycmVjdGVkIGdsb2JhbCBhbHBoYSBhcHBsaWNhdGlvblxuICAgICAgICBjb25zdCBhID0gKHNyY0FscGhhICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrXG4gICAgICAgICAgc0lkeCsrXG4gICAgICAgICAgbUlkeCsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9ICgoc3JjQ29sICYgMHgwMGZmZmZmZikgfCAoYSA8PCAyNCkpID4+PiAwIGFzIENvbG9yMzJcbiAgICAgIH1cblxuICAgICAgZHN0MzJbZElkeF0gPSBibGVuZEZuKGZpbmFsQ29sLCBkc3QzMltkSWR4XSBhcyBDb2xvcjMyKVxuXG4gICAgICBkSWR4KytcbiAgICAgIHNJZHgrK1xuICAgICAgbUlkeCsrXG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZVxuICAgIHNJZHggKz0gc1N0cmlkZVxuICAgIG1JZHggKz0gbVN0cmlkZVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { fillPixelData } from './fillPixelData';\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelData.\n */\nexport function clearPixelData(dst: IPixelData, rect?: Partial<BinaryMaskRect>): void {\n fillPixelData(dst, 0 as Color32, rect);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrUmVjdCwgQ29sb3IzMiwgSVBpeGVsRGF0YSB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGEgfSBmcm9tICcuL2ZpbGxQaXhlbERhdGEnXG5cbi8qKlxuICogQ2xlYXJzIGEgcmVnaW9uIG9mIHRoZSBQaXhlbERhdGEgdG8gdHJhbnNwYXJlbnQgKDB4MDAwMDAwMDApLlxuICogSW50ZXJuYWxseSB1c2VzIHRoZSBvcHRpbWl6ZWQgZmlsbFBpeGVsRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIHJlY3Q/OiBQYXJ0aWFsPEJpbmFyeU1hc2tSZWN0Pixcbik6IHZvaWQge1xuICBmaWxsUGl4ZWxEYXRhKGRzdCwgMCBhcyBDb2xvcjMyLCByZWN0KVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: IPixelData, rect: Rect): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData, x: number, y: number, w: number, h: number): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint32Array {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const srcW = source.width;\n const srcH = source.height;\n const srcData = source.data32;\n\n // Safety check for empty or invalid dimensions\n if (w <= 0 || h <= 0) {\n return new Uint32Array(0);\n }\n const dstData = new Uint32Array(w * h);\n\n // We map from Source (srcW, srcH) at (x,y)\n // To Dest (w, h) at (0,0)\n // Note: resolveBlitClipping usually takes (dstX, dstY, srcX, srcY...)\n // Here we are \"blitting\" FROM x,y TO 0,0.\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return dstData;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX;\n const dstStart = (dstY + row) * w + dstX;\n\n // Perform the high-speed 32-bit bulk copy\n const chunk = srcData.subarray(srcStart, srcStart + copyW);\n dstData.set(chunk, dstStart);\n }\n return dstData;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHBpeGVscyBmcm9tIFBpeGVsRGF0YS5cbiAqIFJldHVybnMgYSBuZXcgVWludDMyQXJyYXkgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHBpeGVscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlOiBJUGl4ZWxEYXRhLCByZWN0OiBSZWN0KTogVWludDMyQXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZTogSVBpeGVsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogVWludDMyQXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKFxuICBzb3VyY2U6IElQaXhlbERhdGEsXG4gIF94OiBSZWN0IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogVWludDMyQXJyYXkge1xuICBjb25zdCB7IHgsIHksIHcsIGggfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCdcbiAgICA/IF94XG4gICAgOiB7IHg6IF94LCB5OiBfeSEsIHc6IF93ISwgaDogX2ghIH1cblxuICBjb25zdCBzcmNXID0gc291cmNlLndpZHRoXG4gIGNvbnN0IHNyY0ggPSBzb3VyY2UuaGVpZ2h0XG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YTMyXG5cbiAgLy8gU2FmZXR5IGNoZWNrIGZvciBlbXB0eSBvciBpbnZhbGlkIGRpbWVuc2lvbnNcbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KDApXG4gIH1cblxuICBjb25zdCBkc3REYXRhID0gbmV3IFVpbnQzMkFycmF5KHcgKiBoKVxuXG4gIC8vIFdlIG1hcCBmcm9tIFNvdXJjZSAoc3JjVywgc3JjSCkgYXQgKHgseSlcbiAgLy8gVG8gRGVzdCAodywgaCkgYXQgKDAsMClcbiAgLy8gTm90ZTogcmVzb2x2ZUJsaXRDbGlwcGluZyB1c3VhbGx5IHRha2VzIChkc3RYLCBkc3RZLCBzcmNYLCBzcmNZLi4uKVxuICAvLyBIZXJlIHdlIGFyZSBcImJsaXR0aW5nXCIgRlJPTSB4LHkgVE8gMCwwLlxuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgICAwLFxuICAgIDAsXG4gICAgeCxcbiAgICB5LFxuICAgIHcsXG4gICAgaCxcbiAgICB3LFxuICAgIGgsXG4gICAgc3JjVyxcbiAgICBzcmNILFxuICAgIFNDUkFUQ0hfQkxJVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuIGRzdERhdGFcblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1hcbiAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICsgcm93KSAqIHcgKyBkc3RYXG5cbiAgICAvLyBQZXJmb3JtIHRoZSBoaWdoLXNwZWVkIDMyLWJpdCBidWxrIGNvcHlcbiAgICBjb25zdCBjaHVuayA9IHNyY0RhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgY29weVcpXG4gICAgZHN0RGF0YS5zZXQoY2h1bmssIGRzdFN0YXJ0KVxuICB9XG5cbiAgcmV0dXJuIGRzdERhdGFcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { extractPixelDataBuffer } from './extractPixelDataBuffer';\nimport { PixelData } from './PixelData';\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: IPixelData, rect: Rect): PixelData;\nexport function extractPixelData(source: IPixelData, x: number, y: number, w: number, h: number): PixelData;\nexport function extractPixelData(source: IPixelData, _x: Rect | number, _y?: number, _w?: number, _h?: number): PixelData {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const result = new PixelData(new ImageData(w, h));\n const buffer = extractPixelDataBuffer(source, x, y, w, h);\n result.data32.set(buffer);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlciB9IGZyb20gJy4vZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcidcbmltcG9ydCB7IFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxEYXRhJ1xuXG4vKipcbiAqIEhpZ2gtbGV2ZWwgZXh0cmFjdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgUGl4ZWxEYXRhIGluc3RhbmNlLlxuICogTGV2ZXJhZ2VzIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIgZm9yIG9wdGltaXplZCAzMi1iaXQgbWVtb3J5IG1vdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShzb3VyY2U6IElQaXhlbERhdGEsIHJlY3Q6IFJlY3QpOiBQaXhlbERhdGFcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhKHNvdXJjZTogSVBpeGVsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogUGl4ZWxEYXRhXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShcbiAgc291cmNlOiBJUGl4ZWxEYXRhLFxuICBfeDogUmVjdCB8IG51bWJlcixcbiAgX3k/OiBudW1iZXIsXG4gIF93PzogbnVtYmVyLFxuICBfaD86IG51bWJlcixcbik6IFBpeGVsRGF0YSB7XG4gIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gdHlwZW9mIF94ID09PSAnb2JqZWN0J1xuICAgID8gX3hcbiAgICA6IHsgeDogX3gsIHk6IF95ISwgdzogX3chLCBoOiBfaCEgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBQaXhlbERhdGEobmV3IEltYWdlRGF0YSh3LCBoKSlcblxuICBjb25zdCBidWZmZXIgPSBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZSwgeCwgeSwgdywgaClcbiAgcmVzdWx0LmRhdGEzMi5zZXQoYnVmZmVyKVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { IPixelData } from '../_types';\nexport class PixelBuffer32 implements IPixelData {\n readonly data32: Uint32Array;\n constructor(readonly width: number, readonly height: number, data32?: Uint32Array) {\n this.data32 = data32 ?? new Uint32Array(width * height);\n }\n set(width: number, height: number, data32?: Uint32Array): void {\n ;\n (this as any).data32 = data32 ?? new Uint32Array(width * height);\n (this as any).width = width;\n (this as any).height = height;\n }\n copy(): PixelBuffer32 {\n const newData32 = new Uint32Array(this.data32);\n return new PixelBuffer32(this.width, this.height, newData32);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxCdWZmZXIzMiBpbXBsZW1lbnRzIElQaXhlbERhdGEge1xuICByZWFkb25seSBkYXRhMzI6IFVpbnQzMkFycmF5XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgd2lkdGg6IG51bWJlcixcbiAgICByZWFkb25seSBoZWlnaHQ6IG51bWJlcixcbiAgICBkYXRhMzI/OiBVaW50MzJBcnJheSxcbiAgKSB7XG4gICAgdGhpcy5kYXRhMzIgPSBkYXRhMzIgPz8gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KVxuICB9XG5cbiAgc2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkYXRhMzI/OiBVaW50MzJBcnJheSk6IHZvaWQge1xuICAgIDsodGhpcyBhcyBhbnkpLmRhdGEzMiA9IGRhdGEzMiA/PyBuZXcgVWludDMyQXJyYXkod2lkdGggKiBoZWlnaHQpXG4gICAgOyh0aGlzIGFzIGFueSkud2lkdGggPSB3aWR0aFxuICAgIDsodGhpcyBhcyBhbnkpLmhlaWdodCA9IGhlaWdodFxuICB9XG5cbiAgY29weSgpOiBQaXhlbEJ1ZmZlcjMyIHtcbiAgICBjb25zdCBuZXdEYXRhMzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5kYXRhMzIpXG4gICAgcmV0dXJuIG5ldyBQaXhlbEJ1ZmZlcjMyKFxuICAgICAgdGhpcy53aWR0aCxcbiAgICAgIHRoaXMuaGVpZ2h0LFxuICAgICAgbmV3RGF0YTMyLFxuICAgIClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { AlphaMask } from '../_types';\n\n/**\n * Extracts the alpha channel from PixelData into a single-channel mask.\n * Returns a Uint8Array branded as AlphaMask.\n */\nexport function pixelDataToAlphaMask(pixelData: IPixelData): AlphaMask {\n const {\n data32,\n width,\n height\n } = pixelData;\n const len = data32.length;\n const mask = new Uint8Array(width * height) as AlphaMask;\n for (let i = 0; i < len; i++) {\n const val = data32[i];\n\n // Extract the Alpha byte (top 8 bits in ABGR / Little-Endian)\n // Shift right by 24 moves the 4th byte to the 1st position\n mask[i] = val >>> 24 & 0xff;\n }\n return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSBQaXhlbERhdGEgaW50byBhIHNpbmdsZS1jaGFubmVsIG1hc2suXG4gKiBSZXR1cm5zIGEgVWludDhBcnJheSBicmFuZGVkIGFzIEFscGhhTWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpeGVsRGF0YVRvQWxwaGFNYXNrKFxuICBwaXhlbERhdGE6IElQaXhlbERhdGEsXG4pOiBBbHBoYU1hc2sge1xuICBjb25zdCB7XG4gICAgZGF0YTMyLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfSA9IHBpeGVsRGF0YVxuICBjb25zdCBsZW4gPSBkYXRhMzIubGVuZ3RoXG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCkgYXMgQWxwaGFNYXNrXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHZhbCA9IGRhdGEzMltpXVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgQWxwaGEgYnl0ZSAodG9wIDggYml0cyBpbiBBQkdSIC8gTGl0dGxlLUVuZGlhbilcbiAgICAvLyBTaGlmdCByaWdodCBieSAyNCBtb3ZlcyB0aGUgNHRoIGJ5dGUgdG8gdGhlIDFzdCBwb3NpdGlvblxuICAgIG1hc2tbaV0gPSAodmFsID4+PiAyNCkgJiAweGZmXG4gIH1cblxuICByZXR1cm4gbWFza1xufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function reflectPixelDataHorizontal(pixelData: IPixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n const halfWidth = Math.floor(width / 2);\n for (let y = 0; y < height; y++) {\n const rowOffset = y * width;\n for (let x = 0; x < halfWidth; x++) {\n const leftIdx = rowOffset + x;\n const rightIdx = rowOffset + (width - 1 - x);\n const temp = data[leftIdx];\n data[leftIdx] = data[rightIdx];\n data[rightIdx] = temp;\n }\n }\n}\nexport function reflectPixelDataVertical(pixelData: IPixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n const halfHeight = Math.floor(height / 2);\n for (let y = 0; y < halfHeight; y++) {\n const topRowOffset = y * width;\n const bottomRowOffset = (height - 1 - y) * width;\n for (let x = 0; x < width; x++) {\n const topIdx = topRowOffset + x;\n const bottomIdx = bottomRowOffset + x;\n const temp = data[topIdx];\n data[topIdx] = data[bottomIdx];\n data[bottomIdx] = temp;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdFBpeGVsRGF0YUhvcml6b250YWwocGl4ZWxEYXRhOiBJUGl4ZWxEYXRhKTogdm9pZCB7XG4gIGNvbnN0IHdpZHRoID0gcGl4ZWxEYXRhLndpZHRoXG4gIGNvbnN0IGhlaWdodCA9IHBpeGVsRGF0YS5oZWlnaHRcbiAgY29uc3QgZGF0YSA9IHBpeGVsRGF0YS5kYXRhMzJcbiAgY29uc3QgaGFsZldpZHRoID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IHkgKiB3aWR0aFxuXG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBoYWxmV2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgbGVmdElkeCA9IHJvd09mZnNldCArIHhcbiAgICAgIGNvbnN0IHJpZ2h0SWR4ID0gcm93T2Zmc2V0ICsgKHdpZHRoIC0gMSAtIHgpXG4gICAgICBjb25zdCB0ZW1wID0gZGF0YVtsZWZ0SWR4XVxuXG4gICAgICBkYXRhW2xlZnRJZHhdID0gZGF0YVtyaWdodElkeF1cbiAgICAgIGRhdGFbcmlnaHRJZHhdID0gdGVtcFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdFBpeGVsRGF0YVZlcnRpY2FsKHBpeGVsRGF0YTogSVBpeGVsRGF0YSk6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aFxuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTMyXG4gIGNvbnN0IGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIDIpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoYWxmSGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCB0b3BSb3dPZmZzZXQgPSB5ICogd2lkdGhcbiAgICBjb25zdCBib3R0b21Sb3dPZmZzZXQgPSAoaGVpZ2h0IC0gMSAtIHkpICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgdG9wSWR4ID0gdG9wUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgYm90dG9tSWR4ID0gYm90dG9tUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbdG9wSWR4XVxuXG4gICAgICBkYXRhW3RvcElkeF0gPSBkYXRhW2JvdHRvbUlkeF1cbiAgICAgIGRhdGFbYm90dG9tSWR4XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { PixelData } from '../index';\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(pixelData: IPixelData, factor: number): PixelData {\n const {\n data,\n width,\n height\n } = resample32(pixelData.data32, pixelData.width, pixelData.height, factor);\n return new PixelData(new ImageData(new Uint8ClampedArray(data.buffer) as ImageDataArray, width, height));\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCBQaXhlbERhdGEgfSBmcm9tICcuLi9pbmRleCdcbmltcG9ydCB7IHJlc2FtcGxlMzIgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNhbXBsZTMyJ1xuXG4vKipcbiAqIFJlc2FtcGxlcyBQaXhlbERhdGEgYnkgYSBzcGVjaWZpYyBmYWN0b3IgdXNpbmcgbmVhcmVzdCBuZWlnaGJvci5cbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlUGl4ZWxEYXRhKFxuICBwaXhlbERhdGE6IElQaXhlbERhdGEsXG4gIGZhY3RvcjogbnVtYmVyLFxuKTogUGl4ZWxEYXRhIHtcbiAgY29uc3QgeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0gPSByZXNhbXBsZTMyKHBpeGVsRGF0YS5kYXRhMzIsIHBpeGVsRGF0YS53aWR0aCwgcGl4ZWxEYXRhLmhlaWdodCwgZmFjdG9yKVxuXG4gIHJldHVybiBuZXcgUGl4ZWxEYXRhKG5ldyBJbWFnZURhdGEoXG4gICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEuYnVmZmVyKSBhcyBJbWFnZURhdGFBcnJheSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICkpXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n if (width === height) {\n rotateSquareInPlace(pixelData);\n return;\n }\n const newWidth = height;\n const newHeight = width;\n const newData32 = new Uint32Array(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const oldIdx = y * width + x;\n const newX = height - 1 - y;\n const newY = x;\n const newIdx = newY * newWidth + newX;\n newData32[newIdx] = data[oldIdx];\n }\n }\n\n // To update a rectangular PixelData, we must create a new ImageData\n // since width/height are read-only properties of the native object.\n const newImageData = new ImageData(new Uint8ClampedArray(newData32.buffer), newWidth, newHeight);\n pixelData.set(newImageData);\n}\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.width;\n const data = pixelData.data32;\n for (let i = 0; i < n / 2; i++) {\n for (let j = i; j < n - i - 1; j++) {\n const top = i * n + j;\n const right = j * n + (n - 1 - i);\n const bottom = (n - 1 - i) * n + (n - 1 - j);\n const left = (n - 1 - j) * n + i;\n const temp = data[top];\n data[top] = data[left];\n data[left] = data[bottom];\n data[bottom] = data[right];\n data[right] = temp;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxEYXRhIH0gZnJvbSAnLi9QaXhlbERhdGEnXG5cbi8qKlxuICogUm90YXRlcyBwaXhlbCBkYXRhIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLlxuICogSWYgdGhlIGltYWdlIGlzIHNxdWFyZSwgaXQgcGVyZm9ybXMgdGhlIHJvdGF0aW9uIGluLXBsYWNlLlxuICogSWYgcmVjdGFuZ3VsYXIsIGl0IHJlcGxhY2VzIHRoZSBpbnRlcm5hbCBJbWFnZURhdGEgd2l0aCBhIG5ldyByb3RhdGVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVQaXhlbERhdGEocGl4ZWxEYXRhOiBQaXhlbERhdGEpOiB2b2lkIHtcbiAgY29uc3Qgd2lkdGggPSBwaXhlbERhdGEud2lkdGhcbiAgY29uc3QgaGVpZ2h0ID0gcGl4ZWxEYXRhLmhlaWdodFxuICBjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGEzMlxuXG4gIGlmICh3aWR0aCA9PT0gaGVpZ2h0KSB7XG4gICAgcm90YXRlU3F1YXJlSW5QbGFjZShwaXhlbERhdGEpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBuZXdXaWR0aCA9IGhlaWdodFxuICBjb25zdCBuZXdIZWlnaHQgPSB3aWR0aFxuICBjb25zdCBuZXdEYXRhMzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5sZW5ndGgpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3Qgb2xkSWR4ID0geSAqIHdpZHRoICsgeFxuICAgICAgY29uc3QgbmV3WCA9IGhlaWdodCAtIDEgLSB5XG4gICAgICBjb25zdCBuZXdZID0geFxuICAgICAgY29uc3QgbmV3SWR4ID0gbmV3WSAqIG5ld1dpZHRoICsgbmV3WFxuXG4gICAgICBuZXdEYXRhMzJbbmV3SWR4XSA9IGRhdGFbb2xkSWR4XVxuICAgIH1cbiAgfVxuXG4gIC8vIFRvIHVwZGF0ZSBhIHJlY3Rhbmd1bGFyIFBpeGVsRGF0YSwgd2UgbXVzdCBjcmVhdGUgYSBuZXcgSW1hZ2VEYXRhXG4gIC8vIHNpbmNlIHdpZHRoL2hlaWdodCBhcmUgcmVhZC1vbmx5IHByb3BlcnRpZXMgb2YgdGhlIG5hdGl2ZSBvYmplY3QuXG4gIGNvbnN0IG5ld0ltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoXG4gICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG5ld0RhdGEzMi5idWZmZXIpLFxuICAgIG5ld1dpZHRoLFxuICAgIG5ld0hlaWdodCxcbiAgKVxuXG4gIHBpeGVsRGF0YS5zZXQobmV3SW1hZ2VEYXRhKVxufVxuXG5mdW5jdGlvbiByb3RhdGVTcXVhcmVJblBsYWNlKHBpeGVsRGF0YTogUGl4ZWxEYXRhKTogdm9pZCB7XG4gIGNvbnN0IG4gPSBwaXhlbERhdGEud2lkdGhcbiAgY29uc3QgZGF0YSA9IHBpeGVsRGF0YS5kYXRhMzJcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLyAyOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IG4gLSBpIC0gMTsgaisrKSB7XG4gICAgICBjb25zdCB0b3AgPSBpICogbiArIGpcbiAgICAgIGNvbnN0IHJpZ2h0ID0gaiAqIG4gKyAobiAtIDEgLSBpKVxuICAgICAgY29uc3QgYm90dG9tID0gKG4gLSAxIC0gaSkgKiBuICsgKG4gLSAxIC0gailcbiAgICAgIGNvbnN0IGxlZnQgPSAobiAtIDEgLSBqKSAqIG4gKyBpXG5cbiAgICAgIGNvbnN0IHRlbXAgPSBkYXRhW3RvcF1cbiAgICAgIGRhdGFbdG9wXSA9IGRhdGFbbGVmdF1cbiAgICAgIGRhdGFbbGVmdF0gPSBkYXRhW2JvdHRvbV1cbiAgICAgIGRhdGFbYm90dG9tXSA9IGRhdGFbcmlnaHRdXG4gICAgICBkYXRhW3JpZ2h0XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of a {@link PixelData} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target {@link PixelData} buffer.\n */\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, rect: Rect): void;\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, x: number, y: number, w: number, h: number): void;\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const dstW = target.width;\n const dstH = target.height;\n const dstData = target.data32;\n\n // treat the source buffer as a Source Image starting at 0,0 with size w,h\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * w + srcX;\n dstData.set(data.subarray(srcStart, srcStart + copyW), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5pbXBvcnQgdHlwZSB7IFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxEYXRhJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIENvcGllcyBhIHBpeGVsIGJ1ZmZlciBpbnRvIGEgc3BlY2lmaWMgcmVnaW9uIG9mIGEge0BsaW5rIFBpeGVsRGF0YX0gb2JqZWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBkaXJlY3QgbWVtb3J5IGNvcHkgZnJvbSBhIHtAbGluayBVaW50MzJBcnJheX1cbiAqIGludG8gdGhlIHRhcmdldCB7QGxpbmsgUGl4ZWxEYXRhfSBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgcmVjdDogUmVjdCxcbik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHc6IG51bWJlcixcbiAgaDogbnVtYmVyLFxuKTogdm9pZFxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGl4ZWxEYXRhQnVmZmVyKFxuICB0YXJnZXQ6IElQaXhlbERhdGEsXG4gIGRhdGE6IFVpbnQzMkFycmF5LFxuICBfeDogUmVjdCB8IG51bWJlcixcbiAgX3k/OiBudW1iZXIsXG4gIF93PzogbnVtYmVyLFxuICBfaD86IG51bWJlcixcbik6IHZvaWQge1xuICBjb25zdCB7IHgsIHksIHcsIGggfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCdcbiAgICA/IF94XG4gICAgOiB7XG4gICAgICB4OiBfeCxcbiAgICAgIHk6IF95ISxcbiAgICAgIHc6IF93ISxcbiAgICAgIGg6IF9oISxcbiAgICB9XG5cbiAgY29uc3QgZHN0VyA9IHRhcmdldC53aWR0aFxuICBjb25zdCBkc3RIID0gdGFyZ2V0LmhlaWdodFxuICBjb25zdCBkc3REYXRhID0gdGFyZ2V0LmRhdGEzMlxuXG4gIC8vIHRyZWF0IHRoZSBzb3VyY2UgYnVmZmVyIGFzIGEgU291cmNlIEltYWdlIHN0YXJ0aW5nIGF0IDAsMCB3aXRoIHNpemUgdyxoXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsXG4gICAgeSxcbiAgICAwLFxuICAgIDAsXG4gICAgdyxcbiAgICBoLFxuICAgIGRzdFcsXG4gICAgZHN0SCxcbiAgICB3LFxuICAgIGgsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFhcbiAgICBjb25zdCBzcmNTdGFydCA9IChzcmNZICsgcm93KSAqIHcgKyBzcmNYXG5cbiAgICBkc3REYXRhLnNldChkYXRhLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIGNvcHlXKSwgZHN0U3RhcnQpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ=="],"mappings":"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","names":["MaskType","get","applyAlphaMaskToPixelData","defaults","applyBinaryMaskToPixelData","defaults","applyCircleBrushToPixelData","getCircleBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataAlphaMask","getCircleBrushOrPencilBounds","getCircleBrushOrPencilStrokeBounds","defaults","forEachLinePoint","blendColorPixelDataBinaryMask","getCircleBrushOrPencilStrokeBounds","getCircleBrushOrPencilBounds","defaults","applyRectBrushToPixelData","getRectBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataAlphaMask","getRectBrushOrPencilBounds","getRectBrushOrPencilStrokeBounds","defaults","applyRectBrushToPixelData","getRectBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataBinaryMask","getRectBrushOrPencilBounds","getRectBrushOrPencilStrokeBounds","defaults","blendColorPixelData","defaults","blendPixelData","defaults","fillPixelData","defaults","fillPixelData","SCRATCH_RECT","defaults","invertPixelData","defaults","applyCircleBrushToPixelData","getCircleBrushOrPencilBounds","SCRATCH_BLIT","SCRATCH_BLIT","r","g","b","a","SCRATCH_BLIT","SCRATCH_BLIT"]}
|
|
1
|
+
{"version":3,"sources":["../src/_types.ts","../src/color.ts","../src/Internal/resolveClipping.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMaskBuffer.ts","../src/Rect/trimRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes-fast.ts","../src/BlendModes/blend-modes-perfect.ts","../src/BlendModes/toBlendModeIndexAndName.ts","../src/Canvas/_constants.ts","../src/Canvas/PixelCanvas.ts","../src/Canvas/ReusableCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/HistoryManager.ts","../src/History/PixelPatchTiles.ts","../src/History/PixelAccumulator.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/applyAlphaMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyAlphaMask.ts","../src/PixelData/applyBinaryMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyBinaryMask.ts","../src/Rect/getCircleBrushOrPencilBounds.ts","../src/PixelData/blendColorPixelDataAlphaMask.ts","../src/PixelData/blendColorPixelDataBinaryMask.ts","../src/PixelData/applyCircleBrushToPixelData.ts","../src/History/PixelMutator/mutatorApplyCircleBrush.ts","../src/Algorithm/forEachLinePoint.ts","../src/Rect/getCircleBrushOrPencilStrokeBounds.ts","../src/History/PixelMutator/mutatorApplyCircleBrushStroke.ts","../src/History/PixelMutator/mutatorApplyCirclePencilStroke.ts","../src/Rect/getRectBrushOrPencilBounds.ts","../src/PixelData/applyRectBrushToPixelData.ts","../src/History/PixelMutator/mutatorApplyRectBrush.ts","../src/Rect/getRectBrushOrPencilStrokeBounds.ts","../src/History/PixelMutator/mutatorApplyRectBrushStroke.ts","../src/History/PixelMutator/mutatorApplyRectPencil.ts","../src/History/PixelMutator/mutatorApplyRectPencilStroke.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorClear.ts","../src/History/PixelMutator/mutatorFill.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/History/PixelWriter.ts","../src/History/PixelMutator/mutatorApplyCirclePencil.ts","../src/PixelData/fillPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorFillBinaryMask.ts","../src/ImageData/copyImageData.ts","../src/ImageData/ImageDataLike.ts","../src/ImageData/imageDataToAlphaMaskBuffer.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/imageDataToUInt32Array.ts","../src/ImageData/invertImageData.ts","../src/Internal/resample32.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/resizeImageData.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/uInt32ArrayToImageData.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/indexedImageToImageData.ts","../src/IndexedImage/resampleIndexedImage.ts","../src/Input/fileInputChangeToImageData.ts","../src/Input/fileToImageData.ts","../src/Input/getSupportedRasterFormats.ts","../src/Mask/AlphaMask.ts","../src/Mask/BinaryMask.ts","../src/Mask/CircleBrushAlphaMask.ts","../src/Mask/CircleBrushBinaryMask.ts","../src/Mask/applyBinaryMaskToAlphaMask.ts","../src/Mask/copyMask.ts","../src/Mask/extractMask.ts","../src/Mask/invertMask.ts","../src/Mask/mergeAlphaMasks.ts","../src/Mask/mergeBinaryMasks.ts","../src/Mask/setMaskData.ts","../src/MaskRect/subtractBinaryMaskRects.ts","../src/Rect/getRectsBounds.ts","../src/MaskRect/merge2BinaryMaskRects.ts","../src/MaskRect/mergeBinaryMaskRects.ts","../src/PixelData/PixelData.ts","../src/PixelData/blendPixelDataAlphaMask.ts","../src/PixelData/blendPixelDataBinaryMask.ts","../src/PixelData/clearPixelData.ts","../src/PixelData/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/PixelBuffer32.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/writePixelDataBuffer.ts"],"sourcesContent":["/** ALL values are 0-255 (including alpha which in CSS is 0-1) */\nexport type RGBA = {\n r: number;\n g: number;\n b: number;\n a: number;\n};\n\n/** Represents a 32-bit color in 0xAABBGGRR (Little endian) */\nexport type Color32 = number & {\n readonly __brandColor32: unique symbol;\n};\n\n/**\n * A function that defines how to combine a source color with a destination color.\n * @param src - The incoming color (source).\n * @param dst - The existing color in the buffer (destination).\n * @returns The resulting 32-bit color to be written to the buffer.\n */\nexport type BlendColor32 = {\n (src: Color32, dst: Color32): Color32;\n isOverwrite?: true;\n};\nexport type ImageDataLike = {\n width: number;\n height: number;\n data: Uint8ClampedArray<ArrayBufferLike>;\n};\nexport type ImageDataLikeConstructor<T extends ImageDataLike = ImageDataLike> = {\n new (data: Uint8ClampedArray, width: number, height: number): T;\n};\nexport type SerializedImageData = {\n width: number;\n height: number;\n data: string;\n};\nexport type Base64EncodedUInt8Array = string & {\n readonly __brandBase64UInt8Array: unique symbol;\n};\n\n/** Rectangle definition */\nexport type Rect = {\n x: number;\n y: number;\n w: number;\n h: number;\n};\n\n/**\n * Defines how mask values should be interpreted during a draw operation.\n */\nexport enum MaskType {\n /**\n * Values are treated as alpha weights.\n * 0 is skipped, values > 0 are processed.\n */\n ALPHA,\n /**\n * Values are treated as on/off.\n * 0 is fully transparent (skipped), any other value is fully opaque.\n */\n BINARY,\n}\nexport interface Mask {\n readonly type: MaskType;\n readonly data: Uint8Array;\n readonly w: number;\n readonly h: number;\n}\n\n/** Strictly 0 or 1 */\nexport interface BinaryMask extends Mask {\n readonly type: MaskType.BINARY;\n}\n\n/** Strictly 0-255 */\nexport interface AlphaMask extends Mask {\n readonly type: MaskType.ALPHA;\n}\ninterface CircleBrush {\n readonly size: number;\n readonly radius: number;\n readonly minOffset: number;\n}\nexport interface CircleBrushAlphaMask extends CircleBrush, AlphaMask {}\nexport interface CircleBrushBinaryMask extends CircleBrush, BinaryMask {}\nexport type CircleBrushMask = CircleBrushAlphaMask | CircleBrushBinaryMask;\n\n/**\n * Configuration for pixel manipulation operations.\n * Designed to be used by spreading a Rect object ({x, y, w, h}) directly.\n */\nexport interface PixelRect {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number;\n\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number;\n\n /**\n * The width of the region in the destination buffer.\n * @default Source width.\n */\n w?: number;\n\n /**\n * The height of the region in the destination buffer.\n * @default Source height.\n */\n h?: number;\n}\nexport interface MaskOffset {\n /**\n * X offset into the mask buffer.\n * @default 0\n */\n mx?: number;\n\n /**\n * Y offset into the mask buffer.\n * @default 0\n */\n my?: number;\n}\nexport interface InvertMask {\n /**\n * If true the inverse of the mask will be applied\n * @default false\n */\n invertMask?: boolean;\n}\ninterface Alpha {\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: number;\n}\nexport interface ApplyMaskToPixelDataOptions extends PixelRect, Alpha, MaskOffset, InvertMask {}\nexport interface MergeAlphaMasksOptions extends PixelRect, Alpha, MaskOffset, InvertMask {}\nexport interface PixelMutateOptions extends PixelRect, MaskOffset, InvertMask {\n /** An optional mask to restrict where pixels are mutated. */\n mask?: BinaryMask | null;\n}\n\n/**\n * Configuration for blitting (copying/blending) one image into another.\n */\n\nexport interface BasePixelBlendOptions {\n /**\n * The source rectangle x-coordinate\n * @default 0\n */\n sx?: number;\n\n /**\n * The source rectangle y-coordinate\n * @default 0\n */\n sy?: number;\n\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverPerfect}\n */\n blendFn?: BlendColor32;\n}\nexport interface PixelBlendOptions extends PixelRect, Alpha, BasePixelBlendOptions {}\nexport interface PixelBlendMaskOptions extends PixelRect, Alpha, MaskOffset, InvertMask, BasePixelBlendOptions {}\n\n/**\n * Configuration for operations that require color blending.\n */\nexport interface ColorBlendOptions extends PixelRect, Alpha {\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverPerfect}\n */\n blendFn?: BlendColor32;\n}\nexport interface ColorBlendMaskOptions extends ColorBlendOptions, MaskOffset, InvertMask {}\nexport type BinaryMaskRect = Rect & {\n type: MaskType.BINARY;\n data: Uint8Array;\n};\nexport type NullableBinaryMaskRect = Rect & ({\n type: MaskType.BINARY;\n data: Uint8Array;\n} | {\n type?: null;\n data?: null;\n});\nexport type NullableMaskRect = Rect & ({\n type: MaskType;\n data: Uint8Array;\n} | {\n type?: null;\n data?: null;\n});\nexport type AlphaMaskRect = Rect & {\n mask: AlphaMask;\n};\nexport type HistoryMutator<T extends {}, D extends {}> = (writer: PixelWriter<any>, deps?: Partial<D>) => T;\nexport interface IPixelData {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxXcml0ZXIsIHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi9pbmRleCdcblxuLyoqIEFMTCB2YWx1ZXMgYXJlIDAtMjU1IChpbmNsdWRpbmcgYWxwaGEgd2hpY2ggaW4gQ1NTIGlzIDAtMSkgKi9cbmV4cG9ydCB0eXBlIFJHQkEgPSB7IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciB9XG5cbi8qKiBSZXByZXNlbnRzIGEgMzItYml0IGNvbG9yIGluIDB4QUFCQkdHUlIgKExpdHRsZSBlbmRpYW4pICovXG5leHBvcnQgdHlwZSBDb2xvcjMyID0gbnVtYmVyICYgeyByZWFkb25seSBfX2JyYW5kQ29sb3IzMjogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIGNvbWJpbmUgYSBzb3VyY2UgY29sb3Igd2l0aCBhIGRlc3RpbmF0aW9uIGNvbG9yLlxuICogQHBhcmFtIHNyYyAtIFRoZSBpbmNvbWluZyBjb2xvciAoc291cmNlKS5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZXhpc3RpbmcgY29sb3IgaW4gdGhlIGJ1ZmZlciAoZGVzdGluYXRpb24pLlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyAzMi1iaXQgY29sb3IgdG8gYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyLlxuICovXG5leHBvcnQgdHlwZSBCbGVuZENvbG9yMzIgPSB7XG4gIChzcmM6IENvbG9yMzIsIGRzdDogQ29sb3IzMik6IENvbG9yMzIsXG4gIGlzT3ZlcndyaXRlPzogdHJ1ZVxufVxuXG5leHBvcnQgdHlwZSBJbWFnZURhdGFMaWtlID0ge1xuICB3aWR0aDogbnVtYmVyXG4gIGhlaWdodDogbnVtYmVyXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyTGlrZT5cbn1cblxuZXhwb3J0IHR5cGUgSW1hZ2VEYXRhTGlrZUNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBJbWFnZURhdGFMaWtlID0gSW1hZ2VEYXRhTGlrZT4gPSB7XG4gIG5ldyhcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBUXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRJbWFnZURhdGEgPSB7XG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbiAgZGF0YTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEJhc2U2NEVuY29kZWRVSW50OEFycmF5ID0gc3RyaW5nICYgeyByZWFkb25seSBfX2JyYW5kQmFzZTY0VUludDhBcnJheTogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKiBSZWN0YW5nbGUgZGVmaW5pdGlvbiAqL1xuZXhwb3J0IHR5cGUgUmVjdCA9IHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxuICB3OiBudW1iZXJcbiAgaDogbnVtYmVyXG59XG5cbi8qKlxuICogRGVmaW5lcyBob3cgbWFzayB2YWx1ZXMgc2hvdWxkIGJlIGludGVycHJldGVkIGR1cmluZyBhIGRyYXcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBNYXNrVHlwZSB7XG4gIC8qKlxuICAgKiBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYWxwaGEgd2VpZ2h0cy5cbiAgICogMCBpcyBza2lwcGVkLCB2YWx1ZXMgPiAwIGFyZSBwcm9jZXNzZWQuXG4gICAqL1xuICBBTFBIQSxcbiAgLyoqXG4gICAqICBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgb24vb2ZmLlxuICAgKiAwIGlzIGZ1bGx5IHRyYW5zcGFyZW50IChza2lwcGVkKSwgYW55IG90aGVyIHZhbHVlIGlzIGZ1bGx5IG9wYXF1ZS5cbiAgICovXG4gIEJJTkFSWVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hc2sge1xuICByZWFkb25seSB0eXBlOiBNYXNrVHlwZVxuICByZWFkb25seSBkYXRhOiBVaW50OEFycmF5XG4gIHJlYWRvbmx5IHc6IG51bWJlclxuICByZWFkb25seSBoOiBudW1iZXJcbn1cblxuLyoqIFN0cmljdGx5IDAgb3IgMSAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5hcnlNYXNrIGV4dGVuZHMgTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlLkJJTkFSWVxufVxuXG4vKiogU3RyaWN0bHkgMC0yNTUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxwaGFNYXNrIGV4dGVuZHMgTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlLkFMUEhBXG59XG5cbmludGVyZmFjZSBDaXJjbGVCcnVzaCB7XG4gIHJlYWRvbmx5IHNpemU6IG51bWJlclxuICByZWFkb25seSByYWRpdXM6IG51bWJlclxuICByZWFkb25seSBtaW5PZmZzZXQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENpcmNsZUJydXNoQWxwaGFNYXNrIGV4dGVuZHMgQ2lyY2xlQnJ1c2gsIEFscGhhTWFzayB7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2lyY2xlQnJ1c2hCaW5hcnlNYXNrIGV4dGVuZHMgQ2lyY2xlQnJ1c2gsIEJpbmFyeU1hc2sge1xufVxuXG5leHBvcnQgdHlwZSBDaXJjbGVCcnVzaE1hc2sgPSBDaXJjbGVCcnVzaEFscGhhTWFzayB8IENpcmNsZUJydXNoQmluYXJ5TWFza1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBpeGVsIG1hbmlwdWxhdGlvbiBvcGVyYXRpb25zLlxuICogRGVzaWduZWQgdG8gYmUgdXNlZCBieSBzcHJlYWRpbmcgYSBSZWN0IG9iamVjdCAoe3gsIHksIHcsIGh9KSBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXhlbFJlY3Qge1xuICAvKipcbiAgICogVGhlIHN0YXJ0aW5nIFggY29vcmRpbmF0ZSBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICB4PzogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSBzdGFydGluZyBZIGNvb3JkaW5hdGUgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgeT86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLlxuICAgKiBAZGVmYXVsdCBTb3VyY2Ugd2lkdGguXG4gICAqL1xuICB3PzogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLlxuICAgKiBAZGVmYXVsdCBTb3VyY2UgaGVpZ2h0LlxuICAgKi9cbiAgaD86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hc2tPZmZzZXQge1xuICAvKipcbiAgICogWCBvZmZzZXQgaW50byB0aGUgbWFzayBidWZmZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIG14PzogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFkgb2Zmc2V0IGludG8gdGhlIG1hc2sgYnVmZmVyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBteT86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludmVydE1hc2sge1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlIHRoZSBpbnZlcnNlIG9mIHRoZSBtYXNrIHdpbGwgYmUgYXBwbGllZFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgaW52ZXJ0TWFzaz86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEFscGhhIHtcbiAgLyoqXG4gICAqIE92ZXJhbGwgbGF5ZXIgb3BhY2l0eSAwLTI1NS5cbiAgICogQGRlZmF1bHQgMjU1XG4gICAqL1xuICBhbHBoYT86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyBleHRlbmRzIFBpeGVsUmVjdCwgQWxwaGEsIE1hc2tPZmZzZXQsIEludmVydE1hc2sge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lcmdlQWxwaGFNYXNrc09wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrIHtcblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsTXV0YXRlT3B0aW9ucyBleHRlbmRzIFBpeGVsUmVjdCwgTWFza09mZnNldCwgSW52ZXJ0TWFzayB7XG4gIC8qKiBBbiBvcHRpb25hbCBtYXNrIHRvIHJlc3RyaWN0IHdoZXJlIHBpeGVscyBhcmUgbXV0YXRlZC4gKi9cbiAgbWFzaz86IEJpbmFyeU1hc2sgfCBudWxsXG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYmxpdHRpbmcgKGNvcHlpbmcvYmxlbmRpbmcpIG9uZSBpbWFnZSBpbnRvIGFub3RoZXIuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBCYXNlUGl4ZWxCbGVuZE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSByZWN0YW5nbGUgeC1jb29yZGluYXRlXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHN4PzogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcmVjdGFuZ2xlIHktY29vcmRpbmF0ZVxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBzeT86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgYmxlbmRpbmcgYWxnb3JpdGhtIHRvIHVzZSBmb3IgYmxlbmRpbmcgcGl4ZWxzLlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgc291cmNlT3ZlclBlcmZlY3R9XG4gICAqL1xuICBibGVuZEZuPzogQmxlbmRDb2xvcjMyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxCbGVuZE9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBCYXNlUGl4ZWxCbGVuZE9wdGlvbnMge1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxCbGVuZE1hc2tPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgTWFza09mZnNldCwgSW52ZXJ0TWFzaywgQmFzZVBpeGVsQmxlbmRPcHRpb25zIHtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBjb2xvciBibGVuZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2xvckJsZW5kT3B0aW9ucyBleHRlbmRzIFBpeGVsUmVjdCwgQWxwaGEge1xuICAvKipcbiAgICogVGhlIGJsZW5kaW5nIGFsZ29yaXRobSB0byB1c2UgZm9yIGJsZW5kaW5nIHBpeGVscy5cbiAgICogQGRlZmF1bHQge0BsaW5rIHNvdXJjZU92ZXJQZXJmZWN0fVxuICAgKi9cbiAgYmxlbmRGbj86IEJsZW5kQ29sb3IzMlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yQmxlbmRNYXNrT3B0aW9ucyBleHRlbmRzIENvbG9yQmxlbmRPcHRpb25zLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrIHtcbn1cblxuZXhwb3J0IHR5cGUgQmluYXJ5TWFza1JlY3QgPSBSZWN0ICYge1xuICB0eXBlOiBNYXNrVHlwZS5CSU5BUllcbiAgZGF0YTogVWludDhBcnJheVxufVxuXG5leHBvcnQgdHlwZSBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0ID0gUmVjdCAmICh7XG4gIHR5cGU6IE1hc2tUeXBlLkJJTkFSWVxuICBkYXRhOiBVaW50OEFycmF5XG59IHwge1xuICB0eXBlPzogbnVsbFxuICBkYXRhPzogbnVsbFxufSlcblxuXG5leHBvcnQgdHlwZSBOdWxsYWJsZU1hc2tSZWN0ID0gUmVjdCAmICh7XG4gIHR5cGU6IE1hc2tUeXBlXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbn0gfCB7XG4gIHR5cGU/OiBudWxsXG4gIGRhdGE/OiBudWxsXG59KVxuXG5leHBvcnQgdHlwZSBBbHBoYU1hc2tSZWN0ID0gUmVjdCAmIHtcbiAgbWFzazogQWxwaGFNYXNrXG59XG5cbmV4cG9ydCB0eXBlIEhpc3RvcnlNdXRhdG9yPFQgZXh0ZW5kcyB7fSwgRCBleHRlbmRzIHt9PiA9ICh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM/OiBQYXJ0aWFsPEQ+KSA9PiBUXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBpeGVsRGF0YSB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXlcbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlclxuICByZWFkb25seSBoZWlnaHQ6IG51bWJlclxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from './_types';\n\n/**\n * Packs RGBA into a 32-bit integer compatible with\n * Little-Endian Uint32Array views on ImageData.\n */\nexport function packColor(r: number, g: number, b: number, a: number): Color32 {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n}\nexport function packRGBA({\n r,\n g,\n b,\n a\n}: RGBA): Color32 {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n}\nexport const unpackRed = (packed: Color32): number => packed >>> 0 & 0xFF;\nexport const unpackGreen = (packed: Color32): number => packed >>> 8 & 0xFF;\nexport const unpackBlue = (packed: Color32): number => packed >>> 16 & 0xFF;\nexport const unpackAlpha = (packed: Color32): number => packed >>> 24 & 0xFF;\nexport function unpackColor(packed: Color32): RGBA {\n return {\n r: packed >>> 0 & 0xFF,\n g: packed >>> 8 & 0xFF,\n b: packed >>> 16 & 0xFF,\n a: packed >>> 24 & 0xFF\n };\n}\nconst SCRATCH_RGBA: RGBA = {\n r: 0,\n g: 0,\n b: 0,\n a: 0\n};\n\n// uses a scratch arg for memory perf. be careful about re-use.\nexport function unpackColorTo(packed: Color32, scratch = SCRATCH_RGBA): RGBA {\n scratch.r = packed >>> 0 & 0xFF;\n scratch.g = packed >>> 8 & 0xFF;\n scratch.b = packed >>> 16 & 0xFF;\n scratch.a = packed >>> 24 & 0xFF;\n return scratch;\n}\nexport function colorDistance(a: Color32, b: Color32): number {\n const dr = (a & 0xFF) - (b & 0xFF);\n const dg = (a >>> 8 & 0xFF) - (b >>> 8 & 0xFF);\n const db = (a >>> 16 & 0xFF) - (b >>> 16 & 0xFF);\n const da = (a >>> 24 & 0xFF) - (b >>> 24 & 0xFF);\n return dr * dr + dg * dg + db * db + da * da;\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using a floating-point weight.\n * * This is the preferred method for UI animations or scenarios where high\n * precision is required. It uses the standard `a + t * (b - a)` formula\n * for each channel.\n * @param a - The starting color as a 32-bit integer (AABBGGRR).\n * @param b - The target color as a 32-bit integer (AABBGGRR).\n * @param t - The interpolation factor between 0.0 and 1.0.\n * @returns The interpolated 32-bit color.\n */\nexport function lerpColor32(a: Color32, b: Color32, t: number): Color32 {\n const r = (a & 0xFF) + t * ((b & 0xFF) - (a & 0xFF));\n const g = (a >>> 8 & 0xFF) + t * ((b >>> 8 & 0xFF) - (a >>> 8 & 0xFF));\n const b_ = (a >>> 16 & 0xFF) + t * ((b >>> 16 & 0xFF) - (a >>> 16 & 0xFF));\n const a_ = (a >>> 24 & 0xFF) + t * ((b >>> 24 & 0xFF) - (a >>> 24 & 0xFF));\n return (a_ << 24 | b_ << 16 | g << 8 | r) >>> 0 as Color32;\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using integer fixed-point math.\n * Highly optimized for image processing and real-time blitting. It processes\n * channels in parallel using bitmasks (RB and GA pairs).\n * **Note:** Subject to a 1-bit drift (rounding down) due to fast bit-shift division.\n * @param src - The source (foreground) color as a 32-bit integer.\n * @param dst - The destination (background) color as a 32-bit integer.\n * @param w - The blend weight as a byte value from 0 to 255. Where 0 is 100% dst and 255 is 100% src\n * @returns The blended 32-bit color.\n */\nexport function lerpColor32Fast(src: Color32, dst: Color32, w: number): Color32 {\n const invA = 255 - w;\n\n // Masking Red and Blue: 0x00FF00FF\n // We process R and B in one go, then shift back down\n const rb = (src & 0x00FF00FF) * w + (dst & 0x00FF00FF) * invA >>> 8 & 0x00FF00FF;\n\n // Masking Green and Alpha: 0xFF00FF00\n // We shift down first to avoid overflow, then shift back up\n const ga = (src >>> 8 & 0x00FF00FF) * w + (dst >>> 8 & 0x00FF00FF) * invA >>> 8 & 0x00FF00FF;\n return (rb | ga << 8) >>> 0 as Color32;\n}\n\n// Convert 0xAABBGGRR to #RRGGBBAA\nexport function color32ToHex(color: Color32): string {\n const r = (color & 0xFF).toString(16).padStart(2, '0');\n const g = (color >>> 8 & 0xFF).toString(16).padStart(2, '0');\n const b = (color >>> 16 & 0xFF).toString(16).padStart(2, '0');\n const a = (color >>> 24 & 0xFF).toString(16).padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n}\n\n/**\n * Converts a 32-bit integer (0xAABBGGRR) to a CSS rgba() string.\n * Example: 0xFF0000FF -> \"rgba(255,0,0,1)\"\n */\nexport function color32ToCssRGBA(color: Color32): string {\n const r = color & 0xFF;\n const g = color >>> 8 & 0xFF;\n const b = color >>> 16 & 0xFF;\n const a = color >>> 24 & 0xFF;\n const alpha = Number((a / 255).toFixed(3));\n return `rgba(${r},${g},${b},${alpha})`;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBSR0JBIH0gZnJvbSAnLi9fdHlwZXMnXG5cbi8qKlxuICogUGFja3MgUkdCQSBpbnRvIGEgMzItYml0IGludGVnZXIgY29tcGF0aWJsZSB3aXRoXG4gKiBMaXR0bGUtRW5kaWFuIFVpbnQzMkFycmF5IHZpZXdzIG9uIEltYWdlRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2tDb2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIpOiBDb2xvcjMyIHtcbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2tSR0JBKHsgciwgZywgYiwgYSB9OiBSR0JBKTogQ29sb3IzMiB7XG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCB1bnBhY2tSZWQgPSAocGFja2VkOiBDb2xvcjMyKTogbnVtYmVyID0+IChwYWNrZWQgPj4+IDApICYgMHhGRlxuZXhwb3J0IGNvbnN0IHVucGFja0dyZWVuID0gKHBhY2tlZDogQ29sb3IzMik6IG51bWJlciA9PiAocGFja2VkID4+PiA4KSAmIDB4RkZcbmV4cG9ydCBjb25zdCB1bnBhY2tCbHVlID0gKHBhY2tlZDogQ29sb3IzMik6IG51bWJlciA9PiAocGFja2VkID4+PiAxNikgJiAweEZGXG5leHBvcnQgY29uc3QgdW5wYWNrQWxwaGEgPSAocGFja2VkOiBDb2xvcjMyKTogbnVtYmVyID0+IChwYWNrZWQgPj4+IDI0KSAmIDB4RkZcblxuZXhwb3J0IGZ1bmN0aW9uIHVucGFja0NvbG9yKHBhY2tlZDogQ29sb3IzMik6IFJHQkEge1xuICByZXR1cm4ge1xuICAgIHI6IChwYWNrZWQgPj4+IDApICYgMHhGRixcbiAgICBnOiAocGFja2VkID4+PiA4KSAmIDB4RkYsXG4gICAgYjogKHBhY2tlZCA+Pj4gMTYpICYgMHhGRixcbiAgICBhOiAocGFja2VkID4+PiAyNCkgJiAweEZGLFxuICB9XG59XG5cbmNvbnN0IFNDUkFUQ0hfUkdCQTogUkdCQSA9IHsgcjogMCwgZzogMCwgYjogMCwgYTogMCB9XG5cbi8vIHVzZXMgYSBzY3JhdGNoIGFyZyBmb3IgbWVtb3J5IHBlcmYuIGJlIGNhcmVmdWwgYWJvdXQgcmUtdXNlLlxuZXhwb3J0IGZ1bmN0aW9uIHVucGFja0NvbG9yVG8ocGFja2VkOiBDb2xvcjMyLCBzY3JhdGNoID0gU0NSQVRDSF9SR0JBKTogUkdCQSB7XG4gIHNjcmF0Y2guciA9IChwYWNrZWQgPj4+IDApICYgMHhGRlxuICBzY3JhdGNoLmcgPSAocGFja2VkID4+PiA4KSAmIDB4RkZcbiAgc2NyYXRjaC5iID0gKHBhY2tlZCA+Pj4gMTYpICYgMHhGRlxuICBzY3JhdGNoLmEgPSAocGFja2VkID4+PiAyNCkgJiAweEZGXG4gIHJldHVybiBzY3JhdGNoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckRpc3RhbmNlKGE6IENvbG9yMzIsIGI6IENvbG9yMzIpOiBudW1iZXIge1xuICBjb25zdCBkciA9IChhICYgMHhGRikgLSAoYiAmIDB4RkYpXG4gIGNvbnN0IGRnID0gKChhID4+PiA4KSAmIDB4RkYpIC0gKChiID4+PiA4KSAmIDB4RkYpXG4gIGNvbnN0IGRiID0gKChhID4+PiAxNikgJiAweEZGKSAtICgoYiA+Pj4gMTYpICYgMHhGRilcbiAgY29uc3QgZGEgPSAoKGEgPj4+IDI0KSAmIDB4RkYpIC0gKChiID4+PiAyNCkgJiAweEZGKVxuICByZXR1cm4gZHIgKiBkciArIGRnICogZGcgKyBkYiAqIGRiICsgZGEgKiBkYVxufVxuXG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHR3byAzMi1iaXQgY29sb3JzIHVzaW5nIGEgZmxvYXRpbmctcG9pbnQgd2VpZ2h0LlxuICogKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBVSSBhbmltYXRpb25zIG9yIHNjZW5hcmlvcyB3aGVyZSBoaWdoXG4gKiBwcmVjaXNpb24gaXMgcmVxdWlyZWQuIEl0IHVzZXMgdGhlIHN0YW5kYXJkIGBhICsgdCAqIChiIC0gYSlgIGZvcm11bGFcbiAqIGZvciBlYWNoIGNoYW5uZWwuXG4gKiBAcGFyYW0gYSAtIFRoZSBzdGFydGluZyBjb2xvciBhcyBhIDMyLWJpdCBpbnRlZ2VyIChBQUJCR0dSUikuXG4gKiBAcGFyYW0gYiAtIFRoZSB0YXJnZXQgY29sb3IgYXMgYSAzMi1iaXQgaW50ZWdlciAoQUFCQkdHUlIpLlxuICogQHBhcmFtIHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAqIEByZXR1cm5zIFRoZSBpbnRlcnBvbGF0ZWQgMzItYml0IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVycENvbG9yMzIoYTogQ29sb3IzMiwgYjogQ29sb3IzMiwgdDogbnVtYmVyKTogQ29sb3IzMiB7XG4gIGNvbnN0IHIgPSAoYSAmIDB4RkYpICsgdCAqICgoYiAmIDB4RkYpIC0gKGEgJiAweEZGKSlcbiAgY29uc3QgZyA9ICgoYSA+Pj4gOCkgJiAweEZGKSArIHQgKiAoKChiID4+PiA4KSAmIDB4RkYpIC0gKChhID4+PiA4KSAmIDB4RkYpKVxuICBjb25zdCBiXyA9ICgoYSA+Pj4gMTYpICYgMHhGRikgKyB0ICogKCgoYiA+Pj4gMTYpICYgMHhGRikgLSAoKGEgPj4+IDE2KSAmIDB4RkYpKVxuICBjb25zdCBhXyA9ICgoYSA+Pj4gMjQpICYgMHhGRikgKyB0ICogKCgoYiA+Pj4gMjQpICYgMHhGRikgLSAoKGEgPj4+IDI0KSAmIDB4RkYpKVxuXG4gIHJldHVybiAoKGFfIDw8IDI0KSB8IChiXyA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqXG4gKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0d28gMzItYml0IGNvbG9ycyB1c2luZyBpbnRlZ2VyIGZpeGVkLXBvaW50IG1hdGguXG4gKiBIaWdobHkgb3B0aW1pemVkIGZvciBpbWFnZSBwcm9jZXNzaW5nIGFuZCByZWFsLXRpbWUgYmxpdHRpbmcuIEl0IHByb2Nlc3Nlc1xuICogY2hhbm5lbHMgaW4gcGFyYWxsZWwgdXNpbmcgYml0bWFza3MgKFJCIGFuZCBHQSBwYWlycykuXG4gKiAqKk5vdGU6KiogU3ViamVjdCB0byBhIDEtYml0IGRyaWZ0IChyb3VuZGluZyBkb3duKSBkdWUgdG8gZmFzdCBiaXQtc2hpZnQgZGl2aXNpb24uXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSAoZm9yZWdyb3VuZCkgY29sb3IgYXMgYSAzMi1iaXQgaW50ZWdlci5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZGVzdGluYXRpb24gKGJhY2tncm91bmQpIGNvbG9yIGFzIGEgMzItYml0IGludGVnZXIuXG4gKiBAcGFyYW0gdyAtIFRoZSBibGVuZCB3ZWlnaHQgYXMgYSBieXRlIHZhbHVlIGZyb20gMCB0byAyNTUuIFdoZXJlIDAgaXMgMTAwJSBkc3QgYW5kIDI1NSBpcyAxMDAlIHNyY1xuICogQHJldHVybnMgVGhlIGJsZW5kZWQgMzItYml0IGNvbG9yLlxuICovZXhwb3J0IGZ1bmN0aW9uIGxlcnBDb2xvcjMyRmFzdChzcmM6IENvbG9yMzIsIGRzdDogQ29sb3IzMiwgdzogbnVtYmVyKTogQ29sb3IzMiB7XG4gIGNvbnN0IGludkEgPSAyNTUgLSB3XG5cbiAgLy8gTWFza2luZyBSZWQgYW5kIEJsdWU6IDB4MDBGRjAwRkZcbiAgLy8gV2UgcHJvY2VzcyBSIGFuZCBCIGluIG9uZSBnbywgdGhlbiBzaGlmdCBiYWNrIGRvd25cbiAgY29uc3QgcmIgPSAoKChzcmMgJiAweDAwRkYwMEZGKSAqIHcgKyAoZHN0ICYgMHgwMEZGMDBGRikgKiBpbnZBKSA+Pj4gOCkgJiAweDAwRkYwMEZGXG5cbiAgLy8gTWFza2luZyBHcmVlbiBhbmQgQWxwaGE6IDB4RkYwMEZGMDBcbiAgLy8gV2Ugc2hpZnQgZG93biBmaXJzdCB0byBhdm9pZCBvdmVyZmxvdywgdGhlbiBzaGlmdCBiYWNrIHVwXG4gIGNvbnN0IGdhID0gKCgoKHNyYyA+Pj4gOCkgJiAweDAwRkYwMEZGKSAqIHcgKyAoKGRzdCA+Pj4gOCkgJiAweDAwRkYwMEZGKSAqIGludkEpID4+PiA4KSAmIDB4MDBGRjAwRkZcblxuICByZXR1cm4gKHJiIHwgKGdhIDw8IDgpKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8vIENvbnZlcnQgMHhBQUJCR0dSUiB0byAjUlJHR0JCQUFcbmV4cG9ydCBmdW5jdGlvbiBjb2xvcjMyVG9IZXgoY29sb3I6IENvbG9yMzIpOiBzdHJpbmcge1xuICBjb25zdCByID0gKGNvbG9yICYgMHhGRikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgZyA9ICgoY29sb3IgPj4+IDgpICYgMHhGRikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgYiA9ICgoY29sb3IgPj4+IDE2KSAmIDB4RkYpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IGEgPSAoKGNvbG9yID4+PiAyNCkgJiAweEZGKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKVxuICByZXR1cm4gYCMke3J9JHtnfSR7Yn0ke2F9YFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgMzItYml0IGludGVnZXIgKDB4QUFCQkdHUlIpIHRvIGEgQ1NTIHJnYmEoKSBzdHJpbmcuXG4gKiBFeGFtcGxlOiAweEZGMDAwMEZGIC0+IFwicmdiYSgyNTUsMCwwLDEpXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yMzJUb0Nzc1JHQkEoY29sb3I6IENvbG9yMzIpOiBzdHJpbmcge1xuICBjb25zdCByID0gY29sb3IgJiAweEZGXG4gIGNvbnN0IGcgPSAoY29sb3IgPj4+IDgpICYgMHhGRlxuICBjb25zdCBiID0gKGNvbG9yID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGEgPSAoY29sb3IgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCBhbHBoYSA9IE51bWJlcigoYSAvIDI1NSkudG9GaXhlZCgzKSlcblxuICByZXR1cm4gYHJnYmEoJHtyfSwke2d9LCR7Yn0sJHthbHBoYX0pYFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type ClippedRect = {\n x: number;\n y: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\nexport type ClippedBlit = {\n x: number;\n y: number;\n sx: number;\n sy: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\n\n// use factory functions when creating reusable objects ensure property order for JIT perf\nexport const makeClippedRect = (): ClippedRect => ({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\nexport const makeClippedBlit = (): ClippedBlit => ({\n x: 0,\n y: 0,\n sx: 0,\n sy: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\n\n/**\n * Calculates the intersection of a target rectangle and a bounding box (usually 0,0 -> width,height).\n * Handles negative offsets by shrinking dimensions.\n */\nexport function resolveRectClipping(x: number, y: number, w: number, h: number, boundaryW: number, boundaryH: number, out: ClippedRect): ClippedRect {\n // Destination Clipping (Top/Left)\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n\n // Destination Clipping (Bottom/Right)\n const actualW = Math.min(w, boundaryW - x);\n const actualH = Math.min(h, boundaryH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n\n/**\n * Calculates the clipping for transferring data from a Source to a Destination.\n * Handles cases where the source is out of bounds (shifting the destination target)\n * AND cases where the destination is out of bounds (shifting the source target).\n */\nexport function resolveBlitClipping(x: number, y: number, sx: number, sy: number, w: number, h: number, dstW: number, dstH: number, srcW: number, srcH: number, out: ClippedBlit): ClippedBlit {\n // 1. Source Clipping: If reading from negative source, shift target right and shrink\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, srcW - sx);\n h = Math.min(h, srcH - sy);\n\n // 2. Destination Clipping: If writing to negative dest, shift source right and shrink\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dstW - x);\n const actualH = Math.min(h, dstH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.sx = sx;\n out.sy = sy;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2xpcHBlZFJlY3QgPSB7XG4gIHg6IG51bWJlclxuICB5OiBudW1iZXJcbiAgdzogbnVtYmVyXG4gIGg6IG51bWJlclxuICBpbkJvdW5kczogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBDbGlwcGVkQmxpdCA9IHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxuICBzeDogbnVtYmVyXG4gIHN5OiBudW1iZXJcbiAgdzogbnVtYmVyXG4gIGg6IG51bWJlclxuICBpbkJvdW5kczogYm9vbGVhblxufVxuXG4vLyB1c2UgZmFjdG9yeSBmdW5jdGlvbnMgd2hlbiBjcmVhdGluZyByZXVzYWJsZSBvYmplY3RzIGVuc3VyZSBwcm9wZXJ0eSBvcmRlciBmb3IgSklUIHBlcmZcbmV4cG9ydCBjb25zdCBtYWtlQ2xpcHBlZFJlY3QgPSAoKTogQ2xpcHBlZFJlY3QgPT4gKHtcbiAgeDogMCxcbiAgeTogMCxcbiAgdzogMCxcbiAgaDogMCxcbiAgaW5Cb3VuZHM6IGZhbHNlLFxufSlcblxuZXhwb3J0IGNvbnN0IG1ha2VDbGlwcGVkQmxpdCA9ICgpOiBDbGlwcGVkQmxpdCA9PiAoe1xuICB4OiAwLFxuICB5OiAwLFxuICBzeDogMCxcbiAgc3k6IDAsXG4gIHc6IDAsXG4gIGg6IDAsXG4gIGluQm91bmRzOiBmYWxzZSxcbn0pXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIGEgdGFyZ2V0IHJlY3RhbmdsZSBhbmQgYSBib3VuZGluZyBib3ggKHVzdWFsbHkgMCwwIC0+IHdpZHRoLGhlaWdodCkuXG4gKiBIYW5kbGVzIG5lZ2F0aXZlIG9mZnNldHMgYnkgc2hyaW5raW5nIGRpbWVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVjdENsaXBwaW5nKFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4gIGJvdW5kYXJ5VzogbnVtYmVyLFxuICBib3VuZGFyeUg6IG51bWJlcixcbiAgb3V0OiBDbGlwcGVkUmVjdCxcbik6IENsaXBwZWRSZWN0IHtcbiAgLy8gRGVzdGluYXRpb24gQ2xpcHBpbmcgKFRvcC9MZWZ0KVxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICAvLyBEZXN0aW5hdGlvbiBDbGlwcGluZyAoQm90dG9tL1JpZ2h0KVxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgYm91bmRhcnlXIC0geClcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIGJvdW5kYXJ5SCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHtcbiAgICBvdXQuaW5Cb3VuZHMgPSBmYWxzZVxuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIG91dC54ID0geFxuICBvdXQueSA9IHlcbiAgb3V0LncgPSBhY3R1YWxXXG4gIG91dC5oID0gYWN0dWFsSFxuICBvdXQuaW5Cb3VuZHMgPSB0cnVlXG5cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNsaXBwaW5nIGZvciB0cmFuc2ZlcnJpbmcgZGF0YSBmcm9tIGEgU291cmNlIHRvIGEgRGVzdGluYXRpb24uXG4gKiBIYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBzb3VyY2UgaXMgb3V0IG9mIGJvdW5kcyAoc2hpZnRpbmcgdGhlIGRlc3RpbmF0aW9uIHRhcmdldClcbiAqIEFORCBjYXNlcyB3aGVyZSB0aGUgZGVzdGluYXRpb24gaXMgb3V0IG9mIGJvdW5kcyAoc2hpZnRpbmcgdGhlIHNvdXJjZSB0YXJnZXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHN4OiBudW1iZXIsXG4gIHN5OiBudW1iZXIsXG4gIHc6IG51bWJlcixcbiAgaDogbnVtYmVyLFxuICBkc3RXOiBudW1iZXIsXG4gIGRzdEg6IG51bWJlcixcbiAgc3JjVzogbnVtYmVyLFxuICBzcmNIOiBudW1iZXIsXG4gIG91dDogQ2xpcHBlZEJsaXQsXG4pOiBDbGlwcGVkQmxpdCB7XG4gIC8vIDEuIFNvdXJjZSBDbGlwcGluZzogSWYgcmVhZGluZyBmcm9tIG5lZ2F0aXZlIHNvdXJjZSwgc2hpZnQgdGFyZ2V0IHJpZ2h0IGFuZCBzaHJpbmtcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3hcbiAgICB3ICs9IHN4XG4gICAgc3ggPSAwXG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3lcbiAgICBoICs9IHN5XG4gICAgc3kgPSAwXG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyY1cgLSBzeClcbiAgaCA9IE1hdGgubWluKGgsIHNyY0ggLSBzeSlcblxuICAvLyAyLiBEZXN0aW5hdGlvbiBDbGlwcGluZzogSWYgd3JpdGluZyB0byBuZWdhdGl2ZSBkZXN0LCBzaGlmdCBzb3VyY2UgcmlnaHQgYW5kIHNocmlua1xuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3RXIC0geClcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIGRzdEggLSB5KVxuXG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSB7XG4gICAgb3V0LmluQm91bmRzID0gZmFsc2VcbiAgICByZXR1cm4gb3V0XG4gIH1cblxuICBvdXQueCA9IHhcbiAgb3V0LnkgPSB5XG4gIG91dC5zeCA9IHN4XG4gIG91dC5zeSA9IHN5XG4gIG91dC53ID0gYWN0dWFsV1xuICBvdXQuaCA9IGFjdHVhbEhcbiAgb3V0LmluQm91bmRzID0gdHJ1ZVxuXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a specific rectangular region of pixels from a larger {@link ImageDataLike}\n * source into a new {@link Uint8ClampedArray}.\n *\n * This is a \"read-only\" operation that returns a copy of the pixel data.\n *\n * @param imageData - The source image data to read from.\n * @param rect - A rect defining the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(imageData: ImageDataLike, rect: Rect): Uint8ClampedArray;\n/**\n * @param imageData - The source image data to read from.\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(imageData: ImageDataLike, x: number, y: number, w: number, h: number): Uint8ClampedArray;\nexport function extractImageDataBuffer(imageData: ImageDataLike, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint8ClampedArray {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const {\n width: srcW,\n height: srcH,\n data: src\n } = imageData;\n // Safety check for invalid dimensions\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0);\n const out = new Uint8ClampedArray(w * h * 4);\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return out;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const srcStart = ((srcY + row) * srcW + srcX) * 4;\n const dstStart = ((dstY + row) * w + dstX) * 4;\n\n // Perform the high-speed bulk copy\n out.set(src.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgc3BlY2lmaWMgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHBpeGVscyBmcm9tIGEgbGFyZ2VyIHtAbGluayBJbWFnZURhdGFMaWtlfVxuICogc291cmNlIGludG8gYSBuZXcge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fS5cbiAqXG4gKiBUaGlzIGlzIGEgXCJyZWFkLW9ubHlcIiBvcGVyYXRpb24gdGhhdCByZXR1cm5zIGEgY29weSBvZiB0aGUgcGl4ZWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIHNvdXJjZSBpbWFnZSBkYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSByZWN0IC0gQSByZWN0IGRlZmluaW5nIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJHQkEgcGl4ZWwgZGF0YSBvZiB0aGUgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihcbiAgaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlLFxuICByZWN0OiBSZWN0LFxuKTogVWludDhDbGFtcGVkQXJyYXlcbi8qKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byByZWFkIGZyb20uXG4gKiBAcGFyYW0geCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHcgLSBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJHQkEgcGl4ZWwgZGF0YSBvZiB0aGUgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihcbiAgaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiBVaW50OENsYW1wZWRBcnJheVxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbWFnZURhdGFCdWZmZXIoXG4gIGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSxcbiAgX3g6IFJlY3QgfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiBVaW50OENsYW1wZWRBcnJheSB7XG4gIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gdHlwZW9mIF94ID09PSAnb2JqZWN0J1xuICAgID8gX3hcbiAgICA6IHsgeDogX3gsIHk6IF95ISwgdzogX3chLCBoOiBfaCEgfVxuXG4gIGNvbnN0IHsgd2lkdGg6IHNyY1csIGhlaWdodDogc3JjSCwgZGF0YTogc3JjIH0gPSBpbWFnZURhdGFcbiAgLy8gU2FmZXR5IGNoZWNrIGZvciBpbnZhbGlkIGRpbWVuc2lvbnNcbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHJldHVybiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMClcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHcgKiBoICogNClcblxuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgICAwLFxuICAgIDAsXG4gICAgeCxcbiAgICB5LFxuICAgIHcsXG4gICAgaCxcbiAgICB3LFxuICAgIGgsXG4gICAgc3JjVyxcbiAgICBzcmNILFxuICAgIFNDUkFUQ0hfQkxJVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuIG91dFxuXG4gIGNvbnN0IHsgeDogZHN0WCwgeTogZHN0WSwgc3g6IHNyY1gsIHN5OiBzcmNZLCB3OiBjb3B5VywgaDogY29weUggfSA9IGNsaXBcbiAgY29uc3Qgcm93TGVuID0gY29weVcgKiA0XG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29weUg7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1gpICogNFxuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKChkc3RZICsgcm93KSAqIHcgKyBkc3RYKSAqIDRcblxuICAgIC8vIFBlcmZvcm0gdGhlIGhpZ2gtc3BlZWQgYnVsayBjb3B5XG4gICAgb3V0LnNldChzcmMuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgcm93TGVuKSwgZHN0U3RhcnQpXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Extracts a rectangular region from a 1D {@link Uint8Array} mask.\n * This utility calculates the necessary offsets based on the `maskWidth` to\n * slice out a specific area.\n *\n * @param maskBuffer - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMaskBuffer(maskBuffer: Uint8Array, maskWidth: number, rect: Rect): Uint8Array;\n\n/**\n * @param maskBuffer - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMaskBuffer(maskBuffer: Uint8Array, maskWidth: number, x: number, y: number, w: number, h: number): Uint8Array;\nexport function extractMaskBuffer(maskBuffer: Uint8Array, maskWidth: number, xOrRect: number | Rect, y?: number, w?: number, h?: number): Uint8Array {\n let finalX: number;\n let finalY: number;\n let finalW: number;\n let finalH: number;\n if (typeof xOrRect === 'object') {\n finalX = xOrRect.x;\n finalY = xOrRect.y;\n finalW = xOrRect.w;\n finalH = xOrRect.h;\n } else {\n finalX = xOrRect;\n finalY = y!;\n finalW = w!;\n finalH = h!;\n }\n const out = new Uint8Array(finalW * finalH);\n const srcH = maskBuffer.length / maskWidth;\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row;\n if (currentSrcY < 0 || currentSrcY >= srcH) {\n continue;\n }\n const start = Math.max(0, finalX);\n const end = Math.min(maskWidth, finalX + finalW);\n if (start < end) {\n const srcOffset = currentSrcY * maskWidth + start;\n const dstOffset = row * finalW + (start - finalX);\n const count = end - start;\n out.set(maskBuffer.subarray(srcOffset, srcOffset + count), dstOffset);\n }\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gYSAxRCB7QGxpbmsgVWludDhBcnJheX0gbWFzay5cbiAqIFRoaXMgdXRpbGl0eSBjYWxjdWxhdGVzIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0cyBiYXNlZCBvbiB0aGUgYG1hc2tXaWR0aGAgdG9cbiAqIHNsaWNlIG91dCBhIHNwZWNpZmljIGFyZWEuXG4gKlxuICogQHBhcmFtIG1hc2tCdWZmZXIgLSBUaGUgc291cmNlIDFEIGFycmF5IHJlcHJlc2VudGluZyB0aGUgZnVsbCAyRCBtYXNrLlxuICogQHBhcmFtIG1hc2tXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgc291cmNlIG1hc2sgKHN0cmlkZSkuXG4gKiBAcGFyYW0gcmVjdCAtIEEge0BsaW5rIFJlY3R9IG9iamVjdCBkZWZpbmluZyB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgVWludDhBcnJheX0gY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNYXNrQnVmZmVyKFxuICBtYXNrQnVmZmVyOiBVaW50OEFycmF5LFxuICBtYXNrV2lkdGg6IG51bWJlcixcbiAgcmVjdDogUmVjdCxcbik6IFVpbnQ4QXJyYXlcblxuLyoqXG4gKiBAcGFyYW0gbWFza0J1ZmZlciAtIFRoZSBzb3VyY2UgMUQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBmdWxsIDJEIG1hc2suXG4gKiBAcGFyYW0gbWFza1dpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgbWFzayAoc3RyaWRlKS5cbiAqIEBwYXJhbSB4IC0gVGhlIHN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcGFyYW0gaCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIFVpbnQ4QXJyYXl9IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TWFza0J1ZmZlcihcbiAgbWFza0J1ZmZlcjogVWludDhBcnJheSxcbiAgbWFza1dpZHRoOiBudW1iZXIsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbik6IFVpbnQ4QXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TWFza0J1ZmZlcihcbiAgbWFza0J1ZmZlcjogVWludDhBcnJheSxcbiAgbWFza1dpZHRoOiBudW1iZXIsXG4gIHhPclJlY3Q6IG51bWJlciB8IFJlY3QsXG4gIHk/OiBudW1iZXIsXG4gIHc/OiBudW1iZXIsXG4gIGg/OiBudW1iZXIsXG4pOiBVaW50OEFycmF5IHtcbiAgbGV0IGZpbmFsWDogbnVtYmVyXG4gIGxldCBmaW5hbFk6IG51bWJlclxuICBsZXQgZmluYWxXOiBudW1iZXJcbiAgbGV0IGZpbmFsSDogbnVtYmVyXG5cbiAgaWYgKHR5cGVvZiB4T3JSZWN0ID09PSAnb2JqZWN0Jykge1xuICAgIGZpbmFsWCA9IHhPclJlY3QueFxuICAgIGZpbmFsWSA9IHhPclJlY3QueVxuICAgIGZpbmFsVyA9IHhPclJlY3Qud1xuICAgIGZpbmFsSCA9IHhPclJlY3QuaFxuICB9IGVsc2Uge1xuICAgIGZpbmFsWCA9IHhPclJlY3RcbiAgICBmaW5hbFkgPSB5IVxuICAgIGZpbmFsVyA9IHchXG4gICAgZmluYWxIID0gaCFcbiAgfVxuXG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OEFycmF5KGZpbmFsVyAqIGZpbmFsSClcbiAgY29uc3Qgc3JjSCA9IG1hc2tCdWZmZXIubGVuZ3RoIC8gbWFza1dpZHRoXG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZmluYWxIOyByb3crKykge1xuICAgIGNvbnN0IGN1cnJlbnRTcmNZID0gZmluYWxZICsgcm93XG5cbiAgICBpZiAoY3VycmVudFNyY1kgPCAwIHx8IGN1cnJlbnRTcmNZID49IHNyY0gpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBmaW5hbFgpXG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4obWFza1dpZHRoLCBmaW5hbFggKyBmaW5hbFcpXG5cbiAgICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICAgIGNvbnN0IHNyY09mZnNldCA9IGN1cnJlbnRTcmNZICogbWFza1dpZHRoICsgc3RhcnRcbiAgICAgIGNvbnN0IGRzdE9mZnNldCA9IChyb3cgKiBmaW5hbFcpICsgKHN0YXJ0IC0gZmluYWxYKVxuICAgICAgY29uc3QgY291bnQgPSBlbmQgLSBzdGFydFxuXG4gICAgICBvdXQuc2V0KFxuICAgICAgICBtYXNrQnVmZmVyLnN1YmFycmF5KHNyY09mZnNldCwgc3JjT2Zmc2V0ICsgY291bnQpLFxuICAgICAgICBkc3RPZmZzZXQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { NullableMaskRect } from '../_types';\nimport { extractMaskBuffer } from '../Mask/extractMaskBuffer';\n\n/**\n * Intersects a target rectangle with a boundary, trimming dimensions and masks in-place.\n * This utility calculates the axis-aligned intersection between the `target` and `bounds`.\n * If the `target` includes a `mask` (as in a {@link NullableMaskRect}), the mask is physically\n * cropped and re-aligned using `extractMaskBuffer` to match the new dimensions.\n * @param target - The rectangle or selection object to be trimmed. **Note:** This object is mutated in-place.\n * @param bounds - The boundary rectangle defining the maximum allowable area (e.g., canvas dimensions).\n * @example\n * const selection = { x: -10, y: -10, w: 50, h: 50, mask: new Uint8Array(2500) };\n * const canvas = { x: 0, y: 0, w: 100, h: 100 };\n * // Selection will be moved to (0,0) and resized to 40x40.\n * // The mask is cropped by 10 px on the top and left.\n * trimRectBounds(selection, canvas);\n */\nexport function trimRectBounds<T extends NullableMaskRect>(target: T, bounds: Rect): void {\n const originalX = target.x;\n const originalY = target.y;\n const originalW = target.w;\n const intersectedX = Math.max(target.x, bounds.x);\n const intersectedY = Math.max(target.y, bounds.y);\n const intersectedMaxX = Math.min(target.x + target.w, bounds.x + bounds.w);\n const intersectedMaxY = Math.min(target.y + target.h, bounds.y + bounds.h);\n\n // Intersection check\n if (intersectedMaxX <= intersectedX || intersectedMaxY <= intersectedY) {\n target.w = 0;\n target.h = 0;\n if ('data' in target && target.data) {\n target.data = new Uint8Array(0);\n }\n return;\n }\n const intersectedW = intersectedMaxX - intersectedX;\n const intersectedH = intersectedMaxY - intersectedY;\n const offsetX = intersectedX - originalX;\n const offsetY = intersectedY - originalY;\n target.x = intersectedX;\n target.y = intersectedY;\n target.w = intersectedW;\n target.h = intersectedH;\n if ('data' in target && target.data) {\n const currentMaskBuffer = extractMaskBuffer(target.data, originalW, offsetX, offsetY, intersectedW, intersectedH);\n let minX = intersectedW;\n let maxX = -1;\n let minY = intersectedH;\n let maxY = -1;\n\n // Scan for content\n for (let y = 0; y < intersectedH; y++) {\n for (let x = 0; x < intersectedW; x++) {\n if (currentMaskBuffer[y * intersectedW + x] !== 0) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n\n // If no content is found (all zeros)\n if (maxX === -1) {\n target.w = 0;\n target.h = 0;\n target.data = new Uint8Array(0);\n return;\n }\n const finalW = maxX - minX + 1;\n const finalH = maxY - minY + 1;\n\n // Only shift and crop if the content is smaller than the intersection\n if (finalW !== intersectedW || finalH !== intersectedH) {\n const newMaskBuffer = extractMaskBuffer(currentMaskBuffer, intersectedW, minX, minY, finalW, finalH);\n target.x += minX;\n target.y += minY;\n target.w = finalW;\n target.h = finalH;\n target.data = newMaskBuffer;\n } else {\n target.w = finalW;\n target.h = finalH;\n target.data = currentMaskBuffer;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZU1hc2tSZWN0LCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hc2tCdWZmZXIgfSBmcm9tICcuLi9NYXNrL2V4dHJhY3RNYXNrQnVmZmVyJ1xuXG4vKipcbiAqIEludGVyc2VjdHMgYSB0YXJnZXQgcmVjdGFuZ2xlIHdpdGggYSBib3VuZGFyeSwgdHJpbW1pbmcgZGltZW5zaW9ucyBhbmQgbWFza3MgaW4tcGxhY2UuXG4gKiBUaGlzIHV0aWxpdHkgY2FsY3VsYXRlcyB0aGUgYXhpcy1hbGlnbmVkIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSBgdGFyZ2V0YCBhbmQgYGJvdW5kc2AuXG4gKiBJZiB0aGUgYHRhcmdldGAgaW5jbHVkZXMgYSBgbWFza2AgKGFzIGluIGEge0BsaW5rIE51bGxhYmxlTWFza1JlY3R9KSwgdGhlIG1hc2sgaXMgcGh5c2ljYWxseVxuICogY3JvcHBlZCBhbmQgcmUtYWxpZ25lZCB1c2luZyBgZXh0cmFjdE1hc2tCdWZmZXJgIHRvIG1hdGNoIHRoZSBuZXcgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgcmVjdGFuZ2xlIG9yIHNlbGVjdGlvbiBvYmplY3QgdG8gYmUgdHJpbW1lZC4gKipOb3RlOioqIFRoaXMgb2JqZWN0IGlzIG11dGF0ZWQgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYm91bmRzIC0gVGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBkZWZpbmluZyB0aGUgbWF4aW11bSBhbGxvd2FibGUgYXJlYSAoZS5nLiwgY2FudmFzIGRpbWVuc2lvbnMpLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlbGVjdGlvbiA9IHsgeDogLTEwLCB5OiAtMTAsIHc6IDUwLCBoOiA1MCwgbWFzazogbmV3IFVpbnQ4QXJyYXkoMjUwMCkgfTtcbiAqIGNvbnN0IGNhbnZhcyA9IHsgeDogMCwgeTogMCwgdzogMTAwLCBoOiAxMDAgfTtcbiAqIC8vIFNlbGVjdGlvbiB3aWxsIGJlIG1vdmVkIHRvICgwLDApIGFuZCByZXNpemVkIHRvIDQweDQwLlxuICogLy8gVGhlIG1hc2sgaXMgY3JvcHBlZCBieSAxMCBweCBvbiB0aGUgdG9wIGFuZCBsZWZ0LlxuICogdHJpbVJlY3RCb3VuZHMoc2VsZWN0aW9uLCBjYW52YXMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVJlY3RCb3VuZHM8VCBleHRlbmRzIE51bGxhYmxlTWFza1JlY3Q+KFxuICB0YXJnZXQ6IFQsXG4gIGJvdW5kczogUmVjdCxcbik6IHZvaWQge1xuICBjb25zdCBvcmlnaW5hbFggPSB0YXJnZXQueFxuICBjb25zdCBvcmlnaW5hbFkgPSB0YXJnZXQueVxuICBjb25zdCBvcmlnaW5hbFcgPSB0YXJnZXQud1xuXG4gIGNvbnN0IGludGVyc2VjdGVkWCA9IE1hdGgubWF4KHRhcmdldC54LCBib3VuZHMueClcbiAgY29uc3QgaW50ZXJzZWN0ZWRZID0gTWF0aC5tYXgodGFyZ2V0LnksIGJvdW5kcy55KVxuXG4gIGNvbnN0IGludGVyc2VjdGVkTWF4WCA9IE1hdGgubWluKFxuICAgIHRhcmdldC54ICsgdGFyZ2V0LncsXG4gICAgYm91bmRzLnggKyBib3VuZHMudyxcbiAgKVxuICBjb25zdCBpbnRlcnNlY3RlZE1heFkgPSBNYXRoLm1pbihcbiAgICB0YXJnZXQueSArIHRhcmdldC5oLFxuICAgIGJvdW5kcy55ICsgYm91bmRzLmgsXG4gIClcblxuICAvLyBJbnRlcnNlY3Rpb24gY2hlY2tcbiAgaWYgKGludGVyc2VjdGVkTWF4WCA8PSBpbnRlcnNlY3RlZFggfHwgaW50ZXJzZWN0ZWRNYXhZIDw9IGludGVyc2VjdGVkWSkge1xuICAgIHRhcmdldC53ID0gMFxuICAgIHRhcmdldC5oID0gMFxuXG4gICAgaWYgKCdkYXRhJyBpbiB0YXJnZXQgJiYgdGFyZ2V0LmRhdGEpIHtcbiAgICAgIHRhcmdldC5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoMClcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGludGVyc2VjdGVkVyA9IGludGVyc2VjdGVkTWF4WCAtIGludGVyc2VjdGVkWFxuICBjb25zdCBpbnRlcnNlY3RlZEggPSBpbnRlcnNlY3RlZE1heFkgLSBpbnRlcnNlY3RlZFlcbiAgY29uc3Qgb2Zmc2V0WCA9IGludGVyc2VjdGVkWCAtIG9yaWdpbmFsWFxuICBjb25zdCBvZmZzZXRZID0gaW50ZXJzZWN0ZWRZIC0gb3JpZ2luYWxZXG5cbiAgdGFyZ2V0LnggPSBpbnRlcnNlY3RlZFhcbiAgdGFyZ2V0LnkgPSBpbnRlcnNlY3RlZFlcbiAgdGFyZ2V0LncgPSBpbnRlcnNlY3RlZFdcbiAgdGFyZ2V0LmggPSBpbnRlcnNlY3RlZEhcblxuICBpZiAoJ2RhdGEnIGluIHRhcmdldCAmJiB0YXJnZXQuZGF0YSkge1xuICAgIGNvbnN0IGN1cnJlbnRNYXNrQnVmZmVyID0gZXh0cmFjdE1hc2tCdWZmZXIoXG4gICAgICB0YXJnZXQuZGF0YSxcbiAgICAgIG9yaWdpbmFsVyxcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZLFxuICAgICAgaW50ZXJzZWN0ZWRXLFxuICAgICAgaW50ZXJzZWN0ZWRILFxuICAgIClcblxuICAgIGxldCBtaW5YID0gaW50ZXJzZWN0ZWRXXG4gICAgbGV0IG1heFggPSAtMVxuICAgIGxldCBtaW5ZID0gaW50ZXJzZWN0ZWRIXG4gICAgbGV0IG1heFkgPSAtMVxuXG4gICAgLy8gU2NhbiBmb3IgY29udGVudFxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaW50ZXJzZWN0ZWRIOyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgaW50ZXJzZWN0ZWRXOyB4KyspIHtcbiAgICAgICAgaWYgKGN1cnJlbnRNYXNrQnVmZmVyW3kgKiBpbnRlcnNlY3RlZFcgKyB4XSAhPT0gMCkge1xuICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHhcbiAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4XG4gICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geVxuICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5vIGNvbnRlbnQgaXMgZm91bmQgKGFsbCB6ZXJvcylcbiAgICBpZiAobWF4WCA9PT0gLTEpIHtcbiAgICAgIHRhcmdldC53ID0gMFxuICAgICAgdGFyZ2V0LmggPSAwXG4gICAgICB0YXJnZXQuZGF0YSA9IG5ldyBVaW50OEFycmF5KDApXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsVyA9IG1heFggLSBtaW5YICsgMVxuICAgIGNvbnN0IGZpbmFsSCA9IG1heFkgLSBtaW5ZICsgMVxuXG4gICAgLy8gT25seSBzaGlmdCBhbmQgY3JvcCBpZiB0aGUgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIGludGVyc2VjdGlvblxuICAgIGlmIChmaW5hbFcgIT09IGludGVyc2VjdGVkVyB8fCBmaW5hbEggIT09IGludGVyc2VjdGVkSCkge1xuICAgICAgY29uc3QgbmV3TWFza0J1ZmZlciA9IGV4dHJhY3RNYXNrQnVmZmVyKFxuICAgICAgICBjdXJyZW50TWFza0J1ZmZlcixcbiAgICAgICAgaW50ZXJzZWN0ZWRXLFxuICAgICAgICBtaW5YLFxuICAgICAgICBtaW5ZLFxuICAgICAgICBmaW5hbFcsXG4gICAgICAgIGZpbmFsSCxcbiAgICAgIClcblxuICAgICAgdGFyZ2V0LnggKz0gbWluWFxuICAgICAgdGFyZ2V0LnkgKz0gbWluWVxuICAgICAgdGFyZ2V0LncgPSBmaW5hbFdcbiAgICAgIHRhcmdldC5oID0gZmluYWxIXG4gICAgICB0YXJnZXQuZGF0YSA9IG5ld01hc2tCdWZmZXJcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LncgPSBmaW5hbFdcbiAgICAgIHRhcmdldC5oID0gZmluYWxIXG4gICAgICB0YXJnZXQuZGF0YSA9IGN1cnJlbnRNYXNrQnVmZmVyXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32, MaskType } from '../_types';\nimport { colorDistance } from '../color';\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nexport type FloodFillImageDataOptions = {\n contiguous?: boolean;\n tolerance?: number;\n bounds?: Rect;\n};\nexport type FloodFillResult = {\n startX: number;\n startY: number;\n selectionRect: BinaryMaskRect;\n pixels: Uint8ClampedArray;\n};\n\n/**\n * Performs a color-based flood fill selection on {@link ImageData} or {@link PixelData}.\n * This utility identifies pixels starting from a specific coordinate that fall within a\n * color tolerance. It can operate in \"contiguous\" mode (classic bucket fill) or\n * \"non-contiguous\" mode (selects all matching pixels in the buffer).\n *\n * @param img - The source image data to process.\n * @param startX - The starting horizontal coordinate.\n * @param startY - The starting vertical coordinate.\n * @param options - Configuration for the fill operation.\n * @param options.contiguous - If true, only connected pixels are\n * selected. If false, all pixels within tolerance are selected regardless of position.\n * @param options.tolerance - The maximum allowed difference in color\n * distance (0-255) for a pixel to be included.\n * @param options.bounds - Optional bounding box to restrict the search area.\n *\n * @returns A {@link FloodFillResult} containing the mask and bounds of the selection,\n * or `null` if the starting coordinates are out of bounds.\n *\n * @example\n * ```typescript\n * const result = floodFillImageDataSelection(\n * ctx.getImageData(0, 0, 100, 100),\n * 50,\n * 50,\n * {\n * tolerance: 20,\n * contiguous: true\n * }\n * );\n * ```\n */\nexport function floodFillSelection(img: ImageDataLike | PixelData, startX: number, startY: number, {\n contiguous = true,\n tolerance = 0,\n bounds\n}: FloodFillImageDataOptions = {}): FloodFillResult | null {\n let imageData: ImageDataLike;\n let data32: Uint32Array;\n if ('data32' in img) {\n data32 = img.data32;\n imageData = img.imageData;\n } else {\n data32 = new Uint32Array(img.data.buffer, img.data.byteOffset, img.data.byteLength >> 2);\n imageData = img;\n }\n const {\n width,\n height\n } = img;\n const limit = bounds || {\n x: 0,\n y: 0,\n w: width,\n h: height\n };\n const xMin = Math.max(0, limit.x);\n const xMax = Math.min(width - 1, limit.x + limit.w - 1);\n const yMin = Math.max(0, limit.y);\n const yMax = Math.min(height - 1, limit.y + limit.h - 1);\n if (startX < xMin || startX > xMax || startY < yMin || startY > yMax) {\n return null;\n }\n const baseColor = data32[startY * width + startX] as Color32;\n let matchCount = 0;\n const matchX = new Uint16Array(width * height);\n const matchY = new Uint16Array(width * height);\n let minX = startX;\n let maxX = startX;\n let minY = startY;\n let maxY = startY;\n if (contiguous) {\n const visited = new Uint8Array(width * height);\n const stack = new Uint32Array(width * height);\n let stackPtr = 0;\n stack[stackPtr++] = startY << 16 | startX;\n visited[startY * width + startX] = 1;\n while (stackPtr > 0) {\n const val = stack[--stackPtr];\n const x = val & 0xFFFF;\n const y = val >>> 16;\n matchX[matchCount] = x;\n matchY[matchCount] = y;\n matchCount++;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n\n // Right\n if (x + 1 <= xMax) {\n const idx = y * width + (x + 1);\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y << 16 | x + 1;\n }\n }\n // Left\n if (x - 1 >= xMin) {\n const idx = y * width + (x - 1);\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y << 16 | x - 1;\n }\n }\n // Down\n if (y + 1 <= yMax) {\n const idx = (y + 1) * width + x;\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y + 1 << 16 | x;\n }\n }\n // Up\n if (y - 1 >= yMin) {\n const idx = (y - 1) * width + x;\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y - 1 << 16 | x;\n }\n }\n }\n } else {\n for (let y = yMin; y <= yMax; y++) {\n for (let x = xMin; x <= xMax; x++) {\n const color = data32[y * width + x] as Color32;\n if (colorDistance(color, baseColor) <= tolerance) {\n matchX[matchCount] = x;\n matchY[matchCount] = y;\n matchCount++;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n }\n if (matchCount === 0) {\n return null;\n }\n const w = maxX - minX + 1;\n const h = maxY - minY + 1;\n const selectionRect: BinaryMaskRect = {\n x: minX,\n y: minY,\n w,\n h,\n data: new Uint8Array(w * h),\n type: MaskType.BINARY\n };\n const sw = selectionRect.w;\n const sh = selectionRect.h;\n const finalMask = selectionRect.data;\n for (let i = 0; i < matchCount; i++) {\n const mx = matchX[i] - selectionRect.x;\n const my = matchY[i] - selectionRect.y;\n if (mx >= 0 && mx < sw && my >= 0 && my < sh) {\n finalMask[my * sw + mx] = 1;\n }\n }\n trimRectBounds(selectionRect, {\n x: 0,\n y: 0,\n w: width,\n h: height\n });\n const extracted = extractImageDataBuffer(imageData, selectionRect.x, selectionRect.y, selectionRect.w, selectionRect.h);\n return {\n startX,\n startY,\n selectionRect,\n pixels: extracted\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBCaW5hcnlNYXNrUmVjdCwgdHlwZSBDb2xvcjMyLCB0eXBlIEltYWdlRGF0YUxpa2UsIE1hc2tUeXBlLCB0eXBlIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBjb2xvckRpc3RhbmNlIH0gZnJvbSAnLi4vY29sb3InXG5pbXBvcnQgeyBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2V4dHJhY3RJbWFnZURhdGFCdWZmZXInXG5pbXBvcnQgdHlwZSB7IFBpeGVsRGF0YSB9IGZyb20gJy4uL1BpeGVsRGF0YS9QaXhlbERhdGEnXG5pbXBvcnQgeyB0cmltUmVjdEJvdW5kcyB9IGZyb20gJy4uL1JlY3QvdHJpbVJlY3RCb3VuZHMnXG5cbmV4cG9ydCB0eXBlIEZsb29kRmlsbEltYWdlRGF0YU9wdGlvbnMgPSB7XG4gIGNvbnRpZ3VvdXM/OiBib29sZWFuXG4gIHRvbGVyYW5jZT86IG51bWJlclxuICBib3VuZHM/OiBSZWN0XG59XG5cbmV4cG9ydCB0eXBlIEZsb29kRmlsbFJlc3VsdCA9IHtcbiAgc3RhcnRYOiBudW1iZXJcbiAgc3RhcnRZOiBudW1iZXJcbiAgc2VsZWN0aW9uUmVjdDogQmluYXJ5TWFza1JlY3RcbiAgcGl4ZWxzOiBVaW50OENsYW1wZWRBcnJheVxufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgY29sb3ItYmFzZWQgZmxvb2QgZmlsbCBzZWxlY3Rpb24gb24ge0BsaW5rIEltYWdlRGF0YX0gb3Ige0BsaW5rIFBpeGVsRGF0YX0uXG4gKiBUaGlzIHV0aWxpdHkgaWRlbnRpZmllcyBwaXhlbHMgc3RhcnRpbmcgZnJvbSBhIHNwZWNpZmljIGNvb3JkaW5hdGUgdGhhdCBmYWxsIHdpdGhpbiBhXG4gKiBjb2xvciB0b2xlcmFuY2UuIEl0IGNhbiBvcGVyYXRlIGluIFwiY29udGlndW91c1wiIG1vZGUgKGNsYXNzaWMgYnVja2V0IGZpbGwpIG9yXG4gKiBcIm5vbi1jb250aWd1b3VzXCIgbW9kZSAoc2VsZWN0cyBhbGwgbWF0Y2hpbmcgcGl4ZWxzIGluIHRoZSBidWZmZXIpLlxuICpcbiAqIEBwYXJhbSBpbWcgLSBUaGUgc291cmNlIGltYWdlIGRhdGEgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSBzdGFydFggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHN0YXJ0WSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIGZvciB0aGUgZmlsbCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb3B0aW9ucy5jb250aWd1b3VzIC0gSWYgdHJ1ZSwgb25seSBjb25uZWN0ZWQgcGl4ZWxzIGFyZVxuICogc2VsZWN0ZWQuIElmIGZhbHNlLCBhbGwgcGl4ZWxzIHdpdGhpbiB0b2xlcmFuY2UgYXJlIHNlbGVjdGVkIHJlZ2FyZGxlc3Mgb2YgcG9zaXRpb24uXG4gKiBAcGFyYW0gb3B0aW9ucy50b2xlcmFuY2UgLSBUaGUgbWF4aW11bSBhbGxvd2VkIGRpZmZlcmVuY2UgaW4gY29sb3JcbiAqIGRpc3RhbmNlICgwLTI1NSkgZm9yIGEgcGl4ZWwgdG8gYmUgaW5jbHVkZWQuXG4gKiBAcGFyYW0gb3B0aW9ucy5ib3VuZHMgLSBPcHRpb25hbCBib3VuZGluZyBib3ggdG8gcmVzdHJpY3QgdGhlIHNlYXJjaCBhcmVhLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIEZsb29kRmlsbFJlc3VsdH0gY29udGFpbmluZyB0aGUgbWFzayBhbmQgYm91bmRzIG9mIHRoZSBzZWxlY3Rpb24sXG4gKiBvciBgbnVsbGAgaWYgdGhlIHN0YXJ0aW5nIGNvb3JkaW5hdGVzIGFyZSBvdXQgb2YgYm91bmRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBmbG9vZEZpbGxJbWFnZURhdGFTZWxlY3Rpb24oXG4gKiBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEwMCwgMTAwKSxcbiAqIDUwLFxuICogNTAsXG4gKiB7XG4gKiB0b2xlcmFuY2U6IDIwLFxuICogY29udGlndW91czogdHJ1ZVxuICogfVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxvb2RGaWxsU2VsZWN0aW9uKFxuICBpbWc6IEltYWdlRGF0YUxpa2UgfCBQaXhlbERhdGEsXG4gIHN0YXJ0WDogbnVtYmVyLFxuICBzdGFydFk6IG51bWJlcixcbiAge1xuICAgIGNvbnRpZ3VvdXMgPSB0cnVlLFxuICAgIHRvbGVyYW5jZSA9IDAsXG4gICAgYm91bmRzLFxuICB9OiBGbG9vZEZpbGxJbWFnZURhdGFPcHRpb25zID0ge30sXG4pOiBGbG9vZEZpbGxSZXN1bHQgfCBudWxsIHtcblxuICBsZXQgaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlXG4gIGxldCBkYXRhMzI6IFVpbnQzMkFycmF5XG4gIGlmICgnZGF0YTMyJyBpbiBpbWcpIHtcbiAgICBkYXRhMzIgPSBpbWcuZGF0YTMyXG4gICAgaW1hZ2VEYXRhID0gaW1nLmltYWdlRGF0YVxuICB9IGVsc2Uge1xuICAgIGRhdGEzMiA9IG5ldyBVaW50MzJBcnJheShcbiAgICAgIGltZy5kYXRhLmJ1ZmZlcixcbiAgICAgIGltZy5kYXRhLmJ5dGVPZmZzZXQsXG4gICAgICBpbWcuZGF0YS5ieXRlTGVuZ3RoID4+IDIsXG4gICAgKVxuICAgIGltYWdlRGF0YSA9IGltZ1xuICB9XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH0gPSBpbWdcblxuICBjb25zdCBsaW1pdCA9IGJvdW5kcyB8fCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IHdpZHRoLFxuICAgIGg6IGhlaWdodCxcbiAgfVxuXG4gIGNvbnN0IHhNaW4gPSBNYXRoLm1heCgwLCBsaW1pdC54KVxuICBjb25zdCB4TWF4ID0gTWF0aC5taW4od2lkdGggLSAxLCBsaW1pdC54ICsgbGltaXQudyAtIDEpXG4gIGNvbnN0IHlNaW4gPSBNYXRoLm1heCgwLCBsaW1pdC55KVxuICBjb25zdCB5TWF4ID0gTWF0aC5taW4oaGVpZ2h0IC0gMSwgbGltaXQueSArIGxpbWl0LmggLSAxKVxuXG4gIGlmIChzdGFydFggPCB4TWluIHx8IHN0YXJ0WCA+IHhNYXggfHwgc3RhcnRZIDwgeU1pbiB8fCBzdGFydFkgPiB5TWF4KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGJhc2VDb2xvciA9IGRhdGEzMltzdGFydFkgKiB3aWR0aCArIHN0YXJ0WF0gYXMgQ29sb3IzMlxuXG4gIGxldCBtYXRjaENvdW50ID0gMFxuICBjb25zdCBtYXRjaFggPSBuZXcgVWludDE2QXJyYXkod2lkdGggKiBoZWlnaHQpXG4gIGNvbnN0IG1hdGNoWSA9IG5ldyBVaW50MTZBcnJheSh3aWR0aCAqIGhlaWdodClcblxuICBsZXQgbWluWCA9IHN0YXJ0WFxuICBsZXQgbWF4WCA9IHN0YXJ0WFxuICBsZXQgbWluWSA9IHN0YXJ0WVxuICBsZXQgbWF4WSA9IHN0YXJ0WVxuXG4gIGlmIChjb250aWd1b3VzKSB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0KVxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KVxuICAgIGxldCBzdGFja1B0ciA9IDBcblxuICAgIHN0YWNrW3N0YWNrUHRyKytdID0gKHN0YXJ0WSA8PCAxNikgfCBzdGFydFhcbiAgICB2aXNpdGVkW3N0YXJ0WSAqIHdpZHRoICsgc3RhcnRYXSA9IDFcblxuICAgIHdoaWxlIChzdGFja1B0ciA+IDApIHtcbiAgICAgIGNvbnN0IHZhbCA9IHN0YWNrWy0tc3RhY2tQdHJdXG4gICAgICBjb25zdCB4ID0gdmFsICYgMHhGRkZGXG4gICAgICBjb25zdCB5ID0gdmFsID4+PiAxNlxuXG4gICAgICBtYXRjaFhbbWF0Y2hDb3VudF0gPSB4XG4gICAgICBtYXRjaFlbbWF0Y2hDb3VudF0gPSB5XG4gICAgICBtYXRjaENvdW50KytcblxuICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geFxuICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geFxuICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geVxuICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geVxuXG4gICAgICAvLyBSaWdodFxuICAgICAgaWYgKHggKyAxIDw9IHhNYXgpIHtcbiAgICAgICAgY29uc3QgaWR4ID0geSAqIHdpZHRoICsgKHggKyAxKVxuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMVxuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0gKHkgPDwgMTYpIHwgKHggKyAxKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBMZWZ0XG4gICAgICBpZiAoeCAtIDEgPj0geE1pbikge1xuICAgICAgICBjb25zdCBpZHggPSB5ICogd2lkdGggKyAoeCAtIDEpXG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxXG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoeSA8PCAxNikgfCAoeCAtIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERvd25cbiAgICAgIGlmICh5ICsgMSA8PSB5TWF4KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9ICh5ICsgMSkgKiB3aWR0aCArIHhcbiAgICAgICAgaWYgKCF2aXNpdGVkW2lkeF0gJiYgY29sb3JEaXN0YW5jZShkYXRhMzJbaWR4XSBhcyBDb2xvcjMyLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHZpc2l0ZWRbaWR4XSA9IDFcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9ICgoeSArIDEpIDw8IDE2KSB8IHhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVXBcbiAgICAgIGlmICh5IC0gMSA+PSB5TWluKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9ICh5IC0gMSkgKiB3aWR0aCArIHhcbiAgICAgICAgaWYgKCF2aXNpdGVkW2lkeF0gJiYgY29sb3JEaXN0YW5jZShkYXRhMzJbaWR4XSBhcyBDb2xvcjMyLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHZpc2l0ZWRbaWR4XSA9IDFcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9ICgoeSAtIDEpIDw8IDE2KSB8IHhcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8PSB5TWF4OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHgrKykge1xuICAgICAgICBjb25zdCBjb2xvciA9IGRhdGEzMlt5ICogd2lkdGggKyB4XSBhcyBDb2xvcjMyXG4gICAgICAgIGlmIChjb2xvckRpc3RhbmNlKGNvbG9yLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIG1hdGNoWFttYXRjaENvdW50XSA9IHhcbiAgICAgICAgICBtYXRjaFlbbWF0Y2hDb3VudF0gPSB5XG4gICAgICAgICAgbWF0Y2hDb3VudCsrXG5cbiAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4XG4gICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geFxuICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHlcbiAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgdyA9IG1heFggLSBtaW5YICsgMVxuICBjb25zdCBoID0gbWF4WSAtIG1pblkgKyAxXG4gIGNvbnN0IHNlbGVjdGlvblJlY3Q6IEJpbmFyeU1hc2tSZWN0ID0ge1xuICAgIHg6IG1pblgsXG4gICAgeTogbWluWSxcbiAgICB3LFxuICAgIGgsXG4gICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkodyAqIGgpLFxuICAgIHR5cGU6IE1hc2tUeXBlLkJJTkFSWSxcbiAgfVxuXG4gIGNvbnN0IHN3ID0gc2VsZWN0aW9uUmVjdC53XG4gIGNvbnN0IHNoID0gc2VsZWN0aW9uUmVjdC5oXG4gIGNvbnN0IGZpbmFsTWFzayA9IHNlbGVjdGlvblJlY3QuZGF0YVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hDb3VudDsgaSsrKSB7XG4gICAgY29uc3QgbXggPSBtYXRjaFhbaV0gLSBzZWxlY3Rpb25SZWN0LnhcbiAgICBjb25zdCBteSA9IG1hdGNoWVtpXSAtIHNlbGVjdGlvblJlY3QueVxuXG4gICAgaWYgKG14ID49IDAgJiYgbXggPCBzdyAmJiBteSA+PSAwICYmIG15IDwgc2gpIHtcbiAgICAgIGZpbmFsTWFza1tteSAqIHN3ICsgbXhdID0gMVxuICAgIH1cbiAgfVxuXG4gIHRyaW1SZWN0Qm91bmRzKFxuICAgIHNlbGVjdGlvblJlY3QsXG4gICAgeyB4OiAwLCB5OiAwLCB3OiB3aWR0aCwgaDogaGVpZ2h0IH0sXG4gIClcblxuICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKFxuICAgIGltYWdlRGF0YSxcbiAgICBzZWxlY3Rpb25SZWN0LngsXG4gICAgc2VsZWN0aW9uUmVjdC55LFxuICAgIHNlbGVjdGlvblJlY3QudyxcbiAgICBzZWxlY3Rpb25SZWN0LmgsXG4gIClcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0WCxcbiAgICBzdGFydFksXG4gICAgc2VsZWN0aW9uUmVjdCxcbiAgICBwaXhlbHM6IGV4dHJhY3RlZCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export const BaseBlendMode = {\n overwrite: 0,\n sourceOver: 1,\n darken: 2,\n multiply: 3,\n colorBurn: 4,\n linearBurn: 5,\n darkerColor: 6,\n lighten: 7,\n screen: 8,\n colorDodge: 9,\n linearDodge: 10,\n lighterColor: 11,\n overlay: 12,\n softLight: 13,\n hardLight: 14,\n vividLight: 15,\n linearLight: 16,\n pinLight: 17,\n hardMix: 18,\n difference: 19,\n exclusion: 20,\n subtract: 21,\n divide: 22\n} as const;\nexport interface RequiredBlendModes {\n overwrite: 0;\n}\nexport type BaseBlendModes = RequiredBlendModes & Record<string, number>;\nexport const overwriteBase: BlendColor32 = (src, _dst) => src;\noverwriteBase.isOverwrite = true;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBjb25zdCBCYXNlQmxlbmRNb2RlID0ge1xuICBvdmVyd3JpdGU6IDAsXG4gIHNvdXJjZU92ZXI6IDEsXG4gIGRhcmtlbjogMixcbiAgbXVsdGlwbHk6IDMsXG4gIGNvbG9yQnVybjogNCxcbiAgbGluZWFyQnVybjogNSxcbiAgZGFya2VyQ29sb3I6IDYsXG4gIGxpZ2h0ZW46IDcsXG4gIHNjcmVlbjogOCxcbiAgY29sb3JEb2RnZTogOSxcbiAgbGluZWFyRG9kZ2U6IDEwLFxuICBsaWdodGVyQ29sb3I6IDExLFxuICBvdmVybGF5OiAxMixcbiAgc29mdExpZ2h0OiAxMyxcbiAgaGFyZExpZ2h0OiAxNCxcbiAgdml2aWRMaWdodDogMTUsXG4gIGxpbmVhckxpZ2h0OiAxNixcbiAgcGluTGlnaHQ6IDE3LFxuICBoYXJkTWl4OiAxOCxcbiAgZGlmZmVyZW5jZTogMTksXG4gIGV4Y2x1c2lvbjogMjAsXG4gIHN1YnRyYWN0OiAyMSxcbiAgZGl2aWRlOiAyMixcbn0gYXMgY29uc3RcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlZEJsZW5kTW9kZXMge1xuICBvdmVyd3JpdGU6IDA7XG59XG5cbmV4cG9ydCB0eXBlIEJhc2VCbGVuZE1vZGVzID0gUmVxdWlyZWRCbGVuZE1vZGVzICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuXG5leHBvcnQgY29uc3Qgb3ZlcndyaXRlQmFzZTogQmxlbmRDb2xvcjMyID0gKHNyYywgX2RzdCkgPT4gc3JjXG5vdmVyd3JpdGVCYXNlLmlzT3ZlcndyaXRlID0gdHJ1ZVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { BlendColor32 } from '../_types';\nimport type { BaseBlendModes } from './blend-modes';\nexport type BlendModeRegistry<BlendModes extends BaseBlendModes = BaseBlendModes, Name extends keyof BlendModes = keyof BlendModes, Index extends BlendModes[Name] = BlendModes[Name]> = ReturnType<typeof makeBlendModeRegistry<BlendModes, Name, Index>>;\nexport function makeBlendModeRegistry<BlendModes extends BaseBlendModes, Name extends keyof BlendModes = keyof BlendModes, Index extends BlendModes[Name] = BlendModes[Name]>(blendModes: BlendModes, initialEntries: Record<Index, BlendColor32>, registryName = 'anonymous') {\n const blendToName = new Map<BlendColor32, Name>();\n const blendToIndex = new Map<BlendColor32, Index>();\n const indexToName: Name[] = [];\n const indexToBlend: BlendColor32[] = [];\n const nameToBlend = {} as { [K in keyof BlendModes]: BlendColor32 };\n const nameToIndex = {} as Record<Name, Index>;\n const add = (name: Name, index: Index, blendFn: BlendColor32) => {\n if (!Number.isFinite(index)) {\n throw new Error(`Index \"${index}\" is not a number. Attempting to add name: \"${name as string}\", index: \"${index}\"`);\n }\n if (indexToBlend[index]) {\n throw new Error(`Blend Mode index: ${index} is already used. Attempting to add name: \"${name as string}\", index: \"${index}\"`);\n }\n indexToName[index] = name;\n indexToBlend[index] = blendFn;\n blendToIndex.set(blendFn, index);\n blendToName.set(blendFn, name);\n nameToBlend[name] = blendFn;\n nameToIndex[name] = index;\n };\n for (const [name, index] of Object.entries(blendModes)) {\n const blend = initialEntries[index as Index];\n add(name as Name, index as Index, blend);\n }\n return {\n registryName,\n nameToBlend,\n nameToIndex,\n blendToIndex,\n blendToName,\n indexToBlend,\n indexToName,\n indexType: null as unknown as Index,\n nameType: null as unknown as Name\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEJhc2VCbGVuZE1vZGVzIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcblxuZXhwb3J0IHR5cGUgQmxlbmRNb2RlUmVnaXN0cnk8XG4gIEJsZW5kTW9kZXMgZXh0ZW5kcyBCYXNlQmxlbmRNb2RlcyA9IEJhc2VCbGVuZE1vZGVzLFxuICBOYW1lIGV4dGVuZHMga2V5b2YgQmxlbmRNb2RlcyA9IGtleW9mIEJsZW5kTW9kZXMsXG4gIEluZGV4IGV4dGVuZHMgQmxlbmRNb2Rlc1tOYW1lXSA9IEJsZW5kTW9kZXNbTmFtZV1cbj4gPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQmxlbmRNb2RlUmVnaXN0cnk8QmxlbmRNb2RlcywgTmFtZSwgSW5kZXg+PlxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5PFxuICBCbGVuZE1vZGVzIGV4dGVuZHMgQmFzZUJsZW5kTW9kZXMsXG4gIE5hbWUgZXh0ZW5kcyBrZXlvZiBCbGVuZE1vZGVzID0ga2V5b2YgQmxlbmRNb2RlcyxcbiAgSW5kZXggZXh0ZW5kcyBCbGVuZE1vZGVzW05hbWVdID0gQmxlbmRNb2Rlc1tOYW1lXVxuXG4+KFxuICBibGVuZE1vZGVzOiBCbGVuZE1vZGVzLFxuICBpbml0aWFsRW50cmllczogUmVjb3JkPEluZGV4LCBCbGVuZENvbG9yMzI+LFxuICByZWdpc3RyeU5hbWUgPSAnYW5vbnltb3VzJyxcbikge1xuXG4gIGNvbnN0IGJsZW5kVG9OYW1lID0gbmV3IE1hcDxCbGVuZENvbG9yMzIsIE5hbWU+KClcbiAgY29uc3QgYmxlbmRUb0luZGV4ID0gbmV3IE1hcDxCbGVuZENvbG9yMzIsIEluZGV4PigpXG4gIGNvbnN0IGluZGV4VG9OYW1lOiBOYW1lW10gPSBbXVxuICBjb25zdCBpbmRleFRvQmxlbmQ6IEJsZW5kQ29sb3IzMltdID0gW11cbiAgY29uc3QgbmFtZVRvQmxlbmQgPSB7fSBhcyB7IFtLIGluIGtleW9mIEJsZW5kTW9kZXNdOiBCbGVuZENvbG9yMzIgfVxuICBjb25zdCBuYW1lVG9JbmRleCA9IHt9IGFzIFJlY29yZDxOYW1lLCBJbmRleD5cblxuICBjb25zdCBhZGQgPSAobmFtZTogTmFtZSwgaW5kZXg6IEluZGV4LCBibGVuZEZuOiBCbGVuZENvbG9yMzIpID0+IHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kZXggXCIke2luZGV4fVwiIGlzIG5vdCBhIG51bWJlci4gQXR0ZW1wdGluZyB0byBhZGQgbmFtZTogXCIke25hbWUgYXMgc3RyaW5nfVwiLCBpbmRleDogXCIke2luZGV4fVwiYClcbiAgICB9XG5cbiAgICBpZiAoaW5kZXhUb0JsZW5kW2luZGV4XSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBCbGVuZCBNb2RlIGluZGV4OiAke2luZGV4fSBpcyBhbHJlYWR5IHVzZWQuIEF0dGVtcHRpbmcgdG8gYWRkIG5hbWU6IFwiJHtuYW1lIGFzIHN0cmluZ31cIiwgaW5kZXg6IFwiJHtpbmRleH1cImApXG4gICAgfVxuXG4gICAgaW5kZXhUb05hbWVbaW5kZXhdID0gbmFtZVxuICAgIGluZGV4VG9CbGVuZFtpbmRleF0gPSBibGVuZEZuXG4gICAgYmxlbmRUb0luZGV4LnNldChibGVuZEZuLCBpbmRleClcbiAgICBibGVuZFRvTmFtZS5zZXQoYmxlbmRGbiwgbmFtZSlcbiAgICBuYW1lVG9CbGVuZFtuYW1lXSA9IGJsZW5kRm5cbiAgICBuYW1lVG9JbmRleFtuYW1lXSA9IGluZGV4XG4gIH1cblxuICBmb3IgKGNvbnN0IFtuYW1lLCBpbmRleF0gb2YgT2JqZWN0LmVudHJpZXMoYmxlbmRNb2RlcykpIHtcbiAgICBjb25zdCBibGVuZCA9IGluaXRpYWxFbnRyaWVzW2luZGV4IGFzIEluZGV4XVxuICAgIGFkZChuYW1lIGFzIE5hbWUsIGluZGV4IGFzIEluZGV4LCBibGVuZClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVnaXN0cnlOYW1lLFxuICAgIG5hbWVUb0JsZW5kLFxuICAgIG5hbWVUb0luZGV4LFxuXG4gICAgYmxlbmRUb0luZGV4LFxuICAgIGJsZW5kVG9OYW1lLFxuXG4gICAgaW5kZXhUb0JsZW5kLFxuICAgIGluZGV4VG9OYW1lLFxuXG4gICAgaW5kZXhUeXBlOiBudWxsIGFzIHVua25vd24gYXMgSW5kZXgsXG4gICAgbmFtZVR5cGU6IG51bGwgYXMgdW5rbm93biBhcyBOYW1lLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwriteFast = overwriteBase;\nexport const sourceOverFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 255) return src;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = sr * sa + dr * invA >> 8;\n const g = sg * sa + dg * invA >> 8;\n const b = sb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = sr < dr ? sr : dr;\n const bg = sg < dg ? sg : dg;\n const bb = sb < db ? sb : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (src * dst) / 255 */\nexport const multiplyFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n\n // Consistent floor rounding for all channels\n const br = sr * dr >> 8;\n const bg = sg * dg >> 8;\n const bb = sb * db >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** 255 - (255-src)/dst */\nexport const colorBurnFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / sr | 0);\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / sg | 0);\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst - 255 */\nexport const linearBurnFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255;\n const bgU = dg + sg - 255;\n const bbU = db + sb - 255;\n const br = brU < 0 ? 0 : brU;\n const bg = bgU < 0 ? 0 : bgU;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkerFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb;\n if (lumSrc < lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(src, dst) */\nexport const lightenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const br = Math.max(src & 0xFF, dst & 0xFF);\n const bg = Math.max(src >> 8 & 0xFF, dst >> 8 & 0xFF);\n const bb = Math.max(src >> 16 & 0xFF, dst >> 16 & 0xFF);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const dr = dst & 0xFF;\n const dg = dst >> 8 & 0xFF;\n const db = dst >> 16 & 0xFF;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = 255 - ((255 - (src & 0xFF)) * (255 - dr) >> 8);\n const bg = 255 - ((255 - (src >>> 8 & 0xFF)) * (255 - dg) >> 8);\n const bb = 255 - ((255 - (src >>> 16 & 0xFF)) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgeFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 255 ? 255 : Math.min(255, (dr << 8) / (255 - sr) | 0);\n const bg = sg === 255 ? 255 : Math.min(255, (dg << 8) / (255 - sg) | 0);\n const bb = sb === 255 ? 255 : Math.min(255, (db << 8) / (255 - sb) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst */\nexport const linearDodgeFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brU = (src & 0xFF) + dr;\n const bgU = (src >>> 8 & 0xFF) + dg;\n const bbU = (src >>> 16 & 0xFF) + db;\n const br = brU > 255 ? 255 : brU;\n const bg = bgU > 255 ? 255 : bgU;\n const bb = bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const lighterFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // Selection Logic (Base result)\n let br, bg, bb;\n if (lumSrc > lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);\n const bg = dg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);\n const bb = db < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (255 - dr) * (sr * dr >> 8) + dr * (255 - ((255 - sr) * (255 - dr) >> 8)) >> 8;\n const bg = (255 - dg) * (sg * dg >> 8) + dg * (255 - ((255 - sg) * (255 - dg) >> 8)) >> 8;\n const bb = (255 - db) * (sb * db >> 8) + db * (255 - ((255 - sb) * (255 - db) >> 8)) >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);\n const bg = sg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);\n const bb = sb < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr) | 0) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)) | 0);\n const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg) | 0) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)) | 0);\n const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb) | 0) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr + 2 * sr - 255;\n const bgU = dg + 2 * sg - 255;\n const bbU = db + 2 * sb - 255;\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? dr < 2 * sr ? dr : 2 * sr : dr > 2 * sr - 256 ? dr : 2 * sr - 256;\n const bg = sg < 128 ? dg < 2 * sg ? dg : 2 * sg : dg > 2 * sg - 256 ? dg : 2 * sg - 256;\n const bb = sb < 128 ? db < 2 * sb ? db : 2 * sb : db > 2 * sb - 256 ? db : 2 * sb - 256;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr) | 0) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;\n const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg) | 0) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;\n const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb) | 0) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.abs(src - dst) */\nexport const differenceFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brD = (src & 0xFF) - dr;\n const bgD = (src >>> 8 & 0xFF) - dg;\n const bbD = (src >>> 16 & 0xFF) - db;\n const br = brD < 0 ? -brD : brD;\n const bg = bgD < 0 ? -bgD : bgD;\n const bb = bbD < 0 ? -bbD : bbD;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = dr + sr - (dr * sr >> 7);\n const bg = dg + sg - (dg * sg >> 7);\n const bb = db + sb - (db * sb >> 7);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(0, dst - src) */\nexport const subtractFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr - sr;\n const bgU = dg - sg;\n const bbU = db - sb;\n const br = brU < 0 ? 0 : brU;\n const bg = bgU < 0 ? 0 : bgU;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const divideFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 0 ? 255 : Math.min(255, (dr << 8) / sr | 0);\n const bg = sg === 0 ? 255 : Math.min(255, (dg << 8) / sg | 0);\n const bb = sb === 0 ? 255 : Math.min(255, (db << 8) / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const BASE_FAST_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwriteFast,\n [BaseBlendMode.sourceOver]: sourceOverFast,\n [BaseBlendMode.darken]: darkenFast,\n [BaseBlendMode.multiply]: multiplyFast,\n [BaseBlendMode.colorBurn]: colorBurnFast,\n [BaseBlendMode.linearBurn]: linearBurnFast,\n [BaseBlendMode.darkerColor]: darkerFast,\n [BaseBlendMode.lighten]: lightenFast,\n [BaseBlendMode.screen]: screenFast,\n [BaseBlendMode.colorDodge]: colorDodgeFast,\n [BaseBlendMode.linearDodge]: linearDodgeFast,\n [BaseBlendMode.lighterColor]: lighterFast,\n [BaseBlendMode.overlay]: overlayFast,\n [BaseBlendMode.softLight]: softLightFast,\n [BaseBlendMode.hardLight]: hardLightFast,\n [BaseBlendMode.vividLight]: vividLightFast,\n [BaseBlendMode.linearLight]: linearLightFast,\n [BaseBlendMode.pinLight]: pinLightFast,\n [BaseBlendMode.hardMix]: hardMixFast,\n [BaseBlendMode.difference]: differenceFast,\n [BaseBlendMode.exclusion]: exclusionFast,\n [BaseBlendMode.subtract]: subtractFast,\n [BaseBlendMode.divide]: divideFast\n};\nexport function makeFastBlendModeRegistry(name = 'fast') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_FAST_BLEND_MODE_FUNCTIONS, name);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBCYXNlQmxlbmRNb2RlLCBvdmVyd3JpdGVCYXNlIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcbmltcG9ydCB7IG1ha2VCbGVuZE1vZGVSZWdpc3RyeSB9IGZyb20gJy4vQmxlbmRNb2RlUmVnaXN0cnknXG5cbmV4cG9ydCBjb25zdCBvdmVyd3JpdGVGYXN0ID0gb3ZlcndyaXRlQmFzZVxuXG5leHBvcnQgY29uc3Qgc291cmNlT3ZlckZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiBzcmNcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChzciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoc2cgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKHNiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArIGRhICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCBkYXJrZW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBzciA8IGRyID8gc3IgOiBkclxuICBjb25zdCBiZyA9IHNnIDwgZGcgPyBzZyA6IGRnXG4gIGNvbnN0IGJiID0gc2IgPCBkYiA/IHNiIDogZGJcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiAoc3JjICogZHN0KSAvIDI1NSAqL1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIC8vIENvbnNpc3RlbnQgZmxvb3Igcm91bmRpbmcgZm9yIGFsbCBjaGFubmVsc1xuICBjb25zdCBiciA9IChzciAqIGRyKSA+PiA4XG4gIGNvbnN0IGJnID0gKHNnICogZGcpID4+IDhcbiAgY29uc3QgYmIgPSAoc2IgKiBkYikgPj4gOFxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHIgPSAoYnIgKiBzYSArIGRyICogaW52QSkgPj4gOFxuICBjb25zdCBnID0gKGJnICogc2EgKyBkZyAqIGludkEpID4+IDhcbiAgY29uc3QgYiA9IChiYiAqIHNhICsgZGIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGEgPSAoMjU1ICogc2EgKyBkYSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogMjU1IC0gKDI1NS1zcmMpL2RzdCAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yQnVybkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gZHIgPT09IDI1NSA/IDI1NSA6IHNyID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRyKSA8PCA4KSAvIHNyKSB8IDApXG4gIGNvbnN0IGJnID0gZGcgPT09IDI1NSA/IDI1NSA6IHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvIHNnKSB8IDApXG4gIGNvbnN0IGJiID0gZGIgPT09IDI1NSA/IDI1NSA6IHNiID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRiKSA8PCA4KSAvIHNiKSB8IDApXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgZGEgKiBpbnZBKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAtIDI1NSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckJ1cm5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gTWF0aDogQmFzZSArIEJsZW5kIC0gMjU1IChjbGFtcGVkIHRvIDApXG4gIGNvbnN0IGJyVSA9IGRyICsgc3IgLSAyNTVcbiAgY29uc3QgYmdVID0gZGcgKyBzZyAtIDI1NVxuICBjb25zdCBiYlUgPSBkYiArIHNiIC0gMjU1XG5cbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZyA9IGJnVSA8IDAgPyAwIDogYmdVXG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCBkYXJrZXJGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyAxLiBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIFdlaWdodHM6IFI6MC4zLCBHOjAuNTksIEI6MC4xMSlcbiAgLy8gU2NhbGVkIGJ5IDI1NiBmb3IgaW50ZWdlciBtYXRoOiA3NywgMTUxLCAyOFxuICBjb25zdCBsdW1TcmMgPSAoc3IgKiA3NyArIHNnICogMTUxICsgc2IgKiAyOClcbiAgY29uc3QgbHVtRHN0ID0gKGRyICogNzcgKyBkZyAqIDE1MSArIGRiICogMjgpXG5cbiAgLy8gMi4gU2VsZWN0aW9uIExvZ2ljXG4gIC8vIFBpY2sgdGhlIHBlcmNlcHR1YWxseSBkYXJrZXIgcGl4ZWxcbiAgbGV0IGJyLCBiZywgYmJcbiAgaWYgKGx1bVNyYyA8IGx1bURzdCkge1xuICAgIGJyID0gc3JcbiAgICBiZyA9IHNnXG4gICAgYmIgPSBzYlxuICB9IGVsc2Uge1xuICAgIGJyID0gZHJcbiAgICBiZyA9IGRnXG4gICAgYmIgPSBkYlxuICB9XG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIDMuIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoc3JjLCBkc3QpICovXG5leHBvcnQgY29uc3QgbGlnaHRlbkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IGJyID0gTWF0aC5tYXgoc3JjICYgMHhGRiwgZHN0ICYgMHhGRilcbiAgY29uc3QgYmcgPSBNYXRoLm1heCgoc3JjID4+IDgpICYgMHhGRiwgKGRzdCA+PiA4KSAmIDB4RkYpXG4gIGNvbnN0IGJiID0gTWF0aC5tYXgoKHNyYyA+PiAxNikgJiAweEZGLCAoZHN0ID4+IDE2KSAmIDB4RkYpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4gOCkgJiAweEZGXG4gIGNvbnN0IGRiID0gKGRzdCA+PiAxNikgJiAweEZGXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKlxuICogMjU1IC0gKCgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpXG4gKi9cbmV4cG9ydCBjb25zdCBzY3JlZW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gMjU1IC0gKCgoMjU1IC0gKHNyYyAmIDB4RkYpKSAqICgyNTUgLSBkcikpID4+IDgpXG4gIGNvbnN0IGJnID0gMjU1IC0gKCgoMjU1IC0gKChzcmMgPj4+IDgpICYgMHhGRikpICogKDI1NSAtIGRnKSkgPj4gOClcbiAgY29uc3QgYmIgPSAyNTUgLSAoKCgyNTUgLSAoKHNyYyA+Pj4gMTYpICYgMHhGRikpICogKDI1NSAtIGRiKSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRzdCA8PCA4KSAvICgyNTUgLSBzcmMpKSAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yRG9kZ2VGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiciA9IHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMjU1IC0gc3IpKSB8IDApXG4gIGNvbnN0IGJnID0gc2cgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkZyA8PCA4KSAvICgyNTUgLSBzZykpIHwgMClcbiAgY29uc3QgYmIgPSBzYiA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRiIDw8IDgpIC8gKDI1NSAtIHNiKSkgfCAwKVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IHIgPSAoYnIgKiBzYSArIGRyICogaW52QSkgPj4gOFxuICBjb25zdCBnID0gKGJnICogc2EgKyBkZyAqIGludkEpID4+IDhcbiAgY29uc3QgYiA9IChiYiAqIHNhICsgZGIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGEgPSAoMjU1ICogc2EgKyAoKGRzdCA+Pj4gMjQpICYgMHhGRikgKiBpbnZBKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckRvZGdlRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnJVID0gKHNyYyAmIDB4RkYpICsgZHJcbiAgY29uc3QgYmdVID0gKChzcmMgPj4+IDgpICYgMHhGRikgKyBkZ1xuICBjb25zdCBiYlUgPSAoKHNyYyA+Pj4gMTYpICYgMHhGRikgKyBkYlxuXG4gIGNvbnN0IGJyID0gYnJVID4gMjU1ID8gMjU1IDogYnJVXG4gIGNvbnN0IGJnID0gYmdVID4gMjU1ID8gMjU1IDogYmdVXG4gIGNvbnN0IGJiID0gYmJVID4gMjU1ID8gMjU1IDogYmJVXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgbGlnaHRlckZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIC8vIENhbGN1bGF0ZSBMdW1pbm9zaXR5IChQaG90b3Nob3AgdXNlcyBXZWlnaHRzOiBSOjAuMywgRzowLjU5LCBCOjAuMTEpXG4gIC8vIFdlIHVzZSBpbnRlZ2VyIG1hdGggKHNjYWxlZCBieSAyNTYpIGZvciBzcGVlZC5cbiAgY29uc3QgbHVtU3JjID0gKHNyICogNzcgKyBzZyAqIDE1MSArIHNiICogMjgpXG4gIGNvbnN0IGx1bURzdCA9IChkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4KVxuXG4gIC8vIFNlbGVjdGlvbiBMb2dpYyAoQmFzZSByZXN1bHQpXG4gIGxldCBiciwgYmcsIGJiXG4gIGlmIChsdW1TcmMgPiBsdW1Ec3QpIHtcbiAgICBiciA9IHNyXG4gICAgYmcgPSBzZ1xuICAgIGJiID0gc2JcbiAgfSBlbHNlIHtcbiAgICBiciA9IGRyXG4gICAgYmcgPSBkZ1xuICAgIGJiID0gZGJcbiAgfVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyAoMiAqIHNyYyAqIGRzdCkgOiAoMjU1IC0gMiAqICgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpICovXG5leHBvcnQgY29uc3Qgb3ZlcmxheUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gZHIgPCAxMjggPyAoMiAqIHNyICogZHIpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpID4+IDgpXG4gIGNvbnN0IGJnID0gZGcgPCAxMjggPyAoMiAqIHNnICogZGcpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpID4+IDgpXG4gIGNvbnN0IGJiID0gZGIgPCAxMjggPyAoMiAqIHNiICogZGIpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpID4+IDgpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogKCgyNTUgLSBkc3QpICogKChzcmMgKiBkc3QpID4+IDgpICsgZHN0ICogKDI1NSAtICgoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSkgPj4gOCkpKSA+PiA4ICovXG5leHBvcnQgY29uc3Qgc29mdExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAoKDI1NSAtIGRyKSAqICgoc3IgKiBkcikgPj4gOCkgKyBkciAqICgyNTUgLSAoKCgyNTUgLSBzcikgKiAoMjU1IC0gZHIpKSA+PiA4KSkpID4+IDhcbiAgY29uc3QgYmcgPSAoKDI1NSAtIGRnKSAqICgoc2cgKiBkZykgPj4gOCkgKyBkZyAqICgyNTUgLSAoKCgyNTUgLSBzZykgKiAoMjU1IC0gZGcpKSA+PiA4KSkpID4+IDhcbiAgY29uc3QgYmIgPSAoKDI1NSAtIGRiKSAqICgoc2IgKiBkYikgPj4gOCkgKyBkYiAqICgyNTUgLSAoKCgyNTUgLSBzYikgKiAoMjU1IC0gZGIpKSA+PiA4KSkpID4+IDhcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBJZiBzcmMgPCAxMjggKDUwJSBncmF5KSwgTXVsdGlwbHk7IG90aGVyd2lzZSwgU2NyZWVuICovXG5leHBvcnQgY29uc3QgaGFyZExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/ICgyICogc3IgKiBkcikgPj4gOCA6IDI1NSAtICgoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpKSA+PiA4KVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKDIgKiBzZyAqIGRnKSA+PiA4IDogMjU1IC0gKCgyICogKDI1NSAtIHNnKSAqICgyNTUgLSBkZykpID4+IDgpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoMiAqIHNiICogZGIpID4+IDggOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2IpICogKDI1NSAtIGRiKSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKlxuICogSWYgc3JjIDwgMTI4OiBCdXJuKGRzdCwgMiAqIHNyYylcbiAqIElmIHNyYyA+PSAxMjg6IERvZGdlKGRzdCwgMiAqIChzcmMgLSAxMjgpKVxuICovXG5leHBvcnQgY29uc3Qgdml2aWRMaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgoMjU1IC0gZHIpIDw8IDgpIC8gKDIgKiBzcikpIHwgMCkpIDogKHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMiAqICgyNTUgLSBzcikpKSB8IDApKVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvICgyICogc2cpKSB8IDApKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSlcbiAgY29uc3QgYmIgPSBzYiA8IDEyOCA/IChzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoKCgyNTUgLSBkYikgPDwgOCkgLyAoMiAqIHNiKSkgfCAwKSkgOiAoc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvICgyICogKDI1NSAtIHNiKSkpIHwgMCkpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgMiAqIHNyYyAtIDI1NSAoQ2xhbXBlZCB0byAwLTI1NSkgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJMaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyVSA9IGRyICsgMiAqIHNyIC0gMjU1XG4gIGNvbnN0IGJnVSA9IGRnICsgMiAqIHNnIC0gMjU1XG4gIGNvbnN0IGJiVSA9IGRiICsgMiAqIHNiIC0gMjU1XG5cbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVSA+IDI1NSA/IDI1NSA6IGJyVVxuICBjb25zdCBiZyA9IGJnVSA8IDAgPyAwIDogYmdVID4gMjU1ID8gMjU1IDogYmdVXG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlUgPiAyNTUgPyAyNTUgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyBtaW4oZHN0LCAyICogc3JjKSA6IG1heChkc3QsIDIgKiAoc3JjIC0gMTI4KSkgKi9cbmV4cG9ydCBjb25zdCBwaW5MaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoZHIgPCAyICogc3IgPyBkciA6IDIgKiBzcikgOiAoZHIgPiAyICogc3IgLSAyNTYgPyBkciA6IDIgKiBzciAtIDI1NilcbiAgY29uc3QgYmcgPSBzZyA8IDEyOCA/IChkZyA8IDIgKiBzZyA/IGRnIDogMiAqIHNnKSA6IChkZyA+IDIgKiBzZyAtIDI1NiA/IGRnIDogMiAqIHNnIC0gMjU2KVxuICBjb25zdCBiYiA9IHNiIDwgMTI4ID8gKGRiIDwgMiAqIHNiID8gZGIgOiAyICogc2IpIDogKGRiID4gMiAqIHNiIC0gMjU2ID8gZGIgOiAyICogc2IgLSAyNTYpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogKFZpdmlkIExpZ2h0IGxvZ2ljIGZvcmNlZCB0byAwIG9yIDI1NSkgKi9cbmV4cG9ydCBjb25zdCBoYXJkTWl4RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAoc3IgPCAxMjggPyAoc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgoMjU1IC0gZHIpIDw8IDgpIC8gKDIgKiBzcikpIHwgMCkpIDogKHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMiAqICgyNTUgLSBzcikpKSB8IDApKSkgPCAxMjggPyAwIDogMjU1XG4gIGNvbnN0IGJnID0gKHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvICgyICogc2cpKSB8IDApKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpIDwgMTI4ID8gMCA6IDI1NVxuICBjb25zdCBiYiA9IChzYiA8IDEyOCA/IChzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoKCgyNTUgLSBkYikgPDwgOCkgLyAoMiAqIHNiKSkgfCAwKSkgOiAoc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvICgyICogKDI1NSAtIHNiKSkpIHwgMCkpKSA8IDEyOCA/IDAgOiAyNTVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBNYXRoLmFicyhzcmMgLSBkc3QpICovXG5leHBvcnQgY29uc3QgZGlmZmVyZW5jZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnJEID0gKHNyYyAmIDB4RkYpIC0gZHJcbiAgY29uc3QgYmdEID0gKChzcmMgPj4+IDgpICYgMHhGRikgLSBkZ1xuICBjb25zdCBiYkQgPSAoKHNyYyA+Pj4gMTYpICYgMHhGRikgLSBkYlxuXG4gIGNvbnN0IGJyID0gYnJEIDwgMCA/IC1ickQgOiBickRcbiAgY29uc3QgYmcgPSBiZ0QgPCAwID8gLWJnRCA6IGJnRFxuICBjb25zdCBiYiA9IGJiRCA8IDAgPyAtYmJEIDogYmJEXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgc3JjIC0gKChkc3QgKiBzcmMpID4+IDcpICovXG5leHBvcnQgY29uc3QgZXhjbHVzaW9uRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBkciArIHNyIC0gKChkciAqIHNyKSA+PiA3KVxuICBjb25zdCBiZyA9IGRnICsgc2cgLSAoKGRnICogc2cpID4+IDcpXG4gIGNvbnN0IGJiID0gZGIgKyBzYiAtICgoZGIgKiBzYikgPj4gNylcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBNYXRoLm1heCgwLCBkc3QgLSBzcmMpICovXG5leHBvcnQgY29uc3Qgc3VidHJhY3RGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiclUgPSBkciAtIHNyXG4gIGNvbnN0IGJnVSA9IGRnIC0gc2dcbiAgY29uc3QgYmJVID0gZGIgLSBzYlxuXG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclVcbiAgY29uc3QgYmcgPSBiZ1UgPCAwID8gMCA6IGJnVVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvIHNyKSAqL1xuZXhwb3J0IGNvbnN0IGRpdmlkZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyBzcikgfCAwKVxuICBjb25zdCBiZyA9IHNnID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gc2cpIHwgMClcbiAgY29uc3QgYmIgPSBzYiA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvIHNiKSB8IDApXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgQkFTRV9GQVNUX0JMRU5EX01PREVfRlVOQ1RJT05TOiBSZWNvcmQ8bnVtYmVyLCBCbGVuZENvbG9yMzI+ID0ge1xuICBbQmFzZUJsZW5kTW9kZS5vdmVyd3JpdGVdOiBvdmVyd3JpdGVGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5zb3VyY2VPdmVyXTogc291cmNlT3ZlckZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmRhcmtlbl06IGRhcmtlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLm11bHRpcGx5XTogbXVsdGlwbHlGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5jb2xvckJ1cm5dOiBjb2xvckJ1cm5GYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJCdXJuXTogbGluZWFyQnVybkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmRhcmtlckNvbG9yXTogZGFya2VyRmFzdCxcblxuICBbQmFzZUJsZW5kTW9kZS5saWdodGVuXTogbGlnaHRlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNjcmVlbl06IHNjcmVlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmNvbG9yRG9kZ2VdOiBjb2xvckRvZGdlRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyRG9kZ2VdOiBsaW5lYXJEb2RnZUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpZ2h0ZXJDb2xvcl06IGxpZ2h0ZXJGYXN0LFxuXG4gIFtCYXNlQmxlbmRNb2RlLm92ZXJsYXldOiBvdmVybGF5RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc29mdExpZ2h0XTogc29mdExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuaGFyZExpZ2h0XTogaGFyZExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUudml2aWRMaWdodF06IHZpdmlkTGlnaHRGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJMaWdodF06IGxpbmVhckxpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUucGluTGlnaHRdOiBwaW5MaWdodEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRNaXhdOiBoYXJkTWl4RmFzdCxcblxuICBbQmFzZUJsZW5kTW9kZS5kaWZmZXJlbmNlXTogZGlmZmVyZW5jZUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmV4Y2x1c2lvbl06IGV4Y2x1c2lvbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnN1YnRyYWN0XTogc3VidHJhY3RGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5kaXZpZGVdOiBkaXZpZGVGYXN0LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUZhc3RCbGVuZE1vZGVSZWdpc3RyeShuYW1lID0gJ2Zhc3QnKSB7XG4gIHJldHVybiBtYWtlQmxlbmRNb2RlUmVnaXN0cnkoQmFzZUJsZW5kTW9kZSwgQkFTRV9GQVNUX0JMRU5EX01PREVfRlVOQ1RJT05TLCBuYW1lKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwritePerfect = overwriteBase;\nexport const sourceOverPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 255) return src;\n if (sa === 0) return dst;\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return src;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const invA = 255 - sa;\n // Exact division by 255 using bit-shifts\n // Formula: (v + 1 + (v >> 8)) >> 8\n const tR = sr * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = sg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = sb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = sr < dr ? sr : dr;\n const bg = sg < dg ? sg : dg;\n const bb = sb < db ? sb : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (src * dst) / 255 */\nexport const multiplyPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Calculate base multiply result: (sr * dr) / 255\n const mR = sr * dr;\n const br = mR + 1 + (mR >> 8) >> 8;\n const mG = sg * dg;\n const bg = mG + 1 + (mG >> 8) >> 8;\n const mB = sb * db;\n const bb = mB + 1 + (mB >> 8) >> 8;\n\n // If fully opaque, return with full alpha\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** 255 - (255-src)/dst */\nexport const colorBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Color Burn Core Math: 255 - ((255 - dst) * 255 / src)\n // We use | 0 to truncate the division result immediately.\n const resR = dr === 255 ? 255 : sr === 0 ? 0 : 255 - ((255 - dr) * 255 / sr | 0);\n const br = resR < 0 ? 0 : resR;\n const resG = dg === 255 ? 255 : sg === 0 ? 0 : 255 - ((255 - dg) * 255 / sg | 0);\n const bg = resG < 0 ? 0 : resG;\n const resB = db === 255 ? 255 : sb === 0 ? 0 : 255 - ((255 - db) * 255 / sb | 0);\n const bb = resB < 0 ? 0 : resB;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst - 255 */\nexport const linearBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255;\n const br = brU < 0 ? 0 : brU;\n const bgU = dg + sg - 255;\n const bg = bgU < 0 ? 0 : bgU;\n const bbU = db + sb - 255;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkerPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb;\n if (lumSrc < lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(src, dst) */\nexport const lightenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = (src & 0xFF) > dr ? src & 0xFF : dr;\n const bg = (src >>> 8 & 0xFF) > dg ? src >>> 8 & 0xFF : dg;\n const bb = (src >>> 16 & 0xFF) > db ? src >>> 16 & 0xFF : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = 255 - ((255 - (src & 0xFF)) * (255 - dr) / 255 | 0);\n const bg = 255 - ((255 - (src >>> 8 & 0xFF)) * (255 - dg) / 255 | 0);\n const bb = 255 - ((255 - (src >>> 16 & 0xFF)) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Color Dodge Core Math: (dst * 255) / (255 - src)\n // We use ternary checks to handle the sr === 255 division-by-zero guard.\n const resR = sr === 255 ? 255 : dr * 255 / (255 - sr) | 0;\n const br = resR > 255 ? 255 : resR;\n const resG = sg === 255 ? 255 : dg * 255 / (255 - sg) | 0;\n const bg = resG > 255 ? 255 : resG;\n const resB = sb === 255 ? 255 : db * 255 / (255 - sb) | 0;\n const bb = resB > 255 ? 255 : resB;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst */\nexport const linearDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brU = (src & 0xFF) + dr;\n const br = brU > 255 ? 255 : brU;\n const bgU = (src >>> 8 & 0xFF) + dg;\n const bg = bgU > 255 ? 255 : bgU;\n const bbU = (src >>> 16 & 0xFF) + db;\n const bb = bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const lighterPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // Selection Logic (Base result)\n let br, bg, bb;\n if (lumSrc > lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);\n const bg = dg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);\n const bb = db < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const mR = sr * dr;\n const scR = (255 - sr) * (255 - dr);\n const br = (255 - dr) * (mR + 1 + (mR >> 8) >> 8) + dr * (255 - (scR + 1 + (scR >> 8) >> 8)) + 1 + ((255 - dr) * (mR + 1 + (mR >> 8) >> 8) + dr * (255 - (scR + 1 + (scR >> 8) >> 8)) >> 8) >> 8;\n const mG = sg * dg;\n const scG = (255 - sg) * (255 - dg);\n const bg = (255 - dg) * (mG + 1 + (mG >> 8) >> 8) + dg * (255 - (scG + 1 + (scG >> 8) >> 8)) + 1 + ((255 - dg) * (mG + 1 + (mG >> 8) >> 8) + dg * (255 - (scG + 1 + (scG >> 8) >> 8)) >> 8) >> 8;\n const mB = sb * db;\n const scB = (255 - sb) * (255 - db);\n const bb = (255 - db) * (mB + 1 + (mB >> 8) >> 8) + db * (255 - (scB + 1 + (scB >> 8) >> 8)) + 1 + ((255 - db) * (mB + 1 + (mB >> 8) >> 8) + db * (255 - (scB + 1 + (scB >> 8) >> 8)) >> 8) >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);\n const bg = sg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);\n const bb = sb < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0);\n const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0);\n const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr + 2 * sr - 255;\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;\n const bgU = dg + 2 * sg - 255;\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;\n const bbU = db + 2 * sb - 255;\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? dr < sr << 1 ? dr : sr << 1 : dr > sr - 128 << 1 ? dr : sr - 128 << 1;\n const bg = sg < 128 ? dg < sg << 1 ? dg : sg << 1 : dg > sg - 128 << 1 ? dg : sg - 128 << 1;\n const bb = sb < 128 ? db < sb << 1 ? db : sb << 1 : db > sb - 128 << 1 ? db : sb - 128 << 1;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;\n const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;\n const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.abs(src - dst) */\nexport const differencePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = dr > sr ? dr - sr : sr - dr;\n const bg = dg > sg ? dg - sg : sg - dg;\n const bb = db > sb ? db - sb : sb - db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const r2 = dr * sr;\n const br = dr + sr - (r2 + r2 + 1 + (r2 + r2 >> 8) >> 8);\n const g2 = dg * sg;\n const bg = dg + sg - (g2 + g2 + 1 + (g2 + g2 >> 8) >> 8);\n const b2 = db * sb;\n const bb = db + sb - (b2 + b2 + 1 + (b2 + b2 >> 8) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(0, dst - src) */\nexport const subtractPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr - sr;\n const br = brU < 0 ? 0 : brU;\n const bgU = dg - sg;\n const bg = bgU < 0 ? 0 : bgU;\n const bbU = db - sb;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const dividePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 0 ? 255 : Math.min(255, dr * 255 / sr | 0);\n const bg = sg === 0 ? 255 : Math.min(255, dg * 255 / sg | 0);\n const bb = sb === 0 ? 255 : Math.min(255, db * 255 / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const BASE_PERFECT_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwritePerfect,\n [BaseBlendMode.sourceOver]: sourceOverPerfect,\n [BaseBlendMode.darken]: darkenPerfect,\n [BaseBlendMode.multiply]: multiplyPerfect,\n [BaseBlendMode.colorBurn]: colorBurnPerfect,\n [BaseBlendMode.linearBurn]: linearBurnPerfect,\n [BaseBlendMode.darkerColor]: darkerPerfect,\n [BaseBlendMode.lighten]: lightenPerfect,\n [BaseBlendMode.screen]: screenPerfect,\n [BaseBlendMode.colorDodge]: colorDodgePerfect,\n [BaseBlendMode.linearDodge]: linearDodgePerfect,\n [BaseBlendMode.lighterColor]: lighterPerfect,\n [BaseBlendMode.overlay]: overlayPerfect,\n [BaseBlendMode.softLight]: softLightPerfect,\n [BaseBlendMode.hardLight]: hardLightPerfect,\n [BaseBlendMode.vividLight]: vividLightPerfect,\n [BaseBlendMode.linearLight]: linearLightPerfect,\n [BaseBlendMode.pinLight]: pinLightPerfect,\n [BaseBlendMode.hardMix]: hardMixPerfect,\n [BaseBlendMode.difference]: differencePerfect,\n [BaseBlendMode.exclusion]: exclusionPerfect,\n [BaseBlendMode.subtract]: subtractPerfect,\n [BaseBlendMode.divide]: dividePerfect\n};\nexport function makePerfectBlendModeRegistry(name = 'perfect') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_PERFECT_BLEND_MODE_FUNCTIONS, name);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBCYXNlQmxlbmRNb2RlLCBvdmVyd3JpdGVCYXNlIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcbmltcG9ydCB7IG1ha2VCbGVuZE1vZGVSZWdpc3RyeSB9IGZyb20gJy4vQmxlbmRNb2RlUmVnaXN0cnknXG5cbmV4cG9ydCBjb25zdCBvdmVyd3JpdGVQZXJmZWN0ID0gb3ZlcndyaXRlQmFzZVxuXG5leHBvcnQgY29uc3Qgc291cmNlT3ZlclBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiBzcmNcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG4gIGlmIChkYSA9PT0gMCkgcmV0dXJuIHNyY1xuXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgLy8gRXhhY3QgZGl2aXNpb24gYnkgMjU1IHVzaW5nIGJpdC1zaGlmdHNcbiAgLy8gRm9ybXVsYTogKHYgKyAxICsgKHYgPj4gOCkpID4+IDhcbiAgY29uc3QgdFIgPSAoc3IgKiBzYSArIGRyICogaW52QSlcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IChzZyAqIHNhICsgZGcgKiBpbnZBKVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IHRCID0gKHNiICogc2EgKyBkYiAqIGludkEpXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEEgPSAoMjU1ICogc2EgKyBkYSAqIGludkEpXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IGRhcmtlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiciA9IHNyIDwgZHIgPyBzciA6IGRyXG4gIGNvbnN0IGJnID0gc2cgPCBkZyA/IHNnIDogZGdcbiAgY29uc3QgYmIgPSBzYiA8IGRiID8gc2IgOiBkYlxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiAoc3JjICogZHN0KSAvIDI1NSAqL1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkZcbiAgY29uc3QgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkZcbiAgY29uc3QgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRlxuICBjb25zdCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRlxuICBjb25zdCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyBDYWxjdWxhdGUgYmFzZSBtdWx0aXBseSByZXN1bHQ6IChzciAqIGRyKSAvIDI1NVxuICBjb25zdCBtUiA9IHNyICogZHJcbiAgY29uc3QgYnIgPSAobVIgKyAxICsgKG1SID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgbUcgPSBzZyAqIGRnXG4gIGNvbnN0IGJnID0gKG1HICsgMSArIChtRyA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1CID0gc2IgKiBkYlxuICBjb25zdCBiYiA9IChtQiArIDEgKyAobUIgPj4gOCkpID4+IDhcblxuICAvLyBJZiBmdWxseSBvcGFxdWUsIHJldHVybiB3aXRoIGZ1bGwgYWxwaGFcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIDI1NSAtICgyNTUtc3JjKS9kc3QgKi9cbmV4cG9ydCBjb25zdCBjb2xvckJ1cm5QZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBzciA9IHNyYyAmIDB4RkZcbiAgY29uc3Qgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkZcbiAgY29uc3Qgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gQ29sb3IgQnVybiBDb3JlIE1hdGg6IDI1NSAtICgoMjU1IC0gZHN0KSAqIDI1NSAvIHNyYylcbiAgLy8gV2UgdXNlIHwgMCB0byB0cnVuY2F0ZSB0aGUgZGl2aXNpb24gcmVzdWx0IGltbWVkaWF0ZWx5LlxuICBjb25zdCByZXNSID0gZHIgPT09IDI1NSA/IDI1NSA6IHNyID09PSAwID8gMCA6IDI1NSAtICgoKDI1NSAtIGRyKSAqIDI1NSAvIHNyKSB8IDApXG4gIGNvbnN0IGJyID0gcmVzUiA8IDAgPyAwIDogcmVzUlxuXG4gIGNvbnN0IHJlc0cgPSBkZyA9PT0gMjU1ID8gMjU1IDogc2cgPT09IDAgPyAwIDogMjU1IC0gKCgoMjU1IC0gZGcpICogMjU1IC8gc2cpIHwgMClcbiAgY29uc3QgYmcgPSByZXNHIDwgMCA/IDAgOiByZXNHXG5cbiAgY29uc3QgcmVzQiA9IGRiID09PSAyNTUgPyAyNTUgOiBzYiA9PT0gMCA/IDAgOiAyNTUgLSAoKCgyNTUgLSBkYikgKiAyNTUgLyBzYikgfCAwKVxuICBjb25zdCBiYiA9IHJlc0IgPCAwID8gMCA6IHJlc0JcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAtIDI1NSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckJ1cm5QZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gTWF0aDogQmFzZSArIEJsZW5kIC0gMjU1IChjbGFtcGVkIHRvIDApXG4gIGNvbnN0IGJyVSA9IGRyICsgc3IgLSAyNTVcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZ1UgPSBkZyArIHNnIC0gMjU1XG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1VcbiAgY29uc3QgYmJVID0gZGIgKyBzYiAtIDI1NVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgZGFya2VyUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gMS4gQ2FsY3VsYXRlIEx1bWlub3NpdHkgKFBob3Rvc2hvcCBXZWlnaHRzOiBSOjAuMywgRzowLjU5LCBCOjAuMTEpXG4gIC8vIFNjYWxlZCBieSAyNTYgZm9yIGludGVnZXIgbWF0aDogNzcsIDE1MSwgMjhcbiAgY29uc3QgbHVtU3JjID0gKHNyICogNzcgKyBzZyAqIDE1MSArIHNiICogMjgpXG4gIGNvbnN0IGx1bURzdCA9IChkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4KVxuXG4gIC8vIDIuIFNlbGVjdGlvbiBMb2dpY1xuICAvLyBQaWNrIHRoZSBwZXJjZXB0dWFsbHkgZGFya2VyIHBpeGVsXG4gIGxldCBiciwgYmcsIGJiXG4gIGlmIChsdW1TcmMgPCBsdW1Ec3QpIHtcbiAgICBiciA9IHNyXG4gICAgYmcgPSBzZ1xuICAgIGJiID0gc2JcbiAgfSBlbHNlIHtcbiAgICBiciA9IGRyXG4gICAgYmcgPSBkZ1xuICAgIGJiID0gZGJcbiAgfVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyAzLiBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoc3JjLCBkc3QpICovXG5leHBvcnQgY29uc3QgbGlnaHRlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyID0gKHNyYyAmIDB4RkYpID4gZHIgPyAoc3JjICYgMHhGRikgOiBkclxuICBjb25zdCBiZyA9ICgoc3JjID4+PiA4KSAmIDB4RkYpID4gZGcgPyAoKHNyYyA+Pj4gOCkgJiAweEZGKSA6IGRnXG4gIGNvbnN0IGJiID0gKChzcmMgPj4+IDE2KSAmIDB4RkYpID4gZGIgPyAoKHNyYyA+Pj4gMTYpICYgMHhGRikgOiBkYlxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqXG4gKiAyNTUgLSAoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSlcbiAqL1xuZXhwb3J0IGNvbnN0IHNjcmVlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAyNTUgLSAoKCgyNTUgLSAoc3JjICYgMHhGRikpICogKDI1NSAtIGRyKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiZyA9IDI1NSAtICgoKDI1NSAtICgoc3JjID4+PiA4KSAmIDB4RkYpKSAqICgyNTUgLSBkZykgLyAyNTUpIHwgMClcbiAgY29uc3QgYmIgPSAyNTUgLSAoKCgyNTUgLSAoKHNyYyA+Pj4gMTYpICYgMHhGRikpICogKDI1NSAtIGRiKSAvIDI1NSkgfCAwKVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRzdCA8PCA4KSAvICgyNTUgLSBzcmMpKSAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yRG9kZ2VQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBzciA9IHNyYyAmIDB4RkZcbiAgY29uc3Qgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkZcbiAgY29uc3Qgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gQ29sb3IgRG9kZ2UgQ29yZSBNYXRoOiAoZHN0ICogMjU1KSAvICgyNTUgLSBzcmMpXG4gIC8vIFdlIHVzZSB0ZXJuYXJ5IGNoZWNrcyB0byBoYW5kbGUgdGhlIHNyID09PSAyNTUgZGl2aXNpb24tYnktemVybyBndWFyZC5cbiAgY29uc3QgcmVzUiA9IHNyID09PSAyNTUgPyAyNTUgOiAoZHIgKiAyNTUgLyAoMjU1IC0gc3IpKSB8IDBcbiAgY29uc3QgYnIgPSByZXNSID4gMjU1ID8gMjU1IDogcmVzUlxuXG4gIGNvbnN0IHJlc0cgPSBzZyA9PT0gMjU1ID8gMjU1IDogKGRnICogMjU1IC8gKDI1NSAtIHNnKSkgfCAwXG4gIGNvbnN0IGJnID0gcmVzRyA+IDI1NSA/IDI1NSA6IHJlc0dcblxuICBjb25zdCByZXNCID0gc2IgPT09IDI1NSA/IDI1NSA6IChkYiAqIDI1NSAvICgyNTUgLSBzYikpIHwgMFxuICBjb25zdCBiYiA9IHJlc0IgPiAyNTUgPyAyNTUgOiByZXNCXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgKyBkc3QgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJEb2RnZVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyVSA9IChzcmMgJiAweEZGKSArIGRyXG4gIGNvbnN0IGJyID0gYnJVID4gMjU1ID8gMjU1IDogYnJVXG4gIGNvbnN0IGJnVSA9ICgoc3JjID4+PiA4KSAmIDB4RkYpICsgZGdcbiAgY29uc3QgYmcgPSBiZ1UgPiAyNTUgPyAyNTUgOiBiZ1VcbiAgY29uc3QgYmJVID0gKChzcmMgPj4+IDE2KSAmIDB4RkYpICsgZGJcbiAgY29uc3QgYmIgPSBiYlUgPiAyNTUgPyAyNTUgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IGxpZ2h0ZXJQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIHVzZXMgV2VpZ2h0czogUjowLjMsIEc6MC41OSwgQjowLjExKVxuICAvLyBXZSB1c2UgaW50ZWdlciBtYXRoIChzY2FsZWQgYnkgMjU2KSBmb3Igc3BlZWQuXG4gIGNvbnN0IGx1bVNyYyA9IChzciAqIDc3ICsgc2cgKiAxNTEgKyBzYiAqIDI4KVxuICBjb25zdCBsdW1Ec3QgPSAoZHIgKiA3NyArIGRnICogMTUxICsgZGIgKiAyOClcblxuICAvLyBTZWxlY3Rpb24gTG9naWMgKEJhc2UgcmVzdWx0KVxuICBsZXQgYnIsIGJnLCBiYlxuICBpZiAobHVtU3JjID4gbHVtRHN0KSB7XG4gICAgYnIgPSBzclxuICAgIGJnID0gc2dcbiAgICBiYiA9IHNiXG4gIH0gZWxzZSB7XG4gICAgYnIgPSBkclxuICAgIGJnID0gZGdcbiAgICBiYiA9IGRiXG4gIH1cblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyAoMiAqIHNyYyAqIGRzdCkgOiAoMjU1IC0gMiAqICgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpICovXG5leHBvcnQgY29uc3Qgb3ZlcmxheVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IGRyIDwgMTI4ID8gKDIgKiBzciAqIGRyIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc3IpICogKDI1NSAtIGRyKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiZyA9IGRnIDwgMTI4ID8gKDIgKiBzZyAqIGRnIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2cpICogKDI1NSAtIGRnKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiYiA9IGRiIDwgMTI4ID8gKDIgKiBzYiAqIGRiIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2IpICogKDI1NSAtIGRiKSAvIDI1NSkgfCAwKVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqICgoMjU1IC0gZHN0KSAqICgoc3JjICogZHN0KSA+PiA4KSArIGRzdCAqICgyNTUgLSAoKCgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpID4+IDgpKSkgPj4gOCAqL1xuZXhwb3J0IGNvbnN0IHNvZnRMaWdodFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IG1SID0gKHNyICogZHIpXG4gIGNvbnN0IHNjUiA9ICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpXG4gIGNvbnN0IGJyID0gKCgyNTUgLSBkcikgKiAoKG1SICsgMSArIChtUiA+PiA4KSkgPj4gOCkgKyBkciAqICgyNTUgLSAoKHNjUiArIDEgKyAoc2NSID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZHIpICogKChtUiArIDEgKyAobVIgPj4gOCkpID4+IDgpICsgZHIgKiAoMjU1IC0gKChzY1IgKyAxICsgKHNjUiA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1HID0gKHNnICogZGcpXG4gIGNvbnN0IHNjRyA9ICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpXG4gIGNvbnN0IGJnID0gKCgyNTUgLSBkZykgKiAoKG1HICsgMSArIChtRyA+PiA4KSkgPj4gOCkgKyBkZyAqICgyNTUgLSAoKHNjRyArIDEgKyAoc2NHID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZGcpICogKChtRyArIDEgKyAobUcgPj4gOCkpID4+IDgpICsgZGcgKiAoMjU1IC0gKChzY0cgKyAxICsgKHNjRyA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1CID0gKHNiICogZGIpXG4gIGNvbnN0IHNjQiA9ICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpXG4gIGNvbnN0IGJiID0gKCgyNTUgLSBkYikgKiAoKG1CICsgMSArIChtQiA+PiA4KSkgPj4gOCkgKyBkYiAqICgyNTUgLSAoKHNjQiArIDEgKyAoc2NCID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZGIpICogKChtQiArIDEgKyAobUIgPj4gOCkpID4+IDgpICsgZGIgKiAoMjU1IC0gKChzY0IgKyAxICsgKHNjQiA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBJZiBzcmMgPCAxMjggKDUwJSBncmF5KSwgTXVsdGlwbHk7IG90aGVyd2lzZSwgU2NyZWVuICovXG5leHBvcnQgY29uc3QgaGFyZExpZ2h0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoMiAqIHNyICogZHIgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpIC8gMjU1KSB8IDApXG4gIGNvbnN0IGJnID0gc2cgPCAxMjggPyAoMiAqIHNnICogZGcgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpIC8gMjU1KSB8IDApXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoMiAqIHNiICogZGIgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpIC8gMjU1KSB8IDApXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKipcbiAqIElmIHNyYyA8IDEyODogQnVybihkc3QsIDIgKiBzcmMpXG4gKiBJZiBzcmMgPj0gMTI4OiBEb2RnZShkc3QsIDIgKiAoc3JjIC0gMTI4KSlcbiAqL1xuZXhwb3J0IGNvbnN0IHZpdmlkTGlnaHRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/IChzciA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAoMjU1IC0gKCgoMjU1IC0gZHIpICogMjU1IC8gKDIgKiBzcikpIHwgMCkpKSkgOiAoc3IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkciAqIDI1NSAvICgyICogKDI1NSAtIHNyKSkpIHwgMCkpKVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsICgyNTUgLSAoKCgyNTUgLSBkZykgKiAyNTUgLyAoMiAqIHNnKSkgfCAwKSkpKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnICogMjU1IC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgKDI1NSAtICgoKDI1NSAtIGRiKSAqIDI1NSAvICgyICogc2IpKSB8IDApKSkpIDogKHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGIgKiAyNTUgLyAoMiAqICgyNTUgLSBzYikpKSB8IDApKSlcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBkc3QgKyAyICogc3JjIC0gMjU1IChDbGFtcGVkIHRvIDAtMjU1KSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckxpZ2h0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyVSA9IGRyICsgMiAqIHNyIC0gMjU1XG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclUgPiAyNTUgPyAyNTUgOiBiclVcbiAgY29uc3QgYmdVID0gZGcgKyAyICogc2cgLSAyNTVcbiAgY29uc3QgYmcgPSBiZ1UgPCAwID8gMCA6IGJnVSA+IDI1NSA/IDI1NSA6IGJnVVxuICBjb25zdCBiYlUgPSBkYiArIDIgKiBzYiAtIDI1NVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVID4gMjU1ID8gMjU1IDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3JjIDwgMTI4ID8gbWluKGRzdCwgMiAqIHNyYykgOiBtYXgoZHN0LCAyICogKHNyYyAtIDEyOCkpICovXG5leHBvcnQgY29uc3QgcGluTGlnaHRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGXG4gIGNvbnN0IHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGXG4gIGNvbnN0IHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoZHIgPCAoc3IgPDwgMSkgPyBkciA6IChzciA8PCAxKSkgOiAoZHIgPiAoKHNyIC0gMTI4KSA8PCAxKSA/IGRyIDogKChzciAtIDEyOCkgPDwgMSkpXG4gIGNvbnN0IGJnID0gc2cgPCAxMjggPyAoZGcgPCAoc2cgPDwgMSkgPyBkZyA6IChzZyA8PCAxKSkgOiAoZGcgPiAoKHNnIC0gMTI4KSA8PCAxKSA/IGRnIDogKChzZyAtIDEyOCkgPDwgMSkpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoZGIgPCAoc2IgPDwgMSkgPyBkYiA6IChzYiA8PCAxKSkgOiAoZGIgPiAoKHNiIC0gMTI4KSA8PCAxKSA/IGRiIDogKChzYiAtIDEyOCkgPDwgMSkpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIChWaXZpZCBMaWdodCBsb2dpYyBmb3JjZWQgdG8gMCBvciAyNTUpICovXG5leHBvcnQgY29uc3QgaGFyZE1peFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IChzciA8IDEyOCA/IChzciA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAoMjU1IC0gKCgoMjU1IC0gZHIpICogMjU1IC8gKDIgKiBzcikpIHwgMCkpKSkgOiAoc3IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkciAqIDI1NSAvICgyICogKDI1NSAtIHNyKSkpIHwgMCkpKSkgPCAxMjggPyAwIDogMjU1XG4gIGNvbnN0IGJnID0gKHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsICgyNTUgLSAoKCgyNTUgLSBkZykgKiAyNTUgLyAoMiAqIHNnKSkgfCAwKSkpKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnICogMjU1IC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpKSA8IDEyOCA/IDAgOiAyNTVcbiAgY29uc3QgYmIgPSAoc2IgPCAxMjggPyAoc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgKDI1NSAtICgoKDI1NSAtIGRiKSAqIDI1NSAvICgyICogc2IpKSB8IDApKSkpIDogKHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGIgKiAyNTUgLyAoMiAqICgyNTUgLSBzYikpKSB8IDApKSkpIDwgMTI4ID8gMCA6IDI1NVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIE1hdGguYWJzKHNyYyAtIGRzdCkgKi9cbmV4cG9ydCBjb25zdCBkaWZmZXJlbmNlUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBkciA+IHNyID8gZHIgLSBzciA6IHNyIC0gZHJcbiAgY29uc3QgYmcgPSBkZyA+IHNnID8gZGcgLSBzZyA6IHNnIC0gZGdcbiAgY29uc3QgYmIgPSBkYiA+IHNiID8gZGIgLSBzYiA6IHNiIC0gZGJcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgc3JjIC0gKChkc3QgKiBzcmMpID4+IDcpICovXG5leHBvcnQgY29uc3QgZXhjbHVzaW9uUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkZcbiAgY29uc3QgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkZcbiAgY29uc3QgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRlxuICBjb25zdCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRlxuICBjb25zdCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCByMiA9IGRyICogc3JcbiAgY29uc3QgYnIgPSBkciArIHNyIC0gKCgocjIgKyByMikgKyAxICsgKChyMiArIHIyKSA+PiA4KSkgPj4gOClcblxuICBjb25zdCBnMiA9IGRnICogc2dcbiAgY29uc3QgYmcgPSBkZyArIHNnIC0gKCgoZzIgKyBnMikgKyAxICsgKChnMiArIGcyKSA+PiA4KSkgPj4gOClcblxuICBjb25zdCBiMiA9IGRiICogc2JcbiAgY29uc3QgYmIgPSBkYiArIHNiIC0gKCgoYjIgKyBiMikgKyAxICsgKChiMiArIGIyKSA+PiA4KSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoMCwgZHN0IC0gc3JjKSAqL1xuZXhwb3J0IGNvbnN0IHN1YnRyYWN0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyVSA9IGRyIC0gc3JcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZ1UgPSBkZyAtIHNnXG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1VcbiAgY29uc3QgYmJVID0gZGIgLSBzYlxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvIHNyKSAqL1xuZXhwb3J0IGNvbnN0IGRpdmlkZVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IHNyID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRyICogMjU1IC8gc3IpIHwgMCkpXG4gIGNvbnN0IGJnID0gc2cgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGcgKiAyNTUgLyBzZykgfCAwKSlcbiAgY29uc3QgYmIgPSBzYiA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiAqIDI1NSAvIHNiKSB8IDApKVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IEJBU0VfUEVSRkVDVF9CTEVORF9NT0RFX0ZVTkNUSU9OUzogUmVjb3JkPG51bWJlciwgQmxlbmRDb2xvcjMyPiA9IHtcbiAgW0Jhc2VCbGVuZE1vZGUub3ZlcndyaXRlXTogb3ZlcndyaXRlUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlT3Zlcl06IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZW5dOiBkYXJrZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5tdWx0aXBseV06IG11bHRpcGx5UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JCdXJuXTogY29sb3JCdXJuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyQnVybl06IGxpbmVhckJ1cm5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZXJDb2xvcl06IGRhcmtlclBlcmZlY3QsXG5cbiAgW0Jhc2VCbGVuZE1vZGUubGlnaHRlbl06IGxpZ2h0ZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5zY3JlZW5dOiBzY3JlZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5jb2xvckRvZGdlXTogY29sb3JEb2RnZVBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpbmVhckRvZGdlXTogbGluZWFyRG9kZ2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5saWdodGVyQ29sb3JdOiBsaWdodGVyUGVyZmVjdCxcblxuICBbQmFzZUJsZW5kTW9kZS5vdmVybGF5XTogb3ZlcmxheVBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvZnRMaWdodF06IHNvZnRMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRMaWdodF06IGhhcmRMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnZpdmlkTGlnaHRdOiB2aXZpZExpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyTGlnaHRdOiBsaW5lYXJMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnBpbkxpZ2h0XTogcGluTGlnaHRQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5oYXJkTWl4XTogaGFyZE1peFBlcmZlY3QsXG5cbiAgW0Jhc2VCbGVuZE1vZGUuZGlmZmVyZW5jZV06IGRpZmZlcmVuY2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5leGNsdXNpb25dOiBleGNsdXNpb25QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5zdWJ0cmFjdF06IHN1YnRyYWN0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGl2aWRlXTogZGl2aWRlUGVyZmVjdCxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQZXJmZWN0QmxlbmRNb2RlUmVnaXN0cnkobmFtZSA9ICdwZXJmZWN0Jykge1xuICByZXR1cm4gbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5KEJhc2VCbGVuZE1vZGUsIEJBU0VfUEVSRkVDVF9CTEVORF9NT0RFX0ZVTkNUSU9OUywgbmFtZSlcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { BaseBlendMode } from './blend-modes';\nexport function toBlendModeIndexAndName(input: string | number) {\n if (typeof input === 'number') {\n const name = getKeyByValue(BaseBlendMode, input);\n if (name === undefined) throw new Error(`Invalid index: ${input}`);\n return {\n blendIndex: input,\n blendName: name\n };\n }\n const trimmed = input.trim();\n const num = Number(trimmed);\n const isNumeric = trimmed !== '' && !Number.isNaN(num);\n if (isNumeric && Number.isInteger(num)) {\n const name = getKeyByValue(BaseBlendMode, num);\n if (name === undefined) throw new Error(`Invalid index: ${num}`);\n return {\n blendIndex: num,\n blendName: name\n };\n }\n if (trimmed in BaseBlendMode) {\n return {\n blendIndex: BaseBlendMode[trimmed as keyof typeof BaseBlendMode],\n blendName: trimmed as keyof typeof BaseBlendMode\n };\n }\n throw new Error(`Invalid blend mode: ${JSON.stringify(input)}`);\n}\nconst getKeyByValue = (obj: any, value: any) => {\n for (const key in obj) {\n if (obj[key] === value) return key;\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUJsZW5kTW9kZSB9IGZyb20gJy4vYmxlbmQtbW9kZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0b0JsZW5kTW9kZUluZGV4QW5kTmFtZShpbnB1dDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgbmFtZSA9IGdldEtleUJ5VmFsdWUoQmFzZUJsZW5kTW9kZSwgaW5wdXQpXG4gICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGV4OiAke2lucHV0fWApXG4gICAgcmV0dXJuIHsgYmxlbmRJbmRleDogaW5wdXQsIGJsZW5kTmFtZTogbmFtZSB9XG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gaW5wdXQudHJpbSgpXG4gIGNvbnN0IG51bSA9IE51bWJlcih0cmltbWVkKVxuICBjb25zdCBpc051bWVyaWMgPSB0cmltbWVkICE9PSAnJyAmJiAhTnVtYmVyLmlzTmFOKG51bSlcblxuICBpZiAoaXNOdW1lcmljICYmIE51bWJlci5pc0ludGVnZXIobnVtKSkge1xuICAgIGNvbnN0IG5hbWUgPSBnZXRLZXlCeVZhbHVlKEJhc2VCbGVuZE1vZGUsIG51bSlcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kZXg6ICR7bnVtfWApXG4gICAgcmV0dXJuIHsgYmxlbmRJbmRleDogbnVtLCBibGVuZE5hbWU6IG5hbWUgfVxuICB9XG5cbiAgaWYgKHRyaW1tZWQgaW4gQmFzZUJsZW5kTW9kZSkge1xuICAgIHJldHVybiB7XG4gICAgICBibGVuZEluZGV4OiBCYXNlQmxlbmRNb2RlW3RyaW1tZWQgYXMga2V5b2YgdHlwZW9mIEJhc2VCbGVuZE1vZGVdLFxuICAgICAgYmxlbmROYW1lOiB0cmltbWVkIGFzIGtleW9mIHR5cGVvZiBCYXNlQmxlbmRNb2RlLFxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBibGVuZCBtb2RlOiAke0pTT04uc3RyaW5naWZ5KGlucHV0KX1gKVxufVxuXG5jb25zdCBnZXRLZXlCeVZhbHVlID0gKG9iajogYW55LCB2YWx1ZTogYW55KSA9PiB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmpba2V5XSA9PT0gdmFsdWUpIHJldHVybiBrZXlcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export const OFFSCREEN_CANVAS_CTX_FAILED = 'Failed to create OffscreenCanvas context';\nexport const CANVAS_CTX_FAILED = 'Failed to create Canvas context';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IE9GRlNDUkVFTl9DQU5WQVNfQ1RYX0ZBSUxFRCA9ICdGYWlsZWQgdG8gY3JlYXRlIE9mZnNjcmVlbkNhbnZhcyBjb250ZXh0J1xuZXhwb3J0IGNvbnN0IENBTlZBU19DVFhfRkFJTEVEID0gJ0ZhaWxlZCB0byBjcmVhdGUgQ2FudmFzIGNvbnRleHQnXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { CANVAS_CTX_FAILED } from './_constants';\nexport type PixelCanvas = {\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D;\n readonly resize: (w: number, h: number) => void;\n};\n\n/**\n * Ensures the canvas ctx is always set to imageSmoothingEnabled = false.\n * Intended for canvas elements that are already part of the DOM.\n * @see makeReusableCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makePixelCanvas(canvas: HTMLCanvasElement): PixelCanvas {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\n return {\n canvas,\n ctx,\n resize(w: number, h: number) {\n canvas.width = w;\n canvas.height = h;\n ctx.imageSmoothingEnabled = false;\n }\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuL19jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIFBpeGVsQ2FudmFzID0ge1xuICByZWFkb25seSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICByZWFkb25seSBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgcmVhZG9ubHkgcmVzaXplOiAodzogbnVtYmVyLCBoOiBudW1iZXIpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBjYW52YXMgY3R4IGlzIGFsd2F5cyBzZXQgdG8gaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2UuXG4gKiBJbnRlbmRlZCBmb3IgY2FudmFzIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgcGFydCBvZiB0aGUgRE9NLlxuICogQHNlZSBtYWtlUmV1c2FibGVDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQaXhlbENhbnZhcyhcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbik6IFBpeGVsQ2FudmFzIHtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRClcbiAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBjYW52YXMsXG4gICAgY3R4LFxuICAgIHJlc2l6ZSh3OiBudW1iZXIsIGg6IG51bWJlcikge1xuICAgICAgY2FudmFzLndpZHRoID0gd1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhcbiAgICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZVxuICAgIH0sXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { CANVAS_CTX_FAILED } from './_constants';\nexport type ReusableCanvas = {\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D;\n};\n\n/**\n * Creates a reusable canvas and context that are not part of the DOM.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makeReusableCanvas() {\n let canvas: HTMLCanvasElement | null = null;\n let ctx: CanvasRenderingContext2D | null = null;\n function get(width: number, height: number): ReusableCanvas {\n if (canvas === null) {\n canvas = document.createElement('canvas')!;\n ctx = canvas.getContext('2d')!;\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n }\n\n // Resize if needed (resizing auto-clears)\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n ctx!.imageSmoothingEnabled = false;\n } else {\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height);\n }\n return {\n canvas,\n ctx: ctx!\n };\n }\n get.reset = () => {\n canvas = null;\n ctx = null;\n };\n return get;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuL19jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIFJldXNhYmxlQ2FudmFzID0ge1xuICByZWFkb25seSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50XG4gIHJlYWRvbmx5IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJldXNhYmxlIGNhbnZhcyBhbmQgY29udGV4dCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgRE9NLlxuICogRW5zdXJlcyBpdCBpcyBhbHdheXMgc2V0IHRvIGBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlYFxuICogQHNlZSBtYWtlUGl4ZWxDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXVzYWJsZUNhbnZhcygpIHtcbiAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gbnVsbFxuICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbFxuXG4gIGZ1bmN0aW9uIGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFJldXNhYmxlQ2FudmFzIHtcbiAgICBpZiAoY2FudmFzID09PSBudWxsKSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSFcbiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIVxuICAgICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRClcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgaWYgbmVlZGVkIChyZXNpemluZyBhdXRvLWNsZWFycylcbiAgICBpZiAoY2FudmFzLndpZHRoICE9PSB3aWR0aCB8fCBjYW52YXMuaGVpZ2h0ICE9PSBoZWlnaHQpIHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgICBjdHghLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhbWUgc2l6ZSDihpIgbWFudWFsbHkgY2xlYXJcbiAgICAgIGN0eCEuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2FudmFzLCBjdHg6IGN0eCEgfVxuICB9XG5cbiAgZ2V0LnJlc2V0ID0gKCkgPT4ge1xuICAgIGNhbnZhcyA9IG51bGxcbiAgICBjdHggPSBudWxsXG4gIH1cblxuICByZXR1cm4gZ2V0XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Decodes a {@link Blob} (typically PNG) back into an {@link ImageData} object.\n *\n * This function uses hardware-accelerated decoding via {@link createImageBitmap}\n * and processes the data using an {@link OffscreenCanvas} to ensure\n * compatibility with Web Workers.\n *\n * @param blob - The binary image data to decode.\n *\n * @returns A promise resolving to the decoded {@link ImageData}.\n *\n * @throws {Error}\n * Thrown if the blob is corrupted or the browser cannot decode the format.\n *\n * @example\n * ```typescript\n * const blob = await getBlobFromStorage();\n *\n * const imageData = await pngBlobToImageData(blob);\n * ```\n */\nexport async function imgBlobToImageData(blob: Blob): Promise<ImageData> {\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(blob);\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to get 2D context');\n }\n ctx.drawImage(bitmap, 0, 0);\n return ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n } finally {\n bitmap?.close();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWNvZGVzIGEge0BsaW5rIEJsb2J9ICh0eXBpY2FsbHkgUE5HKSBiYWNrIGludG8gYW4ge0BsaW5rIEltYWdlRGF0YX0gb2JqZWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBoYXJkd2FyZS1hY2NlbGVyYXRlZCBkZWNvZGluZyB2aWEge0BsaW5rIGNyZWF0ZUltYWdlQml0bWFwfVxuICogYW5kIHByb2Nlc3NlcyB0aGUgZGF0YSB1c2luZyBhbiB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfSB0byBlbnN1cmVcbiAqIGNvbXBhdGliaWxpdHkgd2l0aCBXZWIgV29ya2Vycy5cbiAqXG4gKiBAcGFyYW0gYmxvYiAtIFRoZSBiaW5hcnkgaW1hZ2UgZGF0YSB0byBkZWNvZGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVjb2RlZCB7QGxpbmsgSW1hZ2VEYXRhfS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqIFRocm93biBpZiB0aGUgYmxvYiBpcyBjb3JydXB0ZWQgb3IgdGhlIGJyb3dzZXIgY2Fubm90IGRlY29kZSB0aGUgZm9ybWF0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBibG9iID0gYXdhaXQgZ2V0QmxvYkZyb21TdG9yYWdlKCk7XG4gKlxuICogY29uc3QgaW1hZ2VEYXRhID0gYXdhaXQgcG5nQmxvYlRvSW1hZ2VEYXRhKGJsb2IpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbWdCbG9iVG9JbWFnZURhdGEoXG4gIGJsb2I6IEJsb2IsXG4pOiBQcm9taXNlPEltYWdlRGF0YT4ge1xuICBsZXQgYml0bWFwOiBJbWFnZUJpdG1hcCB8IG51bGwgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICBiaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChibG9iKVxuXG4gICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhcbiAgICAgIGJpdG1hcC53aWR0aCxcbiAgICAgIGJpdG1hcC5oZWlnaHQsXG4gICAgKVxuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcblxuICAgIGlmICghY3R4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgMkQgY29udGV4dCcpXG4gICAgfVxuXG4gICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApXG5cbiAgICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgYml0bWFwLndpZHRoLFxuICAgICAgYml0bWFwLmhlaWdodCxcbiAgICApXG4gIH0gZmluYWxseSB7XG4gICAgYml0bWFwPy5jbG9zZSgpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { imgBlobToImageData } from '../ImageData/imgBlobToImageData';\n\n/**\n * Extracts {@link ImageData} from a clipboard event if an image is present.\n *\n * This function iterates through the {@link DataTransferItemList} to find\n * the first item with an image MIME type and decodes it.\n *\n * @param clipboardEvent - The event object from a `paste` listener.\n *\n * @returns A promise resolving to {@link ImageData}, or `null` if no\n * image was found in the clipboard.\n *\n * @example\n * ```typescript\n * window.addEventListener('paste', async (event) => {\n * const data = await getImageDataFromClipboard(event)\n * if (data) {\n * console.log('Pasted image dimensions:', data.width, data.height)\n * }\n * });\n * ```\n */\nexport async function getImageDataFromClipboard(clipboardEvent: ClipboardEvent) {\n const items = clipboardEvent?.clipboardData?.items;\n if (!items?.length) return null;\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith('image/')) {\n const blob = item.getAsFile();\n if (!blob) {\n continue;\n }\n return imgBlobToImageData(blob);\n }\n }\n return null;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW1nQmxvYlRvSW1hZ2VEYXRhIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltZ0Jsb2JUb0ltYWdlRGF0YSdcblxuLyoqXG4gKiBFeHRyYWN0cyB7QGxpbmsgSW1hZ2VEYXRhfSBmcm9tIGEgY2xpcGJvYXJkIGV2ZW50IGlmIGFuIGltYWdlIGlzIHByZXNlbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyB0aHJvdWdoIHRoZSB7QGxpbmsgRGF0YVRyYW5zZmVySXRlbUxpc3R9IHRvIGZpbmRcbiAqIHRoZSBmaXJzdCBpdGVtIHdpdGggYW4gaW1hZ2UgTUlNRSB0eXBlIGFuZCBkZWNvZGVzIGl0LlxuICpcbiAqIEBwYXJhbSBjbGlwYm9hcmRFdmVudCAtIFRoZSBldmVudCBvYmplY3QgZnJvbSBhIGBwYXN0ZWAgbGlzdGVuZXIuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byB7QGxpbmsgSW1hZ2VEYXRhfSwgb3IgYG51bGxgIGlmIG5vXG4gKiBpbWFnZSB3YXMgZm91bmQgaW4gdGhlIGNsaXBib2FyZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRJbWFnZURhdGFGcm9tQ2xpcGJvYXJkKGV2ZW50KVxuICogICBpZiAoZGF0YSkge1xuICogICAgIGNvbnNvbGUubG9nKCdQYXN0ZWQgaW1hZ2UgZGltZW5zaW9uczonLCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodClcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEltYWdlRGF0YUZyb21DbGlwYm9hcmQoY2xpcGJvYXJkRXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG4gIGNvbnN0IGl0ZW1zID0gY2xpcGJvYXJkRXZlbnQ/LmNsaXBib2FyZERhdGE/Lml0ZW1zXG4gIGlmICghaXRlbXM/Lmxlbmd0aCkgcmV0dXJuIG51bGxcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldXG5cbiAgICBpZiAoaXRlbS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XG4gICAgICBjb25zdCBibG9iID0gaXRlbS5nZXRBc0ZpbGUoKVxuXG4gICAgICBpZiAoIWJsb2IpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGltZ0Jsb2JUb0ltYWdlRGF0YShibG9iKVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Converts an {@link ImageData} object into a {@link Blob} in PNG format.\n *\n * This operation is asynchronous and uses {@link OffscreenCanvas}\n * to perform the encoding, making it suitable for usage in both the main\n * thread and Web Workers.\n *\n * @param imageData - The pixel data to be encoded.\n *\n * @returns A promise that resolves to a {@link Blob} with the MIME type `image/png`.\n *\n * @throws {Error}\n * Thrown if the {@link OffscreenCanvas} context cannot be initialized or the blob\n * encoding fails.\n *\n * @example\n * ```typescript\n * const blob = await imageDataToImgBlob(imageData);\n * const url = URL.createObjectURL(blob);\n * ```\n */\nexport async function imageDataToImgBlob(imageData: ImageData): Promise<Blob> {\n const canvas = new OffscreenCanvas(imageData.width, imageData.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('could not create 2d context');\n ctx.putImageData(imageData, 0, 0);\n return canvas!.convertToBlob({\n type: 'image/png'\n });\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb252ZXJ0cyBhbiB7QGxpbmsgSW1hZ2VEYXRhfSBvYmplY3QgaW50byBhIHtAbGluayBCbG9ifSBpbiBQTkcgZm9ybWF0LlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGlzIGFzeW5jaHJvbm91cyBhbmQgdXNlcyB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfVxuICogdG8gcGVyZm9ybSB0aGUgZW5jb2RpbmcsIG1ha2luZyBpdCBzdWl0YWJsZSBmb3IgdXNhZ2UgaW4gYm90aCB0aGUgbWFpblxuICogdGhyZWFkIGFuZCBXZWIgV29ya2Vycy5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIHBpeGVsIGRhdGEgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBCbG9ifSB3aXRoIHRoZSBNSU1FIHR5cGUgYGltYWdlL3BuZ2AuXG4gKlxuICogQHRocm93cyB7RXJyb3J9XG4gKiBUaHJvd24gaWYgdGhlIHtAbGluayBPZmZzY3JlZW5DYW52YXN9IGNvbnRleHQgY2Fubm90IGJlIGluaXRpYWxpemVkIG9yIHRoZSBibG9iXG4gKiBlbmNvZGluZyBmYWlscy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYmxvYiA9IGF3YWl0IGltYWdlRGF0YVRvSW1nQmxvYihpbWFnZURhdGEpO1xuICogY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1hZ2VEYXRhVG9JbWdCbG9iKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogUHJvbWlzZTxCbG9iPiB7XG4gIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEuaGVpZ2h0KVxuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICBpZiAoIWN0eCkgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgY3JlYXRlIDJkIGNvbnRleHQnKVxuXG4gIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKVxuICByZXR1cm4gY2FudmFzIS5jb252ZXJ0VG9CbG9iKHtcbiAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcbiAgfSlcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Writes a {@link Blob} image to the system clipboard.\n *\n * @param blob - The image blob (typically `image/png`) to copy.\n * @returns A promise that resolves when the clipboard has been updated.\n */\nexport async function writeImgBlobToClipboard(blob: Blob): Promise<void> {\n const item = new ClipboardItem({\n 'image/png': blob\n });\n await navigator.clipboard.write([item]);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXcml0ZXMgYSB7QGxpbmsgQmxvYn0gaW1hZ2UgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQuXG4gKlxuICogQHBhcmFtIGJsb2IgLSBUaGUgaW1hZ2UgYmxvYiAodHlwaWNhbGx5IGBpbWFnZS9wbmdgKSB0byBjb3B5LlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2xpcGJvYXJkIGhhcyBiZWVuIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUltZ0Jsb2JUb0NsaXBib2FyZChibG9iOiBCbG9iKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGl0ZW0gPSBuZXcgQ2xpcGJvYXJkSXRlbSh7XG4gICAgJ2ltYWdlL3BuZyc6IGJsb2IsXG4gIH0pXG5cbiAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZShbaXRlbV0pXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { imageDataToImgBlob } from '../ImageData/imageDataToImgBlob';\nimport { writeImgBlobToClipboard } from './writeImgBlobToClipboard';\n\n/**\n * Converts {@link ImageData} to a PNG {@link Blob} and writes it to the system clipboard.\n * This is a high-level utility that combines {@link imageDataToImgBlob} and\n * {@link writeImgBlobToClipboard}.\n * @param imageData - The image data to copy to the clipboard.\n * @returns A promise that resolves when the image has been successfully copied.\n * @throws {Error}\n * If the conversion to blob fails or clipboard permissions are denied.\n *\n * @example\n * ```typescript\n * const canvas = document.querySelector('canvas')\n * const ctx = canvas.getContext('2d')\n * const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n * await writeImageDataToClipboard(imageData)\n * ```\n */\nexport async function writeImageDataToClipboard(imageData: ImageData): Promise<void> {\n const blob = await imageDataToImgBlob(imageData);\n return writeImgBlobToClipboard(blob);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW1hZ2VEYXRhVG9JbWdCbG9iIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvSW1nQmxvYidcbmltcG9ydCB7IHdyaXRlSW1nQmxvYlRvQ2xpcGJvYXJkIH0gZnJvbSAnLi93cml0ZUltZ0Jsb2JUb0NsaXBib2FyZCdcblxuLyoqXG4gKiBDb252ZXJ0cyB7QGxpbmsgSW1hZ2VEYXRhfSB0byBhIFBORyB7QGxpbmsgQmxvYn0gYW5kIHdyaXRlcyBpdCB0byB0aGUgc3lzdGVtIGNsaXBib2FyZC5cbiAqIFRoaXMgaXMgYSBoaWdoLWxldmVsIHV0aWxpdHkgdGhhdCBjb21iaW5lcyB7QGxpbmsgaW1hZ2VEYXRhVG9JbWdCbG9ifSBhbmRcbiAqIHtAbGluayB3cml0ZUltZ0Jsb2JUb0NsaXBib2FyZH0uXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIGltYWdlIGRhdGEgdG8gY29weSB0byB0aGUgY2xpcGJvYXJkLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaW1hZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvcGllZC5cbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogSWYgdGhlIGNvbnZlcnNpb24gdG8gYmxvYiBmYWlscyBvciBjbGlwYm9hcmQgcGVybWlzc2lvbnMgYXJlIGRlbmllZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignY2FudmFzJylcbiAqIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gKiBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodClcbiAqIGF3YWl0IHdyaXRlSW1hZ2VEYXRhVG9DbGlwYm9hcmQoaW1hZ2VEYXRhKVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YVRvQ2xpcGJvYXJkKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJsb2IgPSBhd2FpdCBpbWFnZURhdGFUb0ltZ0Jsb2IoaW1hZ2VEYXRhKVxuXG4gIHJldHVybiB3cml0ZUltZ0Jsb2JUb0NsaXBib2FyZChibG9iKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export interface HistoryAction {\n undo: () => void;\n redo: () => void;\n dispose?: () => void;\n}\nexport class HistoryManager {\n public undoStack: HistoryAction[];\n public redoStack: HistoryAction[];\n public listeners: Set<() => void>;\n constructor(public maxSteps = 50) {\n this.undoStack = [];\n this.redoStack = [];\n this.listeners = new Set();\n }\n get canUndo() {\n return this.undoStack.length > 0;\n }\n get canRedo() {\n return this.redoStack.length > 0;\n }\n subscribe(fn: () => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n notify() {\n this.listeners.forEach(fn => fn());\n }\n commit(action: HistoryAction) {\n this.undoStack.push(action);\n this.clearRedoStack();\n if (this.undoStack.length > this.maxSteps) {\n this.undoStack.shift()?.dispose?.();\n }\n this.notify();\n }\n undo() {\n let action = this.undoStack.pop();\n if (!action) return;\n this.redoStack.push(action);\n action.undo();\n this.notify();\n }\n redo() {\n let action = this.redoStack.pop();\n if (!action) return;\n this.undoStack.push(action);\n action.redo();\n this.notify();\n }\n clearRedoStack() {\n let length = this.redoStack.length;\n for (let i = 0; i < length; i++) {\n let action = this.redoStack[i];\n if (action) {\n action.dispose?.();\n }\n }\n this.redoStack.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5QWN0aW9uIHtcbiAgdW5kbzogKCkgPT4gdm9pZFxuICByZWRvOiAoKSA9PiB2b2lkXG4gIGRpc3Bvc2U/OiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBIaXN0b3J5TWFuYWdlciB7XG4gIHB1YmxpYyB1bmRvU3RhY2s6IEhpc3RvcnlBY3Rpb25bXVxuICBwdWJsaWMgcmVkb1N0YWNrOiBIaXN0b3J5QWN0aW9uW11cbiAgcHVibGljIGxpc3RlbmVyczogU2V0PCgpID0+IHZvaWQ+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1heFN0ZXBzID0gNTAsXG4gICkge1xuICAgIHRoaXMudW5kb1N0YWNrID0gW11cbiAgICB0aGlzLnJlZG9TdGFjayA9IFtdXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgU2V0KClcbiAgfVxuXG4gIGdldCBjYW5VbmRvKCkge1xuICAgIHJldHVybiB0aGlzLnVuZG9TdGFjay5sZW5ndGggPiAwXG4gIH1cblxuICBnZXQgY2FuUmVkbygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMFxuICB9XG5cbiAgc3Vic2NyaWJlKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuYWRkKGZuKVxuICAgIHJldHVybiAoKSA9PiB0aGlzLmxpc3RlbmVycy5kZWxldGUoZm4pXG4gIH1cblxuICBub3RpZnkoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpXG4gIH1cblxuICBjb21taXQoYWN0aW9uOiBIaXN0b3J5QWN0aW9uKSB7XG4gICAgdGhpcy51bmRvU3RhY2sucHVzaChhY3Rpb24pXG4gICAgdGhpcy5jbGVhclJlZG9TdGFjaygpXG5cbiAgICBpZiAodGhpcy51bmRvU3RhY2subGVuZ3RoID4gdGhpcy5tYXhTdGVwcykge1xuICAgICAgdGhpcy51bmRvU3RhY2suc2hpZnQoKT8uZGlzcG9zZT8uKClcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeSgpXG4gIH1cblxuICB1bmRvKCkge1xuICAgIGxldCBhY3Rpb24gPSB0aGlzLnVuZG9TdGFjay5wb3AoKVxuXG4gICAgaWYgKCFhY3Rpb24pIHJldHVyblxuXG4gICAgdGhpcy5yZWRvU3RhY2sucHVzaChhY3Rpb24pXG4gICAgYWN0aW9uLnVuZG8oKVxuXG4gICAgdGhpcy5ub3RpZnkoKVxuICB9XG5cbiAgcmVkbygpIHtcbiAgICBsZXQgYWN0aW9uID0gdGhpcy5yZWRvU3RhY2sucG9wKClcblxuICAgIGlmICghYWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMudW5kb1N0YWNrLnB1c2goYWN0aW9uKVxuICAgIGFjdGlvbi5yZWRvKClcblxuICAgIHRoaXMubm90aWZ5KClcbiAgfVxuXG4gIGNsZWFyUmVkb1N0YWNrKCkge1xuICAgIGxldCBsZW5ndGggPSB0aGlzLnJlZG9TdGFjay5sZW5ndGhcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhY3Rpb24gPSB0aGlzLnJlZG9TdGFja1tpXVxuXG4gICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgIGFjdGlvbi5kaXNwb3NlPy4oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVkb1N0YWNrLmxlbmd0aCA9IDBcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type PixelPatchTiles = {\n beforeTiles: PixelTile[];\n afterTiles: PixelTile[];\n};\nexport class PixelTile {\n public data32: Uint32Array;\n constructor(public id: number, public tx: number, public ty: number, tileArea: number) {\n this.data32 = new Uint32Array(tileArea);\n }\n}\nexport function applyPatchTiles(target: IPixelData, tiles: PixelTile[], tileSize: number = 256) {\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n if (!tile) continue;\n const dst = target.data32;\n const src = tile.data32;\n const dstWidth = target.width;\n const dstHeight = target.height;\n const startX = tile.tx * tileSize;\n const startY = tile.ty * tileSize;\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX));\n if (copyWidth <= 0) return;\n for (let ly = 0; ly < tileSize; ly++) {\n const globalY = startY + ly;\n\n // Stop if we go below the image\n if (globalY >= dstHeight) break;\n const dstIndex = globalY * dstWidth + startX;\n const srcIndex = ly * tileSize;\n const rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n dst.set(rowData, dstIndex);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgdHlwZSBQaXhlbFBhdGNoVGlsZXMgPSB7XG4gIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXVxuICBhZnRlclRpbGVzOiBQaXhlbFRpbGVbXVxufVxuXG5leHBvcnQgY2xhc3MgUGl4ZWxUaWxlIHtcbiAgcHVibGljIGRhdGEzMjogVWludDMyQXJyYXlcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaWQ6IG51bWJlcixcbiAgICBwdWJsaWMgdHg6IG51bWJlcixcbiAgICBwdWJsaWMgdHk6IG51bWJlcixcbiAgICB0aWxlQXJlYTogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLmRhdGEzMiA9IG5ldyBVaW50MzJBcnJheSh0aWxlQXJlYSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXRjaFRpbGVzKHRhcmdldDogSVBpeGVsRGF0YSwgdGlsZXM6IFBpeGVsVGlsZVtdLCB0aWxlU2l6ZTogbnVtYmVyID0gMjU2KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aWxlID0gdGlsZXNbaV1cblxuICAgIGlmICghdGlsZSkgY29udGludWVcblxuICAgIGNvbnN0IGRzdCA9IHRhcmdldC5kYXRhMzJcbiAgICBjb25zdCBzcmMgPSB0aWxlLmRhdGEzMlxuICAgIGNvbnN0IGRzdFdpZHRoID0gdGFyZ2V0LndpZHRoXG4gICAgY29uc3QgZHN0SGVpZ2h0ID0gdGFyZ2V0LmhlaWdodFxuICAgIGNvbnN0IHN0YXJ0WCA9IHRpbGUudHggKiB0aWxlU2l6ZVxuICAgIGNvbnN0IHN0YXJ0WSA9IHRpbGUudHkgKiB0aWxlU2l6ZVxuXG4gICAgLy8gQ2FsY3VsYXRlIGNsYW1waW5nIHRvIHByZXZlbnQgd3JhcHBpbmcgYXJ0aWZhY3RzIG9uIGltYWdlIGVkZ2VzXG4gICAgY29uc3QgY29weVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGlsZVNpemUsIGRzdFdpZHRoIC0gc3RhcnRYKSlcblxuICAgIGlmIChjb3B5V2lkdGggPD0gMCkgcmV0dXJuXG5cbiAgICBmb3IgKGxldCBseSA9IDA7IGx5IDwgdGlsZVNpemU7IGx5KyspIHtcbiAgICAgIGNvbnN0IGdsb2JhbFkgPSBzdGFydFkgKyBseVxuXG4gICAgICAvLyBTdG9wIGlmIHdlIGdvIGJlbG93IHRoZSBpbWFnZVxuICAgICAgaWYgKGdsb2JhbFkgPj0gZHN0SGVpZ2h0KSBicmVha1xuXG4gICAgICBjb25zdCBkc3RJbmRleCA9IGdsb2JhbFkgKiBkc3RXaWR0aCArIHN0YXJ0WFxuICAgICAgY29uc3Qgc3JjSW5kZXggPSBseSAqIHRpbGVTaXplXG4gICAgICBjb25zdCByb3dEYXRhID0gc3JjLnN1YmFycmF5KHNyY0luZGV4LCBzcmNJbmRleCArIGNvcHlXaWR0aClcblxuICAgICAgZHN0LnNldChyb3dEYXRhLCBkc3RJbmRleClcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { PixelTile } from './PixelPatchTiles';\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[];\n public beforeTiles: PixelTile[];\n public pool: PixelTile[];\n constructor(public target: IPixelData, readonly config: PixelEngineConfig) {\n this.lookup = [];\n this.beforeTiles = [];\n this.pool = [];\n }\n getTile(id: number, tx: number, ty: number): PixelTile {\n let tile = this.pool.pop();\n if (tile) {\n tile.id = id;\n tile.tx = tx;\n tile.ty = ty;\n return tile;\n }\n return new PixelTile(id, tx, ty, this.config.tileArea);\n }\n recyclePatch(patch: PixelPatchTiles) {\n const before = patch.beforeTiles;\n for (let i = 0; i < before.length; i++) {\n let tile = before[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n const after = patch.afterTiles;\n for (let i = 0; i < after.length; i++) {\n let tile = after[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storeTileBeforeState(x: number, y: number): void {\n let target = this.target;\n let shift = this.config.tileShift;\n let columns = target.width + this.config.tileMask >> shift;\n let tx = x >> shift;\n let ty = y >> shift;\n let id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n\n /**\n *\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n * @param w pixel width\n * @param h pixel height\n */\n storeRegionBeforeState(x: number, y: number, w: number, h: number) {\n let target = this.target;\n let shift = this.config.tileShift;\n let columns = target.width + this.config.tileMask >> shift;\n let startX = x >> shift;\n let startY = y >> shift;\n let endX = x + w - 1 >> shift;\n let endY = y + h - 1 >> shift;\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n let id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n }\n }\n extractState(tile: PixelTile) {\n let target = this.target;\n let TILE_SIZE = this.config.tileSize;\n let dst = tile.data32;\n let src = target.data32;\n let startX = tile.tx * TILE_SIZE;\n let startY = tile.ty * TILE_SIZE;\n let targetWidth = target.width;\n let targetHeight = target.height;\n let copyWidth = Math.max(0, Math.min(TILE_SIZE, targetWidth - startX));\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly;\n let dstIndex = ly * TILE_SIZE;\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE);\n continue;\n }\n let srcIndex = globalY * targetWidth + startX;\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n dst.set(rowData, dstIndex);\n if (copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + copyWidth, dstIndex + TILE_SIZE);\n }\n }\n }\n extractAfterTiles(): PixelTile[] {\n let afterTiles: PixelTile[] = [];\n let length = this.beforeTiles.length;\n for (let i = 0; i < length; i++) {\n let beforeTile = this.beforeTiles[i];\n if (beforeTile) {\n let afterTile = this.getTile(beforeTile.id, beforeTile.tx, beforeTile.ty);\n this.extractState(afterTile);\n afterTiles.push(afterTile);\n }\n }\n return afterTiles;\n }\n reset() {\n this.lookup = [];\n this.beforeTiles = [];\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vUGl4ZWxFbmdpbmVDb25maWcnXG5pbXBvcnQgeyB0eXBlIFBpeGVsUGF0Y2hUaWxlcywgUGl4ZWxUaWxlIH0gZnJvbSAnLi9QaXhlbFBhdGNoVGlsZXMnXG5cbmV4cG9ydCBjbGFzcyBQaXhlbEFjY3VtdWxhdG9yIHtcbiAgcHVibGljIGxvb2t1cDogKFBpeGVsVGlsZSB8IHVuZGVmaW5lZClbXVxuICBwdWJsaWMgYmVmb3JlVGlsZXM6IFBpeGVsVGlsZVtdXG4gIHB1YmxpYyBwb29sOiBQaXhlbFRpbGVbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0YXJnZXQ6IElQaXhlbERhdGEsXG4gICAgcmVhZG9ubHkgY29uZmlnOiBQaXhlbEVuZ2luZUNvbmZpZyxcbiAgKSB7XG4gICAgdGhpcy5sb29rdXAgPSBbXVxuICAgIHRoaXMuYmVmb3JlVGlsZXMgPSBbXVxuICAgIHRoaXMucG9vbCA9IFtdXG4gIH1cblxuICBnZXRUaWxlKFxuICAgIGlkOiBudW1iZXIsXG4gICAgdHg6IG51bWJlcixcbiAgICB0eTogbnVtYmVyLFxuICApOiBQaXhlbFRpbGUge1xuICAgIGxldCB0aWxlID0gdGhpcy5wb29sLnBvcCgpXG5cbiAgICBpZiAodGlsZSkge1xuICAgICAgdGlsZS5pZCA9IGlkXG4gICAgICB0aWxlLnR4ID0gdHhcbiAgICAgIHRpbGUudHkgPSB0eVxuXG4gICAgICByZXR1cm4gdGlsZVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGl4ZWxUaWxlKFxuICAgICAgaWQsXG4gICAgICB0eCxcbiAgICAgIHR5LFxuICAgICAgdGhpcy5jb25maWcudGlsZUFyZWEsXG4gICAgKVxuICB9XG5cbiAgcmVjeWNsZVBhdGNoKHBhdGNoOiBQaXhlbFBhdGNoVGlsZXMpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBwYXRjaC5iZWZvcmVUaWxlc1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiZWZvcmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB0aWxlID0gYmVmb3JlW2ldXG5cbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWZ0ZXIgPSBwYXRjaC5hZnRlclRpbGVzXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFmdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdGlsZSA9IGFmdGVyW2ldXG5cbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB4IHBpeGVsIHggY29vcmRpbmF0ZVxuICAgKiBAcGFyYW0geSBwaXhlbCB5IGNvb3JkaW5hdGVcbiAgICovXG4gIHN0b3JlVGlsZUJlZm9yZVN0YXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0XG4gICAgbGV0IHNoaWZ0ID0gdGhpcy5jb25maWcudGlsZVNoaWZ0XG4gICAgbGV0IGNvbHVtbnMgPSAodGFyZ2V0LndpZHRoICsgdGhpcy5jb25maWcudGlsZU1hc2spID4+IHNoaWZ0XG4gICAgbGV0IHR4ID0geCA+PiBzaGlmdFxuICAgIGxldCB0eSA9IHkgPj4gc2hpZnRcbiAgICBsZXQgaWQgPSB0eSAqIGNvbHVtbnMgKyB0eFxuXG4gICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cblxuICAgIGlmICghdGlsZSkge1xuICAgICAgdGlsZSA9IHRoaXMuZ2V0VGlsZShcbiAgICAgICAgaWQsXG4gICAgICAgIHR4LFxuICAgICAgICB0eSxcbiAgICAgIClcblxuICAgICAgdGhpcy5leHRyYWN0U3RhdGUodGlsZSlcbiAgICAgIHRoaXMubG9va3VwW2lkXSA9IHRpbGVcbiAgICAgIHRoaXMuYmVmb3JlVGlsZXMucHVzaCh0aWxlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geCBwaXhlbCB4IGNvb3JkaW5hdGVcbiAgICogQHBhcmFtIHkgcGl4ZWwgeSBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB3IHBpeGVsIHdpZHRoXG4gICAqIEBwYXJhbSBoIHBpeGVsIGhlaWdodFxuICAgKi9cbiAgc3RvcmVSZWdpb25CZWZvcmVTdGF0ZShcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHc6IG51bWJlcixcbiAgICBoOiBudW1iZXIsXG4gICkge1xuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGxldCBzaGlmdCA9IHRoaXMuY29uZmlnLnRpbGVTaGlmdFxuICAgIGxldCBjb2x1bW5zID0gKHRhcmdldC53aWR0aCArIHRoaXMuY29uZmlnLnRpbGVNYXNrKSA+PiBzaGlmdFxuXG4gICAgbGV0IHN0YXJ0WCA9IHggPj4gc2hpZnRcbiAgICBsZXQgc3RhcnRZID0geSA+PiBzaGlmdFxuICAgIGxldCBlbmRYID0gKHggKyB3IC0gMSkgPj4gc2hpZnRcbiAgICBsZXQgZW5kWSA9ICh5ICsgaCAtIDEpID4+IHNoaWZ0XG5cbiAgICBmb3IgKGxldCB0eSA9IHN0YXJ0WTsgdHkgPD0gZW5kWTsgdHkrKykge1xuICAgICAgZm9yIChsZXQgdHggPSBzdGFydFg7IHR4IDw9IGVuZFg7IHR4KyspIHtcbiAgICAgICAgbGV0IGlkID0gdHkgKiBjb2x1bW5zICsgdHhcbiAgICAgICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICB0aWxlID0gdGhpcy5nZXRUaWxlKFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB0eCxcbiAgICAgICAgICAgIHR5LFxuICAgICAgICAgIClcblxuICAgICAgICAgIHRoaXMuZXh0cmFjdFN0YXRlKHRpbGUpXG4gICAgICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZVxuICAgICAgICAgIHRoaXMuYmVmb3JlVGlsZXMucHVzaCh0aWxlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXh0cmFjdFN0YXRlKHRpbGU6IFBpeGVsVGlsZSkge1xuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGxldCBUSUxFX1NJWkUgPSB0aGlzLmNvbmZpZy50aWxlU2l6ZVxuICAgIGxldCBkc3QgPSB0aWxlLmRhdGEzMlxuICAgIGxldCBzcmMgPSB0YXJnZXQuZGF0YTMyXG4gICAgbGV0IHN0YXJ0WCA9IHRpbGUudHggKiBUSUxFX1NJWkVcbiAgICBsZXQgc3RhcnRZID0gdGlsZS50eSAqIFRJTEVfU0laRVxuICAgIGxldCB0YXJnZXRXaWR0aCA9IHRhcmdldC53aWR0aFxuICAgIGxldCB0YXJnZXRIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0XG5cbiAgICBsZXQgY29weVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oVElMRV9TSVpFLCB0YXJnZXRXaWR0aCAtIHN0YXJ0WCkpXG5cbiAgICBmb3IgKGxldCBseSA9IDA7IGx5IDwgVElMRV9TSVpFOyBseSsrKSB7XG4gICAgICBsZXQgZ2xvYmFsWSA9IHN0YXJ0WSArIGx5XG4gICAgICBsZXQgZHN0SW5kZXggPSBseSAqIFRJTEVfU0laRVxuXG4gICAgICBpZiAoZ2xvYmFsWSA8IDAgfHwgZ2xvYmFsWSA+PSB0YXJnZXRIZWlnaHQgfHwgY29weVdpZHRoID09PSAwKSB7XG4gICAgICAgIGRzdC5maWxsKDAsIGRzdEluZGV4LCBkc3RJbmRleCArIFRJTEVfU0laRSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IHNyY0luZGV4ID0gZ2xvYmFsWSAqIHRhcmdldFdpZHRoICsgc3RhcnRYXG4gICAgICBsZXQgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpXG5cbiAgICAgIGRzdC5zZXQocm93RGF0YSwgZHN0SW5kZXgpXG5cbiAgICAgIGlmIChjb3B5V2lkdGggPCBUSUxFX1NJWkUpIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXggKyBjb3B5V2lkdGgsIGRzdEluZGV4ICsgVElMRV9TSVpFKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4dHJhY3RBZnRlclRpbGVzKCk6IFBpeGVsVGlsZVtdIHtcbiAgICBsZXQgYWZ0ZXJUaWxlczogUGl4ZWxUaWxlW10gPSBbXVxuICAgIGxldCBsZW5ndGggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGJlZm9yZVRpbGUgPSB0aGlzLmJlZm9yZVRpbGVzW2ldXG5cbiAgICAgIGlmIChiZWZvcmVUaWxlKSB7XG4gICAgICAgIGxldCBhZnRlclRpbGUgPSB0aGlzLmdldFRpbGUoXG4gICAgICAgICAgYmVmb3JlVGlsZS5pZCxcbiAgICAgICAgICBiZWZvcmVUaWxlLnR4LFxuICAgICAgICAgIGJlZm9yZVRpbGUudHksXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmV4dHJhY3RTdGF0ZShhZnRlclRpbGUpXG4gICAgICAgIGFmdGVyVGlsZXMucHVzaChhZnRlclRpbGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFmdGVyVGlsZXNcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMubG9va3VwID0gW11cbiAgICB0aGlzLmJlZm9yZVRpbGVzID0gW11cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export class PixelEngineConfig {\n public readonly tileSize: number;\n public readonly tileShift: number;\n public readonly tileMask: number;\n public readonly tileArea: number;\n constructor(tileSize: number = 256) {\n // Ensure it's a power of 2 to guarantee bitwise math works\n if ((tileSize & tileSize - 1) !== 0) {\n throw new Error('tileSize must be a power of 2');\n }\n this.tileSize = tileSize;\n this.tileShift = Math.log2(tileSize);\n this.tileMask = tileSize - 1;\n this.tileArea = tileSize * tileSize;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFBpeGVsRW5naW5lQ29uZmlnIHtcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVTaXplOiBudW1iZXJcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVTaGlmdDogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSB0aWxlTWFzazogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSB0aWxlQXJlYTogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IodGlsZVNpemU6IG51bWJlciA9IDI1Nikge1xuICAgIC8vIEVuc3VyZSBpdCdzIGEgcG93ZXIgb2YgMiB0byBndWFyYW50ZWUgYml0d2lzZSBtYXRoIHdvcmtzXG4gICAgaWYgKCh0aWxlU2l6ZSAmICh0aWxlU2l6ZSAtIDEpKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlU2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMicpXG4gICAgfVxuXG4gICAgdGhpcy50aWxlU2l6ZSA9IHRpbGVTaXplXG4gICAgdGhpcy50aWxlU2hpZnQgPSBNYXRoLmxvZzIodGlsZVNpemUpXG4gICAgdGhpcy50aWxlTWFzayA9IHRpbGVTaXplIC0gMVxuICAgIHRoaXMudGlsZUFyZWEgPSB0aWxlU2l6ZSAqIHRpbGVTaXplXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n */\nexport function applyAlphaMaskToPixelData(dst: IPixelData, mask: AlphaMask, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n\n // 1. Initial Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dst.width - x);\n h = Math.min(h, dst.height - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Determine Source Dimensions\n const mPitch = mask.w;\n if (mPitch <= 0) return;\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(mPitch, startX + w);\n const sY1 = Math.min(mask.h, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n\n // This is where your failing tests are now caught\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dst32 = dst.data32;\n const dw = dst.width;\n const dStride = dw - finalW;\n const mStride = mPitch - finalW;\n const maskData = mask.data;\n let dIdx = (y + yShift) * dw + (x + xShift);\n let mIdx = sY0 * mPitch + sX0;\n for (let iy = 0; iy < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const mVal = maskData[mIdx];\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - mVal : mVal;\n let weight = 0;\n if (effectiveM === 0) {\n weight = 0;\n } else if (effectiveM === 255) {\n weight = globalAlpha;\n } else if (globalAlpha === 255) {\n weight = effectiveM;\n } else {\n weight = effectiveM * globalAlpha + 128 >> 8;\n }\n if (weight === 0) {\n // Clear alpha channel\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0;\n } else if (weight !== 255) {\n // Merge alpha channel\n const d = dst32[dIdx];\n const da = d >>> 24;\n if (da !== 0) {\n const finalAlpha = da === 255 ? weight : da * weight + 128 >> 8;\n dst32[dIdx] = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5cbi8qKlxuICogRGlyZWN0bHkgYXBwbGllcyBhIG1hc2sgdG8gYSByZWdpb24gb2YgUGl4ZWxEYXRhLFxuICogbW9kaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbidzIGFscGhhIGNoYW5uZWwgaW4tcGxhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIG1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuXG5cbiAgLy8gMS4gSW5pdGlhbCBEZXN0aW5hdGlvbiBDbGlwcGluZ1xuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG5cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIHcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBoID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKHcgPD0gMCkgcmV0dXJuXG4gIGlmIChoIDw9IDApIHJldHVyblxuXG4gIC8vIDIuIERldGVybWluZSBTb3VyY2UgRGltZW5zaW9uc1xuICBjb25zdCBtUGl0Y2ggPSBtYXNrLndcbiAgaWYgKG1QaXRjaCA8PSAwKSByZXR1cm5cblxuICAvLyAzLiBTb3VyY2UgQm91bmRzIENsaXBwaW5nXG4gIC8vIENhbGN1bGF0ZSB3aGVyZSB3ZSB3b3VsZCBzdGFydCByZWFkaW5nIGluIHRoZSBtYXNrXG4gIGNvbnN0IHN0YXJ0WCA9IG14ICsgKHggLSB0YXJnZXRYKVxuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSlcblxuICAvLyBGaW5kIHRoZSBzYWZlIG92ZXJsYXAgYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBhbmQgdGhlIG1hc2sgYm91bmRzXG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WClcbiAgY29uc3Qgc1kwID0gTWF0aC5tYXgoMCwgc3RhcnRZKVxuICBjb25zdCBzWDEgPSBNYXRoLm1pbihtUGl0Y2gsIHN0YXJ0WCArIHcpXG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKG1hc2suaCwgc3RhcnRZICsgaClcblxuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDBcbiAgY29uc3QgZmluYWxIID0gc1kxIC0gc1kwXG5cbiAgLy8gVGhpcyBpcyB3aGVyZSB5b3VyIGZhaWxpbmcgdGVzdHMgYXJlIG5vdyBjYXVnaHRcbiAgaWYgKGZpbmFsVyA8PSAwKSByZXR1cm5cbiAgaWYgKGZpbmFsSCA8PSAwKSByZXR1cm5cblxuICAvLyA0LiBBbGlnbiBEZXN0aW5hdGlvbiB3aXRoIFNvdXJjZSBDbGlwcGluZ1xuICAvLyBJZiB0aGUgc291cmNlIHdhcyBjbGlwcGVkIG9uIHRoZSB0b3AvbGVmdCwgd2UgbXVzdCBzaGlmdCB0aGUgZGVzdGluYXRpb24gc3RhcnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYXG4gIGNvbnN0IHlTaGlmdCA9IHNZMCAtIHN0YXJ0WVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBkU3RyaWRlID0gZHcgLSBmaW5hbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGZpbmFsV1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gIGxldCBkSWR4ID0gKHkgKyB5U2hpZnQpICogZHcgKyAoeCArIHhTaGlmdClcbiAgbGV0IG1JZHggPSBzWTAgKiBtUGl0Y2ggKyBzWDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgaDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCB3OyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF1cbiAgICAgIC8vIFVuaWZpZWQgbG9naWMgYnJhbmNoIGluc2lkZSB0aGUgaG90IHBhdGhcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgbGV0IHdlaWdodCA9IDBcblxuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMFxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVNID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcbiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEgPT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZlY3RpdmVNXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3ZWlnaHQgPSAoZWZmZWN0aXZlTSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICB9XG5cbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxwaGEgY2hhbm5lbFxuICAgICAgICBkc3QzMltkSWR4XSA9IChkc3QzMltkSWR4XSAmIDB4MDBmZmZmZmYpID4+PiAwXG4gICAgICB9IGVsc2UgaWYgKHdlaWdodCAhPT0gMjU1KSB7XG4gICAgICAgIC8vIE1lcmdlIGFscGhhIGNoYW5uZWxcbiAgICAgICAgY29uc3QgZCA9IGRzdDMyW2RJZHhdXG4gICAgICAgIGNvbnN0IGRhID0gZCA+Pj4gMjRcblxuICAgICAgICBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICBjb25zdCBmaW5hbEFscGhhID0gZGEgPT09IDI1NSA/IHdlaWdodCA6IChkYSAqIHdlaWdodCArIDEyOCkgPj4gOFxuICAgICAgICAgIGRzdDMyW2RJZHhdID0gKChkICYgMHgwMGZmZmZmZikgfCAoZmluYWxBbHBoYSA8PCAyNCkpID4+PiAwXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type HistoryMutator } from '../../_types';\nimport { applyAlphaMaskToPixelData } from '../../PixelData/applyAlphaMaskToPixelData';\nconst defaults = {\n applyAlphaMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyAlphaMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyAlphaMaskToPixelData = defaults.applyAlphaMaskToPixelData\n } = deps;\n return {\n applyAlphaMask: (mask: AlphaMask, opts: ApplyMaskToPixelDataOptions = {}) => {\n let target = writer.target;\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyAlphaMaskToPixelData(target, mask, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5QWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseUFscGhhTWFzazogKG1hc2s6IEFscGhhTWFzaywgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30pID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSB3cml0ZXIudGFyZ2V0XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cylcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n */\nexport function applyBinaryMaskToPixelData(dst: IPixelData, mask: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n\n // 1. Initial Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dst.width - x);\n h = Math.min(h, dst.height - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Determine Source Dimensions\n const mPitch = mask.w;\n if (mPitch <= 0) return;\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(mPitch, startX + w);\n const sY1 = Math.min(mask.h, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n\n // This is where your failing tests are now caught\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dst32 = dst.data32;\n const dw = dst.width;\n const dStride = dw - finalW;\n const mStride = mPitch - finalW;\n const maskData = mask.data;\n let dIdx = (y + yShift) * dw + (x + xShift);\n let mIdx = sY0 * mPitch + sX0;\n for (let iy = 0; iy < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const mVal = maskData[mIdx];\n // Consistently determines if this pixel should be \"masked out\" (cleared)\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n // Clear alpha channel only (keep RGB)\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0;\n } else if (globalAlpha !== 255) {\n const d = dst32[dIdx];\n const da = d >>> 24;\n\n // If pixel isn't already fully transparent, apply global alpha\n if (da !== 0) {\n const finalAlpha = da === 255 ? globalAlpha : da * globalAlpha + 128 >> 8;\n dst32[dIdx] = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuXG5cbiAgLy8gMS4gSW5pdGlhbCBEZXN0aW5hdGlvbiBDbGlwcGluZ1xuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG5cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIHcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBoID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKHcgPD0gMCkgcmV0dXJuXG4gIGlmIChoIDw9IDApIHJldHVyblxuXG4gIC8vIDIuIERldGVybWluZSBTb3VyY2UgRGltZW5zaW9uc1xuICBjb25zdCBtUGl0Y2ggPSBtYXNrLndcbiAgaWYgKG1QaXRjaCA8PSAwKSByZXR1cm5cblxuICAvLyAzLiBTb3VyY2UgQm91bmRzIENsaXBwaW5nXG4gIC8vIENhbGN1bGF0ZSB3aGVyZSB3ZSB3b3VsZCBzdGFydCByZWFkaW5nIGluIHRoZSBtYXNrXG4gIGNvbnN0IHN0YXJ0WCA9IG14ICsgKHggLSB0YXJnZXRYKVxuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSlcblxuICAvLyBGaW5kIHRoZSBzYWZlIG92ZXJsYXAgYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBhbmQgdGhlIG1hc2sgYm91bmRzXG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WClcbiAgY29uc3Qgc1kwID0gTWF0aC5tYXgoMCwgc3RhcnRZKVxuICBjb25zdCBzWDEgPSBNYXRoLm1pbihtUGl0Y2gsIHN0YXJ0WCArIHcpXG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKG1hc2suaCwgc3RhcnRZICsgaClcblxuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDBcbiAgY29uc3QgZmluYWxIID0gc1kxIC0gc1kwXG5cbiAgLy8gVGhpcyBpcyB3aGVyZSB5b3VyIGZhaWxpbmcgdGVzdHMgYXJlIG5vdyBjYXVnaHRcbiAgaWYgKGZpbmFsVyA8PSAwKSByZXR1cm5cbiAgaWYgKGZpbmFsSCA8PSAwKSByZXR1cm5cblxuICAvLyA0LiBBbGlnbiBEZXN0aW5hdGlvbiB3aXRoIFNvdXJjZSBDbGlwcGluZ1xuICAvLyBJZiB0aGUgc291cmNlIHdhcyBjbGlwcGVkIG9uIHRoZSB0b3AvbGVmdCwgd2UgbXVzdCBzaGlmdCB0aGUgZGVzdGluYXRpb24gc3RhcnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYXG4gIGNvbnN0IHlTaGlmdCA9IHNZMCAtIHN0YXJ0WVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBkU3RyaWRlID0gZHcgLSBmaW5hbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGZpbmFsV1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gIGxldCBkSWR4ID0gKHkgKyB5U2hpZnQpICogZHcgKyAoeCArIHhTaGlmdClcbiAgbGV0IG1JZHggPSBzWTAgKiBtUGl0Y2ggKyBzWDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgaDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCB3OyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF1cbiAgICAgIC8vIENvbnNpc3RlbnRseSBkZXRlcm1pbmVzIGlmIHRoaXMgcGl4ZWwgc2hvdWxkIGJlIFwibWFza2VkIG91dFwiIChjbGVhcmVkKVxuICAgICAgY29uc3QgaXNNYXNrZWRPdXQgPSBpbnZlcnRNYXNrID8gbVZhbCAhPT0gMCA6IG1WYWwgPT09IDBcblxuICAgICAgaWYgKGlzTWFza2VkT3V0KSB7XG4gICAgICAgIC8vIENsZWFyIGFscGhhIGNoYW5uZWwgb25seSAoa2VlcCBSR0IpXG4gICAgICAgIGRzdDMyW2RJZHhdID0gKGRzdDMyW2RJZHhdICYgMHgwMGZmZmZmZikgPj4+IDBcbiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEgIT09IDI1NSkge1xuICAgICAgICBjb25zdCBkID0gZHN0MzJbZElkeF1cbiAgICAgICAgY29uc3QgZGEgPSBkID4+PiAyNFxuXG4gICAgICAgIC8vIElmIHBpeGVsIGlzbid0IGFscmVhZHkgZnVsbHkgdHJhbnNwYXJlbnQsIGFwcGx5IGdsb2JhbCBhbHBoYVxuICAgICAgICBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICBjb25zdCBmaW5hbEFscGhhID0gZGEgPT09IDI1NSA/IGdsb2JhbEFscGhhIDogKGRhICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgICAgICBkc3QzMltkSWR4XSA9ICgoZCAmIDB4MDBmZmZmZmYpIHwgKGZpbmFsQWxwaGEgPDwgMjQpKSA+Pj4gMFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgbUlkeCsrXG4gICAgfVxuXG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type HistoryMutator } from '../../_types';\nimport { applyBinaryMaskToPixelData } from '../../PixelData/applyBinaryMaskToPixelData';\nconst defaults = {\n applyBinaryMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyBinaryMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyBinaryMaskToPixelData = defaults.applyBinaryMaskToPixelData\n } = deps;\n return {\n applyBinaryMask: (mask: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}) => {\n let target = writer.target;\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyBinaryMaskToPixelData(target, mask, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYXBwbHlCaW5hcnlNYXNrOiAobWFzazogQmluYXJ5TWFzaywgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30pID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSB3cml0ZXIudGFyZ2V0XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSh0YXJnZXQsIG1hc2ssIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function getCircleBrushOrPencilBounds(centerX: number, centerY: number, brushSize: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const r = brushSize / 2;\n const minOffset = -Math.ceil(r - 0.5);\n const maxOffset = Math.floor(r - 0.5);\n\n // start is inclusive, end is exclusive\n const startX = Math.floor(centerX + minOffset);\n const startY = Math.floor(centerY + minOffset);\n const endX = Math.floor(centerX + maxOffset) + 1;\n const endY = Math.floor(centerY + maxOffset) + 1;\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const cStartX = Math.max(0, startX);\n const cStartY = Math.max(0, startY);\n const cEndX = Math.min(targetWidth, endX);\n const cEndY = Math.min(targetHeight, endY);\n const w = cEndX - cStartX;\n const h = cEndY - cStartY;\n res.x = cStartX;\n res.y = cStartY;\n res.w = w < 0 ? 0 : w;\n res.h = h < 0 ? 0 : h;\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyhcbiAgY2VudGVyWDogbnVtYmVyLFxuICBjZW50ZXJZOiBudW1iZXIsXG4gIGJydXNoU2l6ZTogbnVtYmVyLFxuICB0YXJnZXRXaWR0aDogbnVtYmVyLFxuICB0YXJnZXRIZWlnaHQ6IG51bWJlcixcbiAgb3V0PzogUmVjdCxcbik6IFJlY3Qge1xuICBjb25zdCByID0gYnJ1c2hTaXplIC8gMlxuXG4gIGNvbnN0IG1pbk9mZnNldCA9IC1NYXRoLmNlaWwociAtIDAuNSlcbiAgY29uc3QgbWF4T2Zmc2V0ID0gTWF0aC5mbG9vcihyIC0gMC41KVxuXG4gIC8vIHN0YXJ0IGlzIGluY2x1c2l2ZSwgZW5kIGlzIGV4Y2x1c2l2ZVxuICBjb25zdCBzdGFydFggPSBNYXRoLmZsb29yKGNlbnRlclggKyBtaW5PZmZzZXQpXG4gIGNvbnN0IHN0YXJ0WSA9IE1hdGguZmxvb3IoY2VudGVyWSArIG1pbk9mZnNldClcbiAgY29uc3QgZW5kWCA9IE1hdGguZmxvb3IoY2VudGVyWCArIG1heE9mZnNldCkgKyAxXG4gIGNvbnN0IGVuZFkgPSBNYXRoLmZsb29yKGNlbnRlclkgKyBtYXhPZmZzZXQpICsgMVxuXG4gIGNvbnN0IHJlcyA9IG91dCA/PyB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNTdGFydFggPSBNYXRoLm1heCgwLCBzdGFydFgpXG4gIGNvbnN0IGNTdGFydFkgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IGNFbmRYID0gTWF0aC5taW4odGFyZ2V0V2lkdGgsIGVuZFgpXG4gIGNvbnN0IGNFbmRZID0gTWF0aC5taW4odGFyZ2V0SGVpZ2h0LCBlbmRZKVxuXG4gIGNvbnN0IHcgPSBjRW5kWCAtIGNTdGFydFhcbiAgY29uc3QgaCA9IGNFbmRZIC0gY1N0YXJ0WVxuXG4gIHJlcy54ID0gY1N0YXJ0WFxuICByZXMueSA9IGNTdGFydFlcbiAgcmVzLncgPSB3IDwgMCA/IDAgOiB3XG4gIHJlcy5oID0gaCA8IDAgPyAwIDogaFxuXG4gIHJldHVybiByZXNcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blends a solid color into a target pixel buffer using an alpha mask.\n *\n * @remarks\n * If the width (`w`) or height (`h`) are omitted from the options, they will safely\n * default to the dimensions of the provided mask to prevent out-of-bounds memory access.\n *\n * @param dst - The destination {@link IPixelData} buffer to modify.\n * @param color - The solid color to apply.\n * @param mask - The mask defining the per-pixel opacity of the target area.\n * @param opts - Configuration options including placement coordinates, bounds, global alpha, and mask offsets.\n */\nexport function blendColorPixelDataAlphaMask(dst: IPixelData, color: Color32, mask: AlphaMask, opts: ColorBlendMaskOptions = {}): void {\n const targetX = opts.x ?? 0;\n const targetY = opts.y ?? 0;\n const w = opts.w ?? mask.w;\n const h = opts.h ?? mask.h;\n const globalAlpha = opts.alpha ?? 255;\n const blendFn = opts.blendFn ?? sourceOverPerfect;\n const mx = opts.mx ?? 0;\n const my = opts.my ?? 0;\n const invertMask = opts.invertMask ?? false;\n if (globalAlpha === 0) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n let x = targetX;\n let y = targetY;\n let actualW = w;\n let actualH = h;\n if (x < 0) {\n actualW += x;\n x = 0;\n }\n if (y < 0) {\n actualH += y;\n y = 0;\n }\n actualW = Math.min(actualW, dst.width - x);\n actualH = Math.min(actualH, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mask.w;\n const maskData = mask.data;\n let dIdx = y * dw + x | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n let mStride = mPitch - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const colorRGB = color & 0x00ffffff;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = maskData[mIdx];\n const effM = invertMask ? 255 - mVal : mVal;\n if (effM === 0) {\n dIdx++;\n mIdx++;\n continue;\n }\n let weight = globalAlpha;\n if (isOpaque) {\n weight = effM;\n } else if (effM !== 255) {\n weight = effM * globalAlpha + 128 >> 8;\n }\n if (weight === 0) {\n dIdx++;\n mIdx++;\n continue;\n }\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n mIdx++;\n continue;\n }\n finalCol = (colorRGB | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIENvbG9yMzIsIENvbG9yQmxlbmRNYXNrT3B0aW9ucywgSVBpeGVsRGF0YSB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG4vKipcbiAqIEJsZW5kcyBhIHNvbGlkIGNvbG9yIGludG8gYSB0YXJnZXQgcGl4ZWwgYnVmZmVyIHVzaW5nIGFuIGFscGhhIG1hc2suXG4gKlxuICogQHJlbWFya3NcbiAqIElmIHRoZSB3aWR0aCAoYHdgKSBvciBoZWlnaHQgKGBoYCkgYXJlIG9taXR0ZWQgZnJvbSB0aGUgb3B0aW9ucywgdGhleSB3aWxsIHNhZmVseVxuICogZGVmYXVsdCB0byB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcHJvdmlkZWQgbWFzayB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzcy5cbiAqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIGRlc3RpbmF0aW9uIHtAbGluayBJUGl4ZWxEYXRhfSBidWZmZXIgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIHNvbGlkIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIG1hc2sgLSBUaGUgbWFzayBkZWZpbmluZyB0aGUgcGVyLXBpeGVsIG9wYWNpdHkgb2YgdGhlIHRhcmdldCBhcmVhLlxuICogQHBhcmFtIG9wdHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHBsYWNlbWVudCBjb29yZGluYXRlcywgYm91bmRzLCBnbG9iYWwgYWxwaGEsIGFuZCBtYXNrIG9mZnNldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICBtYXNrOiBBbHBoYU1hc2ssXG4gIG9wdHM6IENvbG9yQmxlbmRNYXNrT3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzLnggPz8gMFxuICBjb25zdCB0YXJnZXRZID0gb3B0cy55ID8/IDBcbiAgY29uc3QgdyA9IG9wdHMudyA/PyBtYXNrLndcbiAgY29uc3QgaCA9IG9wdHMuaCA/PyBtYXNrLmhcbiAgY29uc3QgZ2xvYmFsQWxwaGEgPSBvcHRzLmFscGhhID8/IDI1NVxuICBjb25zdCBibGVuZEZuID0gb3B0cy5ibGVuZEZuID8/IHNvdXJjZU92ZXJQZXJmZWN0XG4gIGNvbnN0IG14ID0gb3B0cy5teCA/PyAwXG4gIGNvbnN0IG15ID0gb3B0cy5teSA/PyAwXG4gIGNvbnN0IGludmVydE1hc2sgPSBvcHRzLmludmVydE1hc2sgPz8gZmFsc2VcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVyblxuXG4gIGNvbnN0IGJhc2VTcmNBbHBoYSA9IChjb2xvciA+Pj4gMjQpXG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gKGJsZW5kRm4gYXMgYW55KS5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuXG4gIGlmIChiYXNlU3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm5cblxuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCBhY3R1YWxXID0gd1xuICBsZXQgYWN0dWFsSCA9IGhcblxuICBpZiAoeCA8IDApIHtcbiAgICBhY3R1YWxXICs9IHhcbiAgICB4ID0gMFxuICB9XG5cbiAgaWYgKHkgPCAwKSB7XG4gICAgYWN0dWFsSCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGFjdHVhbFcgPSBNYXRoLm1pbihhY3R1YWxXLCBkc3Qud2lkdGggLSB4KVxuICBhY3R1YWxIID0gTWF0aC5taW4oYWN0dWFsSCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIGNvbnN0IGR4ID0gKHggLSB0YXJnZXRYKSB8IDBcbiAgY29uc3QgZHkgPSAoeSAtIHRhcmdldFkpIHwgMFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBtYXNrLndcbiAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGFcblxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IG1JZHggPSAoKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpKSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGxldCBtU3RyaWRlID0gKG1QaXRjaCAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBpc09wYXF1ZSA9IGdsb2JhbEFscGhhID09PSAyNTVcbiAgY29uc3QgY29sb3JSR0IgPSBjb2xvciAmIDB4MDBmZmZmZmZcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF1cbiAgICAgIGNvbnN0IGVmZk0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgaWYgKGVmZk0gPT09IDApIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcblxuICAgICAgaWYgKGlzT3BhcXVlKSB7XG4gICAgICAgIHdlaWdodCA9IGVmZk1cbiAgICAgIH0gZWxzZSBpZiAoZWZmTSAhPT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IChlZmZNICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgIH1cblxuICAgICAgaWYgKHdlaWdodCA9PT0gMCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbENvbCA9IGNvbG9yXG5cbiAgICAgIGlmICh3ZWlnaHQgPCAyNTUpIHtcbiAgICAgICAgY29uc3QgYSA9IChiYXNlU3JjQWxwaGEgKiB3ZWlnaHQgKyAxMjgpID4+IDhcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrXG4gICAgICAgICAgbUlkeCsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9ICgoY29sb3JSR0IgfCAoYSA8PCAyNCkpID4+PiAwKSBhcyBDb2xvcjMyXG4gICAgICB9XG5cbiAgICAgIGRzdDMyW2RJZHhdID0gYmxlbmRGbihmaW5hbENvbCwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blends a solid color into a target pixel buffer using a binary mask.\n *\n * @remarks\n * If the width (`w`) or height (`h`) are omitted from the options, they will safely\n * default to the dimensions of the provided mask to prevent out-of-bounds memory access.\n *\n * @param dst - The destination {@link IPixelData} buffer to modify.\n * @param color - The solid color to apply.\n * @param mask - The mask defining the per-pixel opacity of the target area.\n * @param opts - Configuration options including placement coordinates, bounds, global alpha, and mask offsets.\n */\nexport function blendColorPixelDataBinaryMask(dst: IPixelData, color: Color32, mask: BinaryMask, opts: ColorBlendMaskOptions = {}) {\n const targetX = opts.x ?? 0;\n const targetY = opts.y ?? 0;\n let w = opts.w ?? mask.w;\n let h = opts.h ?? mask.h;\n const globalAlpha = opts.alpha ?? 255;\n const blendFn = opts.blendFn ?? sourceOverPerfect;\n const mx = opts.mx ?? 0;\n const my = opts.my ?? 0;\n const invertMask = opts.invertMask ?? false;\n if (globalAlpha === 0) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n let x = targetX;\n let y = targetY;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n let baseColorWithGlobalAlpha = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return;\n baseColorWithGlobalAlpha = (color & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mask.w;\n const maskData = mask.data;\n let dIdx = y * dw + x | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const skipVal = invertMask ? 1 : 0;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n if (maskData[mIdx] === skipVal) {\n dIdx++;\n mIdx++;\n continue;\n }\n dst32[dIdx] = blendFn(baseColorWithGlobalAlpha, dst32[dIdx] as Color32);\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBDb2xvckJsZW5kTWFza09wdGlvbnMsIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuLyoqXG4gKiBCbGVuZHMgYSBzb2xpZCBjb2xvciBpbnRvIGEgdGFyZ2V0IHBpeGVsIGJ1ZmZlciB1c2luZyBhIGJpbmFyeSBtYXNrLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiB0aGUgd2lkdGggKGB3YCkgb3IgaGVpZ2h0IChgaGApIGFyZSBvbWl0dGVkIGZyb20gdGhlIG9wdGlvbnMsIHRoZXkgd2lsbCBzYWZlbHlcbiAqIGRlZmF1bHQgdG8gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHByb3ZpZGVkIG1hc2sgdG8gcHJldmVudCBvdXQtb2YtYm91bmRzIG1lbW9yeSBhY2Nlc3MuXG4gKlxuICogQHBhcmFtIGRzdCAtIFRoZSBkZXN0aW5hdGlvbiB7QGxpbmsgSVBpeGVsRGF0YX0gYnVmZmVyIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSBzb2xpZCBjb2xvciB0byBhcHBseS5cbiAqIEBwYXJhbSBtYXNrIC0gVGhlIG1hc2sgZGVmaW5pbmcgdGhlIHBlci1waXhlbCBvcGFjaXR5IG9mIHRoZSB0YXJnZXQgYXJlYS5cbiAqIEBwYXJhbSBvcHRzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBwbGFjZW1lbnQgY29vcmRpbmF0ZXMsIGJvdW5kcywgZ2xvYmFsIGFscGhhLCBhbmQgbWFzayBvZmZzZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2soXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIG1hc2s6IEJpbmFyeU1hc2ssXG4gIG9wdHM6IENvbG9yQmxlbmRNYXNrT3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzLnggPz8gMFxuICBjb25zdCB0YXJnZXRZID0gb3B0cy55ID8/IDBcbiAgbGV0IHcgPSBvcHRzLncgPz8gbWFzay53XG4gIGxldCBoID0gb3B0cy5oID8/IG1hc2suaFxuICBjb25zdCBnbG9iYWxBbHBoYSA9IG9wdHMuYWxwaGEgPz8gMjU1XG4gIGNvbnN0IGJsZW5kRm4gPSBvcHRzLmJsZW5kRm4gPz8gc291cmNlT3ZlclBlcmZlY3RcbiAgY29uc3QgbXggPSBvcHRzLm14ID8/IDBcbiAgY29uc3QgbXkgPSBvcHRzLm15ID8/IDBcbiAgY29uc3QgaW52ZXJ0TWFzayA9IG9wdHMuaW52ZXJ0TWFzayA/PyBmYWxzZVxuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuXG5cbiAgY29uc3QgYmFzZVNyY0FscGhhID0gKGNvbG9yID4+PiAyNClcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlIHx8IGZhbHNlXG5cbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVyblxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcblxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG5cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIGxldCBiYXNlQ29sb3JXaXRoR2xvYmFsQWxwaGEgPSBjb2xvclxuXG4gIGlmIChnbG9iYWxBbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGEgPSAoYmFzZVNyY0FscGhhICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVyblxuICAgIGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSA9ICgoY29sb3IgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICB9XG5cbiAgY29uc3QgZHggPSAoeCAtIHRhcmdldFgpIHwgMFxuICBjb25zdCBkeSA9ICh5IC0gdGFyZ2V0WSkgfCAwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sud1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IG1JZHggPSAoKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpKSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IG1TdHJpZGUgPSAobVBpdGNoIC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNraXBWYWwgPSBpbnZlcnRNYXNrID8gMSA6IDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBpZiAobWFza0RhdGFbbUlkeF0gPT09IHNraXBWYWwpIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oYmFzZUNvbG9yV2l0aEdsb2JhbEFscGhhLCBkc3QzMltkSWR4XSBhcyBDb2xvcjMyKVxuXG4gICAgICBkSWR4KytcbiAgICAgIG1JZHgrK1xuICAgIH1cblxuICAgIGRJZHggKz0gZFN0cmlkZVxuICAgIG1JZHggKz0gbVN0cmlkZVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { getCircleBrushOrPencilBounds } from '../Rect/getCircleBrushOrPencilBounds';\nimport { blendColorPixelDataAlphaMask } from './blendColorPixelDataAlphaMask';\nimport { blendColorPixelDataBinaryMask } from './blendColorPixelDataBinaryMask';\n\n/**\n * Applies a circular brush to pixel data using a pre-calculated alpha mask.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brush The pre-calculated CircleBrushAlphaMask.\n * @param alpha The overall opacity of the brush (0-255).\n * @param blendFn\n * @param scratchOptions\n * @param bounds precalculated result from {@link getCircleBrushOrPencilBounds}\n */\nexport function applyCircleBrushToPixelData(target: IPixelData, color: Color32, centerX: number, centerY: number, brush: CircleBrushMask, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect, scratchOptions: ColorBlendMaskOptions = {}, bounds?: Rect): void {\n const b = bounds ?? getCircleBrushOrPencilBounds(centerX, centerY, brush.size, target.width, target.height);\n if (b.w <= 0 || b.h <= 0) return;\n const unclippedStartX = Math.floor(centerX + brush.minOffset);\n const unclippedStartY = Math.floor(centerY + brush.minOffset);\n\n // Calculate the intersection between the unclipped mask rect and the allowed bounds\n const ix = Math.max(unclippedStartX, b.x);\n const iy = Math.max(unclippedStartY, b.y);\n const ir = Math.min(unclippedStartX + brush.w, b.x + b.w);\n const ib = Math.min(unclippedStartY + brush.h, b.y + b.h);\n const iw = ir - ix;\n const ih = ib - iy;\n\n // If the mask falls entirely outside the bounds, exit\n if (iw <= 0 || ih <= 0) return;\n\n // Apply the intersected coordinates and internal mask offsets\n scratchOptions.x = ix;\n scratchOptions.y = iy;\n scratchOptions.w = iw;\n scratchOptions.h = ih;\n scratchOptions.mx = ix - unclippedStartX;\n scratchOptions.my = iy - unclippedStartY;\n scratchOptions.alpha = alpha;\n scratchOptions.blendFn = blendFn;\n if (brush.type === MaskType.ALPHA) {\n blendColorPixelDataAlphaMask(target, color, brush, scratchOptions);\n }\n if (brush.type === MaskType.BINARY) {\n blendColorPixelDataBinaryMask(target, color, brush, scratchOptions);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBCbGVuZENvbG9yMzIsXG4gIHR5cGUgQ2lyY2xlQnJ1c2hNYXNrLFxuICB0eXBlIENvbG9yMzIsXG4gIHR5cGUgQ29sb3JCbGVuZE1hc2tPcHRpb25zLFxuICB0eXBlIElQaXhlbERhdGEsXG4gIE1hc2tUeXBlLFxuICB0eXBlIFJlY3QsXG59IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuaW1wb3J0IHsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uL1JlY3QvZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcydcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgfSBmcm9tICcuL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snXG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4vYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snXG5cbi8qKlxuICogQXBwbGllcyBhIGNpcmN1bGFyIGJydXNoIHRvIHBpeGVsIGRhdGEgdXNpbmcgYSBwcmUtY2FsY3VsYXRlZCBhbHBoYSBtYXNrLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIFBpeGVsRGF0YSB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgVGhlIGJydXNoIGNvbG9yLlxuICogQHBhcmFtIGNlbnRlclggVGhlIGNlbnRlciB4LWNvb3JkaW5hdGUgb2YgdGhlIGJydXNoLlxuICogQHBhcmFtIGNlbnRlclkgVGhlIGNlbnRlciB5LWNvb3JkaW5hdGUgb2YgdGhlIGJydXNoLlxuICogQHBhcmFtIGJydXNoIFRoZSBwcmUtY2FsY3VsYXRlZCBDaXJjbGVCcnVzaEFscGhhTWFzay5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgb3ZlcmFsbCBvcGFjaXR5IG9mIHRoZSBicnVzaCAoMC0yNTUpLlxuICogQHBhcmFtIGJsZW5kRm5cbiAqIEBwYXJhbSBzY3JhdGNoT3B0aW9uc1xuICogQHBhcmFtIGJvdW5kcyBwcmVjYWxjdWxhdGVkIHJlc3VsdCBmcm9tIHtAbGluayBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhKFxuICB0YXJnZXQ6IElQaXhlbERhdGEsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICBjZW50ZXJYOiBudW1iZXIsXG4gIGNlbnRlclk6IG51bWJlcixcbiAgYnJ1c2g6IENpcmNsZUJydXNoTWFzayxcbiAgYWxwaGEgPSAyNTUsXG4gIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBzY3JhdGNoT3B0aW9uczogQ29sb3JCbGVuZE1hc2tPcHRpb25zID0ge30sXG4gIGJvdW5kcz86IFJlY3QsXG4pOiB2b2lkIHtcbiAgY29uc3QgYiA9IGJvdW5kcyA/PyBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgIGNlbnRlclgsXG4gICAgY2VudGVyWSxcbiAgICBicnVzaC5zaXplLFxuICAgIHRhcmdldC53aWR0aCxcbiAgICB0YXJnZXQuaGVpZ2h0LFxuICApXG5cbiAgaWYgKGIudyA8PSAwIHx8IGIuaCA8PSAwKSByZXR1cm5cblxuICBjb25zdCB1bmNsaXBwZWRTdGFydFggPSBNYXRoLmZsb29yKGNlbnRlclggKyBicnVzaC5taW5PZmZzZXQpXG4gIGNvbnN0IHVuY2xpcHBlZFN0YXJ0WSA9IE1hdGguZmxvb3IoY2VudGVyWSArIGJydXNoLm1pbk9mZnNldClcblxuICAvLyBDYWxjdWxhdGUgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSB1bmNsaXBwZWQgbWFzayByZWN0IGFuZCB0aGUgYWxsb3dlZCBib3VuZHNcbiAgY29uc3QgaXggPSBNYXRoLm1heCh1bmNsaXBwZWRTdGFydFgsIGIueClcbiAgY29uc3QgaXkgPSBNYXRoLm1heCh1bmNsaXBwZWRTdGFydFksIGIueSlcbiAgY29uc3QgaXIgPSBNYXRoLm1pbih1bmNsaXBwZWRTdGFydFggKyBicnVzaC53LCBiLnggKyBiLncpXG4gIGNvbnN0IGliID0gTWF0aC5taW4odW5jbGlwcGVkU3RhcnRZICsgYnJ1c2guaCwgYi55ICsgYi5oKVxuXG4gIGNvbnN0IGl3ID0gaXIgLSBpeFxuICBjb25zdCBpaCA9IGliIC0gaXlcblxuICAvLyBJZiB0aGUgbWFzayBmYWxscyBlbnRpcmVseSBvdXRzaWRlIHRoZSBib3VuZHMsIGV4aXRcbiAgaWYgKGl3IDw9IDAgfHwgaWggPD0gMCkgcmV0dXJuXG5cbiAgLy8gQXBwbHkgdGhlIGludGVyc2VjdGVkIGNvb3JkaW5hdGVzIGFuZCBpbnRlcm5hbCBtYXNrIG9mZnNldHNcbiAgc2NyYXRjaE9wdGlvbnMueCA9IGl4XG4gIHNjcmF0Y2hPcHRpb25zLnkgPSBpeVxuICBzY3JhdGNoT3B0aW9ucy53ID0gaXdcbiAgc2NyYXRjaE9wdGlvbnMuaCA9IGloXG4gIHNjcmF0Y2hPcHRpb25zLm14ID0gaXggLSB1bmNsaXBwZWRTdGFydFhcbiAgc2NyYXRjaE9wdGlvbnMubXkgPSBpeSAtIHVuY2xpcHBlZFN0YXJ0WVxuICBzY3JhdGNoT3B0aW9ucy5hbHBoYSA9IGFscGhhXG4gIHNjcmF0Y2hPcHRpb25zLmJsZW5kRm4gPSBibGVuZEZuXG5cbiAgaWYgKGJydXNoLnR5cGUgPT09IE1hc2tUeXBlLkFMUEhBKSB7XG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayhcbiAgICAgIHRhcmdldCxcbiAgICAgIGNvbG9yLFxuICAgICAgYnJ1c2gsXG4gICAgICBzY3JhdGNoT3B0aW9ucyxcbiAgICApXG4gIH1cblxuICBpZiAoYnJ1c2gudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2soXG4gICAgICB0YXJnZXQsXG4gICAgICBjb2xvcixcbiAgICAgIGJydXNoLFxuICAgICAgc2NyYXRjaE9wdGlvbnMsXG4gICAgKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { applyCircleBrushToPixelData } from '../../PixelData/applyCircleBrushToPixelData';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nconst defaults = {\n applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyCircleBrush = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyCircleBrushToPixelData = defaults.applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendMaskOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCircleBrush(color: Color32, centerX: number, centerY: number, brush: CircleBrushAlphaMask, alpha = 255, blendFn?: BlendColor32) {\n const bounds = getCircleBrushOrPencilBounds(centerX, centerY, brush.size, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyCircleBrushToPixelData(writer.target, color, centerX, centerY, brush, alpha, blendFn, blendColorPixelOptions, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBCbGVuZENvbG9yMzIsXG4gIENpcmNsZUJydXNoQWxwaGFNYXNrLFxuICBDb2xvcjMyLFxuICBDb2xvckJsZW5kTWFza09wdGlvbnMsXG4gIEhpc3RvcnlNdXRhdG9yLFxuICBSZWN0LFxufSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUNpcmNsZUJydXNoVG9QaXhlbERhdGEnXG5pbXBvcnQgeyBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzIH0gZnJvbSAnLi4vLi4vUmVjdC9nZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSxcbiAgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbn1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQXBwbHlDaXJjbGVCcnVzaCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcblxuICB9ID0gZGVwc1xuXG4gIGNvbnN0IGJvdW5kc091dDogUmVjdCA9IHsgeDogMCwgeTogMCwgdzogMCwgaDogMCB9XG5cbiAgY29uc3QgYmxlbmRDb2xvclBpeGVsT3B0aW9uczogQ29sb3JCbGVuZE1hc2tPcHRpb25zID0ge1xuICAgIGFscGhhOiAyNTUsXG4gICAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3QsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXBwbHlDaXJjbGVCcnVzaChcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgY2VudGVyWDogbnVtYmVyLFxuICAgICAgY2VudGVyWTogbnVtYmVyLFxuICAgICAgYnJ1c2g6IENpcmNsZUJydXNoQWxwaGFNYXNrLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICkge1xuXG4gICAgICBjb25zdCBib3VuZHMgPSBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaC5zaXplLFxuICAgICAgICB3cml0ZXIudGFyZ2V0LndpZHRoLFxuICAgICAgICB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgICAgYm91bmRzT3V0LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHgsIHksIHcsIGggfSA9IGJvdW5kc1xuXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuXG4gICAgICBhcHBseUNpcmNsZUJydXNoVG9QaXhlbERhdGEoXG4gICAgICAgIHdyaXRlci50YXJnZXQsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaCxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGJsZW5kRm4sXG4gICAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMsXG4gICAgICAgIGJvdW5kcyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Iterates through a line with sub-pixel precision.\n * Guarantees that the first and last points are exactly (x0, y0) and (x1, y1).\n */\nexport function forEachLinePoint(x0: number, y0: number, x1: number, y1: number, callback: (x: number, y: number) => void): void {\n const dx = x1 - x0;\n const dy = y1 - y0;\n\n // Determine the number of steps based on the longest axis\n const steps = Math.max(Math.abs(dx), Math.abs(dy));\n\n // Handle the zero-length line (Single Stamp Case)\n if (steps === 0) {\n callback(x0, y0);\n return;\n }\n const xInc = dx / steps;\n const yInc = dy / steps;\n let curX = x0;\n let curY = y0;\n\n // We add +1 to the loop to ensure we reach the final (x1, y1)\n for (let i = 0; i <= steps; i++) {\n callback(curX, curY);\n curX += xInc;\n curY += yInc;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGEgbGluZSB3aXRoIHN1Yi1waXhlbCBwcmVjaXNpb24uXG4gKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgZXhhY3RseSAoeDAsIHkwKSBhbmQgKHgxLCB5MSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoTGluZVBvaW50KFxuICB4MDogbnVtYmVyLFxuICB5MDogbnVtYmVyLFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICBjYWxsYmFjazogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNvbnN0IGR4ID0geDEgLSB4MFxuICBjb25zdCBkeSA9IHkxIC0geTBcblxuICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzdGVwcyBiYXNlZCBvbiB0aGUgbG9uZ2VzdCBheGlzXG4gIGNvbnN0IHN0ZXBzID0gTWF0aC5tYXgoTWF0aC5hYnMoZHgpLCBNYXRoLmFicyhkeSkpXG5cbiAgLy8gSGFuZGxlIHRoZSB6ZXJvLWxlbmd0aCBsaW5lIChTaW5nbGUgU3RhbXAgQ2FzZSlcbiAgaWYgKHN0ZXBzID09PSAwKSB7XG4gICAgY2FsbGJhY2soeDAsIHkwKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeEluYyA9IGR4IC8gc3RlcHNcbiAgY29uc3QgeUluYyA9IGR5IC8gc3RlcHNcblxuICBsZXQgY3VyWCA9IHgwXG4gIGxldCBjdXJZID0geTBcblxuICAvLyBXZSBhZGQgKzEgdG8gdGhlIGxvb3AgdG8gZW5zdXJlIHdlIHJlYWNoIHRoZSBmaW5hbCAoeDEsIHkxKVxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XG4gICAgY2FsbGJhY2soY3VyWCwgY3VyWSlcbiAgICBjdXJYICs9IHhJbmNcbiAgICBjdXJZICs9IHlJbmNcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function getCircleBrushOrPencilStrokeBounds(x0: number, y0: number, x1: number, y1: number, brushSize: number, result: Rect): Rect {\n const r = Math.ceil(brushSize / 2);\n const minX = Math.min(x0, x1) - r;\n const minY = Math.min(y0, y1) - r;\n const maxX = Math.max(x0, x1) + r;\n const maxY = Math.max(x0, y1) + r;\n result.x = Math.floor(minX);\n result.y = Math.floor(minY);\n result.w = Math.ceil(maxX - minX);\n result.h = Math.ceil(maxY - minY);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyhcbiAgeDA6IG51bWJlcixcbiAgeTA6IG51bWJlcixcbiAgeDE6IG51bWJlcixcbiAgeTE6IG51bWJlcixcbiAgYnJ1c2hTaXplOiBudW1iZXIsXG4gIHJlc3VsdDogUmVjdCxcbik6IFJlY3Qge1xuICBjb25zdCByID0gTWF0aC5jZWlsKGJydXNoU2l6ZSAvIDIpXG5cbiAgY29uc3QgbWluWCA9IE1hdGgubWluKHgwLCB4MSkgLSByXG4gIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MCwgeTEpIC0gclxuICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDAsIHgxKSArIHJcbiAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHgwLCB5MSkgKyByXG5cbiAgcmVzdWx0LnggPSBNYXRoLmZsb29yKG1pblgpXG4gIHJlc3VsdC55ID0gTWF0aC5mbG9vcihtaW5ZKVxuICByZXN1bHQudyA9IE1hdGguY2VpbChtYXhYIC0gbWluWClcbiAgcmVzdWx0LmggPSBNYXRoLmNlaWwobWF4WSAtIG1pblkpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type AlphaMask, type HistoryMutator, MaskType } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nimport { getCircleBrushOrPencilStrokeBounds } from '../../Rect/getCircleBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataAlphaMask,\n getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyCircleBrushStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds = defaults.getCircleBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const circleBrushBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendMaskOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const mask = {\n type: MaskType.ALPHA,\n data: null as unknown as Uint8Array,\n w: 0,\n h: 0\n };\n return {\n applyCircleBrushStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brush: CircleBrushAlphaMask, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect) {\n const brushSize = brush.size;\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getCircleBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushSize, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n mask.data = new Uint8Array(bw * bh);\n mask.w = bw;\n mask.h = bh;\n const maskData = mask.data;\n const brushData = brush.data;\n const minOffset = brush.minOffset;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const {\n x: cbx,\n y: cby,\n w: cbw,\n h: cbh\n } = getCircleBrushOrPencilBounds(px, py, brushSize, targetWidth, targetHeight, circleBrushBounds);\n writer.accumulator.storeRegionBeforeState(cbx, cby, cbw, cbh);\n const startX = Math.max(bx, cbx);\n const startY = Math.max(by, cby);\n const endX = Math.min(bx + bw, cbx + cbw);\n const endY = Math.min(by + bh, cby + cbh);\n const unclippedStartX = Math.floor(px + minOffset);\n const unclippedStartY = Math.floor(py + minOffset);\n for (let my = startY; my < endY; my++) {\n const strokeMaskY = my - by;\n const strokeMaskRowOffset = strokeMaskY * bw;\n const brushY = my - unclippedStartY;\n const brushRowOffset = brushY * brushSize;\n for (let mx = startX; mx < endX; mx++) {\n const brushX = mx - unclippedStartX;\n const brushVal = brushData[brushRowOffset + brushX];\n if (brushVal > 0) {\n const strokeMaskIdx = strokeMaskRowOffset + (mx - bx);\n if (brushVal > maskData[strokeMaskIdx]) {\n maskData[strokeMaskIdx] = brushVal;\n }\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataAlphaMask(writer.target, color, mask as AlphaMask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBbHBoYU1hc2ssXG4gIHR5cGUgQmxlbmRDb2xvcjMyLFxuICB0eXBlIENpcmNsZUJydXNoQWxwaGFNYXNrLFxuICB0eXBlIENvbG9yMzIsXG4gIHR5cGUgQ29sb3JCbGVuZE1hc2tPcHRpb25zLFxuICB0eXBlIEhpc3RvcnlNdXRhdG9yLFxuICBNYXNrVHlwZSxcbiAgdHlwZSBSZWN0LFxufSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBmb3JFYWNoTGluZVBvaW50IH0gZnJvbSAnLi4vLi4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzaydcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzIH0gZnJvbSAnLi4vLi4vUmVjdC9nZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGZvckVhY2hMaW5lUG9pbnQsXG4gIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2ssXG4gIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5Q2lyY2xlQnJ1c2hTdHJva2UgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmb3JFYWNoTGluZVBvaW50ID0gZGVmYXVsdHMuZm9yRWFjaExpbmVQb2ludCxcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbiAgfSA9IGRlcHNcblxuICBjb25zdCBzdHJva2VCb3VuZHNPdXQ6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNpcmNsZUJydXNoQm91bmRzOiBSZWN0ID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDAsXG4gIH1cblxuICBjb25zdCBibGVuZENvbG9yUGl4ZWxPcHRpb25zOiBDb2xvckJsZW5kTWFza09wdGlvbnMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgbWFzayA9IHtcbiAgICB0eXBlOiBNYXNrVHlwZS5BTFBIQSxcbiAgICBkYXRhOiBudWxsIGFzIHVua25vd24gYXMgVWludDhBcnJheSxcbiAgICB3OiAwLFxuICAgIGg6IDAsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2hTdHJva2UoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHgwOiBudW1iZXIsXG4gICAgICB5MDogbnVtYmVyLFxuICAgICAgeDE6IG51bWJlcixcbiAgICAgIHkxOiBudW1iZXIsXG4gICAgICBicnVzaDogQ2lyY2xlQnJ1c2hBbHBoYU1hc2ssXG4gICAgICBhbHBoYSA9IDI1NSxcbiAgICAgIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgICkge1xuICAgICAgY29uc3QgYnJ1c2hTaXplID0gYnJ1c2guc2l6ZVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IGJ4LFxuICAgICAgICB5OiBieSxcbiAgICAgICAgdzogYncsXG4gICAgICAgIGg6IGJoLFxuICAgICAgfSA9IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoXG4gICAgICAgIHgwLFxuICAgICAgICB5MCxcbiAgICAgICAgeDEsXG4gICAgICAgIHkxLFxuICAgICAgICBicnVzaFNpemUsXG4gICAgICAgIHN0cm9rZUJvdW5kc091dCxcbiAgICAgIClcblxuICAgICAgaWYgKGJ3IDw9IDAgfHwgYmggPD0gMCkgcmV0dXJuXG5cbiAgICAgIG1hc2suZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ3ICogYmgpXG4gICAgICBtYXNrLncgPSBid1xuICAgICAgbWFzay5oID0gYmhcblxuICAgICAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGFcbiAgICAgIGNvbnN0IGJydXNoRGF0YSA9IGJydXNoLmRhdGFcbiAgICAgIGNvbnN0IG1pbk9mZnNldCA9IGJydXNoLm1pbk9mZnNldFxuXG4gICAgICBjb25zdCB0YXJnZXRXaWR0aCA9IHdyaXRlci50YXJnZXQud2lkdGhcbiAgICAgIGNvbnN0IHRhcmdldEhlaWdodCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0XG5cbiAgICAgIGZvckVhY2hMaW5lUG9pbnQoXG4gICAgICAgIHgwLFxuICAgICAgICB5MCxcbiAgICAgICAgeDEsXG4gICAgICAgIHkxLFxuICAgICAgICAocHgsIHB5KSA9PiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeDogY2J4LFxuICAgICAgICAgICAgeTogY2J5LFxuICAgICAgICAgICAgdzogY2J3LFxuICAgICAgICAgICAgaDogY2JoLFxuICAgICAgICAgIH0gPSBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgICAgICAgICAgcHgsXG4gICAgICAgICAgICBweSxcbiAgICAgICAgICAgIGJydXNoU2l6ZSxcbiAgICAgICAgICAgIHRhcmdldFdpZHRoLFxuICAgICAgICAgICAgdGFyZ2V0SGVpZ2h0LFxuICAgICAgICAgICAgY2lyY2xlQnJ1c2hCb3VuZHMsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoXG4gICAgICAgICAgICBjYngsXG4gICAgICAgICAgICBjYnksXG4gICAgICAgICAgICBjYncsXG4gICAgICAgICAgICBjYmgsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoYngsIGNieClcbiAgICAgICAgICBjb25zdCBzdGFydFkgPSBNYXRoLm1heChieSwgY2J5KVxuICAgICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLm1pbihieCArIGJ3LCBjYnggKyBjYncpXG4gICAgICAgICAgY29uc3QgZW5kWSA9IE1hdGgubWluKGJ5ICsgYmgsIGNieSArIGNiaClcblxuICAgICAgICAgIGNvbnN0IHVuY2xpcHBlZFN0YXJ0WCA9IE1hdGguZmxvb3IocHggKyBtaW5PZmZzZXQpXG4gICAgICAgICAgY29uc3QgdW5jbGlwcGVkU3RhcnRZID0gTWF0aC5mbG9vcihweSArIG1pbk9mZnNldClcblxuICAgICAgICAgIGZvciAobGV0IG15ID0gc3RhcnRZOyBteSA8IGVuZFk7IG15KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cm9rZU1hc2tZID0gbXkgLSBieVxuICAgICAgICAgICAgY29uc3Qgc3Ryb2tlTWFza1Jvd09mZnNldCA9IHN0cm9rZU1hc2tZICogYndcblxuICAgICAgICAgICAgY29uc3QgYnJ1c2hZID0gbXkgLSB1bmNsaXBwZWRTdGFydFlcbiAgICAgICAgICAgIGNvbnN0IGJydXNoUm93T2Zmc2V0ID0gYnJ1c2hZICogYnJ1c2hTaXplXG5cbiAgICAgICAgICAgIGZvciAobGV0IG14ID0gc3RhcnRYOyBteCA8IGVuZFg7IG14KyspIHtcbiAgICAgICAgICAgICAgY29uc3QgYnJ1c2hYID0gbXggLSB1bmNsaXBwZWRTdGFydFhcbiAgICAgICAgICAgICAgY29uc3QgYnJ1c2hWYWwgPSBicnVzaERhdGFbYnJ1c2hSb3dPZmZzZXQgKyBicnVzaFhdXG5cbiAgICAgICAgICAgICAgaWYgKGJydXNoVmFsID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cm9rZU1hc2tJZHggPSBzdHJva2VNYXNrUm93T2Zmc2V0ICsgKG14IC0gYngpXG5cbiAgICAgICAgICAgICAgICBpZiAoYnJ1c2hWYWwgPiBtYXNrRGF0YVtzdHJva2VNYXNrSWR4XSkge1xuICAgICAgICAgICAgICAgICAgbWFza0RhdGFbc3Ryb2tlTWFza0lkeF0gPSBicnVzaFZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIClcblxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5ibGVuZEZuID0gYmxlbmRGblxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5hbHBoYSA9IGFscGhhXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnggPSBieFxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy55ID0gYnlcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMudyA9IGJ3XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmggPSBiaFxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKFxuICAgICAgICB3cml0ZXIudGFyZ2V0LFxuICAgICAgICBjb2xvcixcbiAgICAgICAgbWFzayBhcyBBbHBoYU1hc2ssXG4gICAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMsXG4gICAgICApXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type BinaryMask, type HistoryMutator, MaskType } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nimport { getCircleBrushOrPencilStrokeBounds } from '../../Rect/getCircleBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataBinaryMask,\n getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyCirclePencilStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n getCircleBrushOrPencilStrokeBounds = defaults.getCircleBrushOrPencilStrokeBounds,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const circlePencilBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendMaskOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const mask = {\n type: MaskType.BINARY,\n data: null as unknown as Uint8Array,\n w: 0,\n h: 0\n };\n return {\n applyCirclePencilStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brush: CircleBrushBinaryMask, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getCircleBrushOrPencilStrokeBounds(x0, y0, x1, y1, brush.size, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n mask.data = new Uint8Array(bw * bh);\n mask.w = bw;\n mask.h = bh;\n const maskData = mask.data;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const {\n x: cbx,\n y: cby,\n w: cbw,\n h: cbh\n } = getCircleBrushOrPencilBounds(px, py, brush.size, targetWidth, targetHeight, circlePencilBounds);\n writer.accumulator.storeRegionBeforeState(cbx, cby, cbw, cbh);\n const unclippedStartX = Math.floor(px + brush.minOffset);\n const unclippedStartY = Math.floor(py + brush.minOffset);\n const startX = Math.max(bx, unclippedStartX);\n const startY = Math.max(by, unclippedStartY);\n const endX = Math.min(bx + bw, unclippedStartX + brush.w);\n const endY = Math.min(by + bh, unclippedStartY + brush.h);\n for (let my = startY; my < endY; my++) {\n const brushY = my - unclippedStartY;\n const maskRowOffset = (my - by) * bw;\n const brushRowOffset = brushY * brush.w;\n for (let mx = startX; mx < endX; mx++) {\n const brushX = mx - unclippedStartX;\n const brushAlpha = brush.data[brushRowOffset + brushX];\n if (brushAlpha > 0) {\n const maskIdx = maskRowOffset + (mx - bx);\n maskData[maskIdx] = brushAlpha;\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataBinaryMask(writer.target, color, mask as BinaryMask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBCaW5hcnlNYXNrLFxuICB0eXBlIEJsZW5kQ29sb3IzMixcbiAgdHlwZSBDaXJjbGVCcnVzaEJpbmFyeU1hc2ssXG4gIHR5cGUgQ29sb3IzMixcbiAgdHlwZSBDb2xvckJsZW5kTWFza09wdGlvbnMsXG4gIHR5cGUgSGlzdG9yeU11dGF0b3IsXG4gIE1hc2tUeXBlLFxuICB0eXBlIFJlY3QsXG59IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZvckVhY2hMaW5lUG9pbnQgfSBmcm9tICcuLi8uLi9BbGdvcml0aG0vZm9yRWFjaExpbmVQb2ludCdcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snXG5pbXBvcnQgeyBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzIH0gZnJvbSAnLi4vLi4vUmVjdC9nZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcydcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBmb3JFYWNoTGluZVBvaW50LFxuICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayxcbiAgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbn1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQXBwbHlDaXJjbGVQZW5jaWxTdHJva2UgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmb3JFYWNoTGluZVBvaW50ID0gZGVmYXVsdHMuZm9yRWFjaExpbmVQb2ludCxcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrLFxuICAgIGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgPSBkZWZhdWx0cy5nZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxuICAgIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgPSBkZWZhdWx0cy5nZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxuICB9ID0gZGVwc1xuXG4gIGNvbnN0IHN0cm9rZUJvdW5kc091dDogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgY2lyY2xlUGVuY2lsQm91bmRzOiBSZWN0ID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDAsXG4gIH1cblxuICBjb25zdCBibGVuZENvbG9yUGl4ZWxPcHRpb25zOiBDb2xvckJsZW5kTWFza09wdGlvbnMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgbWFzayA9IHtcbiAgICB0eXBlOiBNYXNrVHlwZS5CSU5BUlksXG4gICAgZGF0YTogbnVsbCBhcyB1bmtub3duIGFzIFVpbnQ4QXJyYXksXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseUNpcmNsZVBlbmNpbFN0cm9rZShcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgeDA6IG51bWJlcixcbiAgICAgIHkwOiBudW1iZXIsXG4gICAgICB4MTogbnVtYmVyLFxuICAgICAgeTE6IG51bWJlcixcbiAgICAgIGJydXNoOiBDaXJjbGVCcnVzaEJpbmFyeU1hc2ssXG4gICAgICBhbHBoYSA9IDI1NSxcbiAgICAgIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgICkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4OiBieCxcbiAgICAgICAgeTogYnksXG4gICAgICAgIHc6IGJ3LFxuICAgICAgICBoOiBiaCxcbiAgICAgIH0gPSBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzKFxuICAgICAgICB4MCxcbiAgICAgICAgeTAsXG4gICAgICAgIHgxLFxuICAgICAgICB5MSxcbiAgICAgICAgYnJ1c2guc2l6ZSxcbiAgICAgICAgc3Ryb2tlQm91bmRzT3V0LFxuICAgICAgKVxuXG4gICAgICBpZiAoYncgPD0gMCB8fCBiaCA8PSAwKSByZXR1cm5cblxuICAgICAgbWFzay5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoYncgKiBiaClcbiAgICAgIG1hc2sudyA9IGJ3XG4gICAgICBtYXNrLmggPSBiaFxuXG4gICAgICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuICAgICAgY29uc3QgdGFyZ2V0V2lkdGggPSB3cml0ZXIudGFyZ2V0LndpZHRoXG4gICAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSB3cml0ZXIudGFyZ2V0LmhlaWdodFxuXG4gICAgICBmb3JFYWNoTGluZVBvaW50KFxuICAgICAgICB4MCxcbiAgICAgICAgeTAsXG4gICAgICAgIHgxLFxuICAgICAgICB5MSxcbiAgICAgICAgKHB4LCBweSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHg6IGNieCxcbiAgICAgICAgICAgIHk6IGNieSxcbiAgICAgICAgICAgIHc6IGNidyxcbiAgICAgICAgICAgIGg6IGNiaCxcbiAgICAgICAgICB9ID0gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyhcbiAgICAgICAgICAgIHB4LFxuICAgICAgICAgICAgcHksXG4gICAgICAgICAgICBicnVzaC5zaXplLFxuICAgICAgICAgICAgdGFyZ2V0V2lkdGgsXG4gICAgICAgICAgICB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgICBjaXJjbGVQZW5jaWxCb3VuZHMsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoXG4gICAgICAgICAgICBjYngsXG4gICAgICAgICAgICBjYnksXG4gICAgICAgICAgICBjYncsXG4gICAgICAgICAgICBjYmgsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3QgdW5jbGlwcGVkU3RhcnRYID0gTWF0aC5mbG9vcihweCArIGJydXNoLm1pbk9mZnNldClcbiAgICAgICAgICBjb25zdCB1bmNsaXBwZWRTdGFydFkgPSBNYXRoLmZsb29yKHB5ICsgYnJ1c2gubWluT2Zmc2V0KVxuXG4gICAgICAgICAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoYngsIHVuY2xpcHBlZFN0YXJ0WClcbiAgICAgICAgICBjb25zdCBzdGFydFkgPSBNYXRoLm1heChieSwgdW5jbGlwcGVkU3RhcnRZKVxuICAgICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLm1pbihieCArIGJ3LCB1bmNsaXBwZWRTdGFydFggKyBicnVzaC53KVxuICAgICAgICAgIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihieSArIGJoLCB1bmNsaXBwZWRTdGFydFkgKyBicnVzaC5oKVxuXG4gICAgICAgICAgZm9yIChsZXQgbXkgPSBzdGFydFk7IG15IDwgZW5kWTsgbXkrKykge1xuICAgICAgICAgICAgY29uc3QgYnJ1c2hZID0gbXkgLSB1bmNsaXBwZWRTdGFydFlcbiAgICAgICAgICAgIGNvbnN0IG1hc2tSb3dPZmZzZXQgPSAobXkgLSBieSkgKiBid1xuICAgICAgICAgICAgY29uc3QgYnJ1c2hSb3dPZmZzZXQgPSBicnVzaFkgKiBicnVzaC53XG5cbiAgICAgICAgICAgIGZvciAobGV0IG14ID0gc3RhcnRYOyBteCA8IGVuZFg7IG14KyspIHtcbiAgICAgICAgICAgICAgY29uc3QgYnJ1c2hYID0gbXggLSB1bmNsaXBwZWRTdGFydFhcbiAgICAgICAgICAgICAgY29uc3QgYnJ1c2hBbHBoYSA9IGJydXNoLmRhdGFbYnJ1c2hSb3dPZmZzZXQgKyBicnVzaFhdXG5cbiAgICAgICAgICAgICAgaWYgKGJydXNoQWxwaGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFza0lkeCA9IG1hc2tSb3dPZmZzZXQgKyAobXggLSBieClcbiAgICAgICAgICAgICAgICBtYXNrRGF0YVttYXNrSWR4XSA9IGJydXNoQWxwaGFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIClcblxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5ibGVuZEZuID0gYmxlbmRGblxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5hbHBoYSA9IGFscGhhXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnggPSBieFxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy55ID0gYnlcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMudyA9IGJ3XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmggPSBiaFxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayhcbiAgICAgICAgd3JpdGVyLnRhcmdldCxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIG1hc2sgYXMgQmluYXJ5TWFzayxcbiAgICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function getRectBrushOrPencilBounds(centerX: number, centerY: number, brushWidth: number, brushHeight: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const startX = Math.floor(centerX - brushWidth / 2);\n const startY = Math.floor(centerY - brushHeight / 2);\n const endX = startX + brushWidth;\n const endY = startY + brushHeight;\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const cStartX = Math.max(0, startX);\n const cStartY = Math.max(0, startY);\n const cEndX = Math.min(targetWidth, endX);\n const cEndY = Math.min(targetHeight, endY);\n const w = cEndX - cStartX;\n const h = cEndY - cStartY;\n res.x = cStartX;\n res.y = cStartY;\n res.w = w < 0 ? 0 : w;\n res.h = h < 0 ? 0 : h;\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuICBicnVzaFdpZHRoOiBudW1iZXIsXG4gIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gIHRhcmdldFdpZHRoOiBudW1iZXIsXG4gIHRhcmdldEhlaWdodDogbnVtYmVyLFxuICBvdXQ/OiBSZWN0LFxuKTogUmVjdCB7XG4gIGNvbnN0IHN0YXJ0WCA9IE1hdGguZmxvb3IoY2VudGVyWCAtIGJydXNoV2lkdGggLyAyKVxuICBjb25zdCBzdGFydFkgPSBNYXRoLmZsb29yKGNlbnRlclkgLSBicnVzaEhlaWdodCAvIDIpXG4gIGNvbnN0IGVuZFggPSBzdGFydFggKyBicnVzaFdpZHRoXG4gIGNvbnN0IGVuZFkgPSBzdGFydFkgKyBicnVzaEhlaWdodFxuXG4gIGNvbnN0IHJlcyA9IG91dCA/PyB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNTdGFydFggPSBNYXRoLm1heCgwLCBzdGFydFgpXG4gIGNvbnN0IGNTdGFydFkgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IGNFbmRYID0gTWF0aC5taW4odGFyZ2V0V2lkdGgsIGVuZFgpXG4gIGNvbnN0IGNFbmRZID0gTWF0aC5taW4odGFyZ2V0SGVpZ2h0LCBlbmRZKVxuXG4gIGNvbnN0IHcgPSBjRW5kWCAtIGNTdGFydFhcbiAgY29uc3QgaCA9IGNFbmRZIC0gY1N0YXJ0WVxuXG4gIHJlcy54ID0gY1N0YXJ0WFxuICByZXMueSA9IGNTdGFydFlcbiAgcmVzLncgPSB3IDwgMCA/IDAgOiB3XG4gIHJlcy5oID0gaCA8IDAgPyAwIDogaFxuXG4gIHJldHVybiByZXNcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { getRectBrushOrPencilBounds } from '../Rect/getRectBrushOrPencilBounds';\nexport function applyRectBrushToPixelData(target: IPixelData, color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect, bounds?: Rect): void {\n const targetWidth = target.width;\n const targetHeight = target.height;\n const b = bounds ?? getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, targetWidth, targetHeight);\n if (b.w <= 0 || b.h <= 0) return;\n const data32 = target.data32;\n const baseColor = color & 0x00ffffff;\n const baseSrcAlpha = color >>> 24;\n const isOpaque = alpha === 255;\n const invHalfW = 1 / (brushWidth / 2);\n const invHalfH = 1 / (brushHeight / 2);\n\n // Restore the pixel-art centering logic\n const centerOffsetX = brushWidth % 2 === 0 ? 0.5 : 0;\n const centerOffsetY = brushHeight % 2 === 0 ? 0.5 : 0;\n const fCenterX = Math.floor(centerX);\n const fCenterY = Math.floor(centerY);\n const endX = b.x + b.w;\n const endY = b.y + b.h;\n const isOverwrite = (blendFn as any).isOverwrite;\n for (let py = b.y; py < endY; py++) {\n const rowOffset = py * targetWidth;\n const dy = Math.abs(py - fCenterY + centerOffsetY) * invHalfH;\n for (let px = b.x; px < endX; px++) {\n const idx = rowOffset + px;\n const dx = Math.abs(px - fCenterX + centerOffsetX) * invHalfW;\n const dist = dx > dy ? dx : dy;\n const strength = fallOff(dist);\n const maskVal = strength * 255 | 0;\n if (maskVal <= 0) continue;\n let weight = alpha;\n if (isOpaque) {\n weight = maskVal;\n } else if (maskVal !== 255) {\n weight = maskVal * alpha + 128 >> 8;\n }\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) continue;\n finalCol = (a << 24 | baseColor) >>> 0 as Color32;\n }\n data32[idx] = blendFn(finalCol, data32[idx] as Color32);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIElQaXhlbERhdGEsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzIH0gZnJvbSAnLi4vUmVjdC9nZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEoXG4gIHRhcmdldDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuICBicnVzaFdpZHRoOiBudW1iZXIsXG4gIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gIGFscGhhID0gMjU1LFxuICBmYWxsT2ZmOiAoZGlzdDogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBib3VuZHM/OiBSZWN0LFxuKTogdm9pZCB7XG4gIGNvbnN0IHRhcmdldFdpZHRoID0gdGFyZ2V0LndpZHRoXG4gIGNvbnN0IHRhcmdldEhlaWdodCA9IHRhcmdldC5oZWlnaHRcblxuICBjb25zdCBiID0gYm91bmRzID8/IGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgIGNlbnRlclgsXG4gICAgY2VudGVyWSxcbiAgICBicnVzaFdpZHRoLFxuICAgIGJydXNoSGVpZ2h0LFxuICAgIHRhcmdldFdpZHRoLFxuICAgIHRhcmdldEhlaWdodCxcbiAgKVxuXG4gIGlmIChiLncgPD0gMCB8fCBiLmggPD0gMCkgcmV0dXJuXG5cbiAgY29uc3QgZGF0YTMyID0gdGFyZ2V0LmRhdGEzMlxuICBjb25zdCBiYXNlQ29sb3IgPSBjb2xvciAmIDB4MDBmZmZmZmZcbiAgY29uc3QgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0XG4gIGNvbnN0IGlzT3BhcXVlID0gYWxwaGEgPT09IDI1NVxuXG4gIGNvbnN0IGludkhhbGZXID0gMSAvIChicnVzaFdpZHRoIC8gMilcbiAgY29uc3QgaW52SGFsZkggPSAxIC8gKGJydXNoSGVpZ2h0IC8gMilcblxuICAvLyBSZXN0b3JlIHRoZSBwaXhlbC1hcnQgY2VudGVyaW5nIGxvZ2ljXG4gIGNvbnN0IGNlbnRlck9mZnNldFggPSAoYnJ1c2hXaWR0aCAlIDIgPT09IDApID8gMC41IDogMFxuICBjb25zdCBjZW50ZXJPZmZzZXRZID0gKGJydXNoSGVpZ2h0ICUgMiA9PT0gMCkgPyAwLjUgOiAwXG4gIGNvbnN0IGZDZW50ZXJYID0gTWF0aC5mbG9vcihjZW50ZXJYKVxuICBjb25zdCBmQ2VudGVyWSA9IE1hdGguZmxvb3IoY2VudGVyWSlcblxuICBjb25zdCBlbmRYID0gYi54ICsgYi53XG4gIGNvbnN0IGVuZFkgPSBiLnkgKyBiLmhcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlXG5cbiAgZm9yIChsZXQgcHkgPSBiLnk7IHB5IDwgZW5kWTsgcHkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IHB5ICogdGFyZ2V0V2lkdGhcbiAgICBjb25zdCBkeSA9IE1hdGguYWJzKChweSAtIGZDZW50ZXJZKSArIGNlbnRlck9mZnNldFkpICogaW52SGFsZkhcblxuICAgIGZvciAobGV0IHB4ID0gYi54OyBweCA8IGVuZFg7IHB4KyspIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJvd09mZnNldCArIHB4XG5cbiAgICAgIGNvbnN0IGR4ID0gTWF0aC5hYnMoKHB4IC0gZkNlbnRlclgpICsgY2VudGVyT2Zmc2V0WCkgKiBpbnZIYWxmV1xuICAgICAgY29uc3QgZGlzdCA9IGR4ID4gZHkgPyBkeCA6IGR5XG5cbiAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZihkaXN0KVxuICAgICAgY29uc3QgbWFza1ZhbCA9IChzdHJlbmd0aCAqIDI1NSkgfCAwXG5cbiAgICAgIGlmIChtYXNrVmFsIDw9IDApIGNvbnRpbnVlXG5cbiAgICAgIGxldCB3ZWlnaHQgPSBhbHBoYVxuXG4gICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgd2VpZ2h0ID0gbWFza1ZhbFxuICAgICAgfSBlbHNlIGlmIChtYXNrVmFsICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gKG1hc2tWYWwgKiBhbHBoYSArIDEyOCkgPj4gOFxuICAgICAgfVxuXG4gICAgICBsZXQgZmluYWxDb2wgPSBjb2xvclxuXG4gICAgICBpZiAod2VpZ2h0IDwgMjU1KSB7XG4gICAgICAgIGNvbnN0IGEgPSAoYmFzZVNyY0FscGhhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG5cbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSBjb250aW51ZVxuXG4gICAgICAgIGZpbmFsQ29sID0gKChhIDw8IDI0KSB8IGJhc2VDb2xvcikgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkYXRhMzJbaWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRhdGEzMltpZHhdIGFzIENvbG9yMzIpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { applyRectBrushToPixelData } from '../../PixelData/applyRectBrushToPixelData';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nconst defaults = {\n applyRectBrushToPixelData,\n getRectBrushOrPencilBounds\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyRectBrush = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyRectBrushToPixelData = defaults.applyRectBrushToPixelData,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectBrush(color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn?: BlendColor32) {\n const bounds = getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyRectBrushToPixelData(writer.target, color, centerX, centerY, brushWidth, brushHeight, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseVJlY3RCcnVzaCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEgPSBkZWZhdWx0cy5hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhLFxuICAgIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYm91bmRzT3V0OiBSZWN0ID0geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5UmVjdEJydXNoKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBjZW50ZXJYOiBudW1iZXIsXG4gICAgICBjZW50ZXJZOiBudW1iZXIsXG4gICAgICBicnVzaFdpZHRoOiBudW1iZXIsXG4gICAgICBicnVzaEhlaWdodDogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBmYWxsT2ZmOiAoZGlzdDogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICkge1xuXG4gICAgICBjb25zdCBib3VuZHMgPSBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyhcbiAgICAgICAgY2VudGVyWCxcbiAgICAgICAgY2VudGVyWSxcbiAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgIHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBib3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gYm91bmRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEoXG4gICAgICAgIHdyaXRlci50YXJnZXQsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaFdpZHRoLFxuICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGZhbGxPZmYsXG4gICAgICAgIGJsZW5kRm4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function getRectBrushOrPencilStrokeBounds(x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, result: Rect): Rect {\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const minX = Math.min(x0, x1) - halfW;\n const minY = Math.min(y0, y1) - halfH;\n const maxX = Math.max(x0, x1) + halfW;\n const maxY = Math.max(y0, y1) + halfH;\n result.x = Math.floor(minX);\n result.y = Math.floor(minY);\n result.w = Math.ceil(maxX - minX);\n result.h = Math.ceil(maxY - minY);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoXG4gIHgwOiBudW1iZXIsXG4gIHkwOiBudW1iZXIsXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIGJydXNoV2lkdGg6IG51bWJlcixcbiAgYnJ1c2hIZWlnaHQ6IG51bWJlcixcbiAgcmVzdWx0OiBSZWN0LFxuKTogUmVjdCB7XG4gIGNvbnN0IGhhbGZXID0gYnJ1c2hXaWR0aCAvIDJcbiAgY29uc3QgaGFsZkggPSBicnVzaEhlaWdodCAvIDJcblxuICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDAsIHgxKSAtIGhhbGZXXG4gIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MCwgeTEpIC0gaGFsZkhcbiAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgwLCB4MSkgKyBoYWxmV1xuICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTAsIHkxKSArIGhhbGZIXG5cbiAgcmVzdWx0LnggPSBNYXRoLmZsb29yKG1pblgpXG4gIHJlc3VsdC55ID0gTWF0aC5mbG9vcihtaW5ZKVxuICByZXN1bHQudyA9IE1hdGguY2VpbChtYXhYIC0gbWluWClcbiAgcmVzdWx0LmggPSBNYXRoLmNlaWwobWF4WSAtIG1pblkpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type AlphaMask, type HistoryMutator, MaskType } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nimport { getRectBrushOrPencilStrokeBounds } from '../../Rect/getRectBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataAlphaMask,\n getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyRectBrushStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds = defaults.getRectBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const rectBrushBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const mask = {\n type: MaskType.ALPHA,\n data: null as unknown as Uint8Array,\n w: 0,\n h: 0\n };\n return {\n applyRectBrushStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getRectBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushWidth, brushHeight, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n mask.data = new Uint8Array(bw * bh);\n mask.w = bw;\n mask.h = bh;\n const maskData = mask.data;\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const invHalfW = 1 / halfW;\n const invHalfH = 1 / halfH;\n\n // Restore the pixel-art centering logic\n const centerOffsetX = brushWidth % 2 === 0 ? 0.5 : 0;\n const centerOffsetY = brushHeight % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const {\n x: rbx,\n y: rby,\n w: rbw,\n h: rbh\n } = getRectBrushOrPencilBounds(px, py, brushWidth, brushHeight, targetWidth, targetHeight, rectBrushBounds);\n writer.accumulator.storeRegionBeforeState(rbx, rby, rbw, rbh);\n const startX = Math.max(bx, rbx);\n const startY = Math.max(by, rby);\n const endX = Math.min(bx + bw, rbx + rbw);\n const endY = Math.min(by + bh, rby + rbh);\n\n // Snapped origin for this specific point on the line\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = Math.abs(my - fPy + centerOffsetY) * invHalfH;\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = Math.abs(mx - fPx + centerOffsetX) * invHalfW;\n const maskIdx = maskRowOffset + (mx - bx);\n const dist = dx > dy ? dx : dy;\n const strength = fallOff!(dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n if (intensity > maskData[maskIdx]) {\n maskData[maskIdx] = intensity;\n }\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataAlphaMask(writer.target, color, mask as AlphaMask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBbHBoYU1hc2ssXG4gIHR5cGUgQmxlbmRDb2xvcjMyLFxuICB0eXBlIENvbG9yMzIsXG4gIHR5cGUgQ29sb3JCbGVuZE9wdGlvbnMsXG4gIHR5cGUgSGlzdG9yeU11dGF0b3IsIE1hc2tUeXBlLFxuICB0eXBlIFJlY3QsXG59IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZvckVhY2hMaW5lUG9pbnQgfSBmcm9tICcuLi8uLi9BbGdvcml0aG0vZm9yRWFjaExpbmVQb2ludCdcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGZvckVhY2hMaW5lUG9pbnQsXG4gIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2ssXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbn1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQXBwbHlSZWN0QnJ1c2hTdHJva2UgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmb3JFYWNoTGluZVBvaW50ID0gZGVmYXVsdHMuZm9yRWFjaExpbmVQb2ludCxcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayxcbiAgICBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyA9IGRlZmF1bHRzLmdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICAgIGdldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzID0gZGVmYXVsdHMuZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMsXG4gIH0gPSBkZXBzXG5cbiAgY29uc3Qgc3Ryb2tlQm91bmRzT3V0OiBSZWN0ID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDAsXG4gIH1cblxuICBjb25zdCByZWN0QnJ1c2hCb3VuZHM6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGJsZW5kQ29sb3JQaXhlbE9wdGlvbnM6IENvbG9yQmxlbmRPcHRpb25zID0ge1xuICAgIGFscGhhOiAyNTUsXG4gICAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3QsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IG1hc2sgPSB7XG4gICAgdHlwZTogTWFza1R5cGUuQUxQSEEsXG4gICAgZGF0YTogbnVsbCBhcyB1bmtub3duIGFzIFVpbnQ4QXJyYXksXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseVJlY3RCcnVzaFN0cm9rZShcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgeDA6IG51bWJlcixcbiAgICAgIHkwOiBudW1iZXIsXG4gICAgICB4MTogbnVtYmVyLFxuICAgICAgeTE6IG51bWJlcixcbiAgICAgIGJydXNoV2lkdGg6IG51bWJlcixcbiAgICAgIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gICAgICBhbHBoYSA9IDI1NSxcbiAgICAgIGZhbGxPZmY6IChkaXN0OiBudW1iZXIpID0+IG51bWJlcixcbiAgICAgIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgICkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4OiBieCxcbiAgICAgICAgeTogYnksXG4gICAgICAgIHc6IGJ3LFxuICAgICAgICBoOiBiaCxcbiAgICAgIH0gPSBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyhcbiAgICAgICAgeDAsXG4gICAgICAgIHkwLFxuICAgICAgICB4MSxcbiAgICAgICAgeTEsXG4gICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgIGJydXNoSGVpZ2h0LFxuICAgICAgICBzdHJva2VCb3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGlmIChidyA8PSAwIHx8IGJoIDw9IDApIHJldHVyblxuXG4gICAgICBtYXNrLmRhdGEgPSBuZXcgVWludDhBcnJheShidyAqIGJoKVxuICAgICAgbWFzay53ID0gYndcbiAgICAgIG1hc2suaCA9IGJoXG5cbiAgICAgIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhXG4gICAgICBjb25zdCBoYWxmVyA9IGJydXNoV2lkdGggLyAyXG4gICAgICBjb25zdCBoYWxmSCA9IGJydXNoSGVpZ2h0IC8gMlxuICAgICAgY29uc3QgaW52SGFsZlcgPSAxIC8gaGFsZldcbiAgICAgIGNvbnN0IGludkhhbGZIID0gMSAvIGhhbGZIXG5cbiAgICAgIC8vIFJlc3RvcmUgdGhlIHBpeGVsLWFydCBjZW50ZXJpbmcgbG9naWNcbiAgICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSAoYnJ1c2hXaWR0aCAlIDIgPT09IDApID8gMC41IDogMFxuICAgICAgY29uc3QgY2VudGVyT2Zmc2V0WSA9IChicnVzaEhlaWdodCAlIDIgPT09IDApID8gMC41IDogMFxuXG4gICAgICBjb25zdCB0YXJnZXRXaWR0aCA9IHdyaXRlci50YXJnZXQud2lkdGhcbiAgICAgIGNvbnN0IHRhcmdldEhlaWdodCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0XG5cbiAgICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IHJieCxcbiAgICAgICAgICB5OiByYnksXG4gICAgICAgICAgdzogcmJ3LFxuICAgICAgICAgIGg6IHJiaCxcbiAgICAgICAgfSA9IGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgICAgICAgIHB4LFxuICAgICAgICAgIHB5LFxuICAgICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0V2lkdGgsXG4gICAgICAgICAgdGFyZ2V0SGVpZ2h0LFxuICAgICAgICAgIHJlY3RCcnVzaEJvdW5kcyxcbiAgICAgICAgKVxuXG4gICAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKFxuICAgICAgICAgIHJieCxcbiAgICAgICAgICByYnksXG4gICAgICAgICAgcmJ3LFxuICAgICAgICAgIHJiaCxcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWF4KGJ4LCByYngpXG4gICAgICAgIGNvbnN0IHN0YXJ0WSA9IE1hdGgubWF4KGJ5LCByYnkpXG4gICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLm1pbihieCArIGJ3LCByYnggKyByYncpXG4gICAgICAgIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihieSArIGJoLCByYnkgKyByYmgpXG5cbiAgICAgICAgLy8gU25hcHBlZCBvcmlnaW4gZm9yIHRoaXMgc3BlY2lmaWMgcG9pbnQgb24gdGhlIGxpbmVcbiAgICAgICAgY29uc3QgZlB4ID0gTWF0aC5mbG9vcihweClcbiAgICAgICAgY29uc3QgZlB5ID0gTWF0aC5mbG9vcihweSlcblxuICAgICAgICBmb3IgKGxldCBteSA9IHN0YXJ0WTsgbXkgPCBlbmRZOyBteSsrKSB7XG4gICAgICAgICAgY29uc3QgZHkgPSBNYXRoLmFicygobXkgLSBmUHkpICsgY2VudGVyT2Zmc2V0WSkgKiBpbnZIYWxmSFxuICAgICAgICAgIGNvbnN0IG1hc2tSb3dPZmZzZXQgPSAobXkgLSBieSkgKiBid1xuXG4gICAgICAgICAgZm9yIChsZXQgbXggPSBzdGFydFg7IG14IDwgZW5kWDsgbXgrKykge1xuICAgICAgICAgICAgY29uc3QgZHggPSBNYXRoLmFicygobXggLSBmUHgpICsgY2VudGVyT2Zmc2V0WCkgKiBpbnZIYWxmV1xuICAgICAgICAgICAgY29uc3QgbWFza0lkeCA9IG1hc2tSb3dPZmZzZXQgKyAobXggLSBieClcblxuICAgICAgICAgICAgY29uc3QgZGlzdCA9IGR4ID4gZHkgPyBkeCA6IGR5XG4gICAgICAgICAgICBjb25zdCBzdHJlbmd0aCA9IGZhbGxPZmYhKGRpc3QpXG5cbiAgICAgICAgICAgIGlmIChzdHJlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgaW50ZW5zaXR5ID0gKHN0cmVuZ3RoICogMjU1KSB8IDBcblxuICAgICAgICAgICAgICBpZiAoaW50ZW5zaXR5ID4gbWFza0RhdGFbbWFza0lkeF0pIHtcbiAgICAgICAgICAgICAgICBtYXNrRGF0YVttYXNrSWR4XSA9IGludGVuc2l0eVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmJsZW5kRm4gPSBibGVuZEZuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmFscGhhID0gYWxwaGFcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMueCA9IGJ4XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnkgPSBieVxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy53ID0gYndcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuaCA9IGJoXG5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2soXG4gICAgICAgIHdyaXRlci50YXJnZXQsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBtYXNrIGFzIEFscGhhTWFzayxcbiAgICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { applyRectBrushToPixelData } from '../../PixelData/applyRectBrushToPixelData';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nconst defaults = {\n applyRectBrushToPixelData,\n getRectBrushOrPencilBounds,\n fallOff: () => 1\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyRectPencil = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyRectBrushToPixelData = defaults.applyRectBrushToPixelData,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n fallOff = defaults.fallOff\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectPencil(color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, blendFn?: BlendColor32) {\n const bounds = getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyRectBrushToPixelData(writer.target, color, centerX, centerY, brushWidth, brushHeight, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICBmYWxsT2ZmOiAoKSA9PiAxLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseVJlY3RQZW5jaWwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhID0gZGVmYXVsdHMuYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSxcbiAgICBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyA9IGRlZmF1bHRzLmdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICAgIGZhbGxPZmYgPSBkZWZhdWx0cy5mYWxsT2ZmXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYm91bmRzT3V0OiBSZWN0ID0geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5UmVjdFBlbmNpbChcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgY2VudGVyWDogbnVtYmVyLFxuICAgICAgY2VudGVyWTogbnVtYmVyLFxuICAgICAgYnJ1c2hXaWR0aDogbnVtYmVyLFxuICAgICAgYnJ1c2hIZWlnaHQ6IG51bWJlcixcbiAgICAgIGFscGhhID0gMjU1LFxuICAgICAgYmxlbmRGbj86IEJsZW5kQ29sb3IzMixcbiAgICApIHtcblxuICAgICAgY29uc3QgYm91bmRzID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgIGJydXNoSGVpZ2h0LFxuICAgICAgICB3cml0ZXIudGFyZ2V0LndpZHRoLFxuICAgICAgICB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgICAgYm91bmRzT3V0LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHgsIHksIHcsIGggfSA9IGJvdW5kc1xuXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuXG4gICAgICBhcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhKFxuICAgICAgICB3cml0ZXIudGFyZ2V0LFxuICAgICAgICBjb2xvcixcbiAgICAgICAgY2VudGVyWCxcbiAgICAgICAgY2VudGVyWSxcbiAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgIGFscGhhLFxuICAgICAgICBmYWxsT2ZmLFxuICAgICAgICBibGVuZEZuLFxuICAgICAgICBib3VuZHMsXG4gICAgICApXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type BinaryMask, type HistoryMutator, MaskType } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nimport { getRectBrushOrPencilStrokeBounds } from '../../Rect/getRectBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds,\n blendColorPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyRectPencilStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds = defaults.getRectBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const rectPencilBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const mask = {\n type: MaskType.BINARY,\n data: null as unknown as Uint8Array,\n w: 0,\n h: 0\n };\n return {\n applyRectPencilStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getRectBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushWidth, brushHeight, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n mask.data = new Uint8Array(bw * bh);\n mask.w = bw;\n mask.h = bh;\n const maskData = mask.data;\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const centerOffset = brushWidth % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const {\n x: rbx,\n y: rby,\n w: rbw,\n h: rbh\n } = getRectBrushOrPencilBounds(px, py, brushWidth, brushHeight, targetWidth, targetHeight, rectPencilBounds);\n writer.accumulator.storeRegionBeforeState(rbx, rby, rbw, rbh);\n const startX = Math.max(bx, rbx);\n const startY = Math.max(by, rby);\n const endX = Math.min(bx + bw, rbx + rbw);\n const endY = Math.min(by + bh, rby + rbh);\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = Math.abs(my - fPy + centerOffset);\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = Math.abs(mx - fPx + centerOffset);\n const maskIdx = maskRowOffset + (mx - bx);\n if (dx <= halfW && dy <= halfH) {\n maskData[maskIdx] = 1;\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataBinaryMask(writer.target, color, mask as BinaryMask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBCaW5hcnlNYXNrLFxuICB0eXBlIEJsZW5kQ29sb3IzMixcbiAgdHlwZSBDb2xvcjMyLFxuICB0eXBlIENvbG9yQmxlbmRPcHRpb25zLFxuICB0eXBlIEhpc3RvcnlNdXRhdG9yLCBNYXNrVHlwZSxcbiAgdHlwZSBSZWN0LFxufSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBmb3JFYWNoTGluZVBvaW50IH0gZnJvbSAnLi4vLi4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGZvckVhY2hMaW5lUG9pbnQsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2ssXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5UmVjdFBlbmNpbFN0cm9rZSA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZvckVhY2hMaW5lUG9pbnQgPSBkZWZhdWx0cy5mb3JFYWNoTGluZVBvaW50LFxuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gICAgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgPSBkZWZhdWx0cy5nZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgICBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyA9IGRlZmF1bHRzLmdldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxuICB9ID0gZGVwc1xuXG4gIGNvbnN0IHN0cm9rZUJvdW5kc091dDogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgcmVjdFBlbmNpbEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgYmxlbmRDb2xvclBpeGVsT3B0aW9uczogQ29sb3JCbGVuZE9wdGlvbnMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgbWFzayA9IHtcbiAgICB0eXBlOiBNYXNrVHlwZS5CSU5BUlksXG4gICAgZGF0YTogbnVsbCBhcyB1bmtub3duIGFzIFVpbnQ4QXJyYXksXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseVJlY3RQZW5jaWxTdHJva2UoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHgwOiBudW1iZXIsXG4gICAgICB5MDogbnVtYmVyLFxuICAgICAgeDE6IG51bWJlcixcbiAgICAgIHkxOiBudW1iZXIsXG4gICAgICBicnVzaFdpZHRoOiBudW1iZXIsXG4gICAgICBicnVzaEhlaWdodDogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBibGVuZEZuOiBCbGVuZENvbG9yMzIgPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeDogYngsXG4gICAgICAgIHk6IGJ5LFxuICAgICAgICB3OiBidyxcbiAgICAgICAgaDogYmgsXG4gICAgICB9ID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoXG4gICAgICAgIHgwLFxuICAgICAgICB5MCxcbiAgICAgICAgeDEsXG4gICAgICAgIHkxLFxuICAgICAgICBicnVzaFdpZHRoLFxuICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgc3Ryb2tlQm91bmRzT3V0LFxuICAgICAgKVxuXG4gICAgICBpZiAoYncgPD0gMCB8fCBiaCA8PSAwKSByZXR1cm5cblxuICAgICAgbWFzay5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoYncgKiBiaClcbiAgICAgIG1hc2sudyA9IGJ3XG4gICAgICBtYXNrLmggPSBiaFxuXG4gICAgICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gICAgICBjb25zdCBoYWxmVyA9IGJydXNoV2lkdGggLyAyXG4gICAgICBjb25zdCBoYWxmSCA9IGJydXNoSGVpZ2h0IC8gMlxuICAgICAgY29uc3QgY2VudGVyT2Zmc2V0ID0gKGJydXNoV2lkdGggJSAyID09PSAwKSA/IDAuNSA6IDBcblxuICAgICAgY29uc3QgdGFyZ2V0V2lkdGggPSB3cml0ZXIudGFyZ2V0LndpZHRoXG4gICAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSB3cml0ZXIudGFyZ2V0LmhlaWdodFxuXG4gICAgICBmb3JFYWNoTGluZVBvaW50KHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4OiByYngsXG4gICAgICAgICAgeTogcmJ5LFxuICAgICAgICAgIHc6IHJidyxcbiAgICAgICAgICBoOiByYmgsXG4gICAgICAgIH0gPSBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyhcbiAgICAgICAgICBweCxcbiAgICAgICAgICBweSxcbiAgICAgICAgICBicnVzaFdpZHRoLFxuICAgICAgICAgIGJydXNoSGVpZ2h0LFxuICAgICAgICAgIHRhcmdldFdpZHRoLFxuICAgICAgICAgIHRhcmdldEhlaWdodCxcbiAgICAgICAgICByZWN0UGVuY2lsQm91bmRzLFxuICAgICAgICApXG5cbiAgICAgICAgd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoXG4gICAgICAgICAgcmJ4LFxuICAgICAgICAgIHJieSxcbiAgICAgICAgICByYncsXG4gICAgICAgICAgcmJoLFxuICAgICAgICApXG5cbiAgICAgICAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoYngsIHJieClcbiAgICAgICAgY29uc3Qgc3RhcnRZID0gTWF0aC5tYXgoYnksIHJieSlcbiAgICAgICAgY29uc3QgZW5kWCA9IE1hdGgubWluKGJ4ICsgYncsIHJieCArIHJidylcbiAgICAgICAgY29uc3QgZW5kWSA9IE1hdGgubWluKGJ5ICsgYmgsIHJieSArIHJiaClcblxuICAgICAgICBjb25zdCBmUHggPSBNYXRoLmZsb29yKHB4KVxuICAgICAgICBjb25zdCBmUHkgPSBNYXRoLmZsb29yKHB5KVxuXG4gICAgICAgIGZvciAobGV0IG15ID0gc3RhcnRZOyBteSA8IGVuZFk7IG15KyspIHtcbiAgICAgICAgICBjb25zdCBkeSA9IE1hdGguYWJzKChteSAtIGZQeSkgKyBjZW50ZXJPZmZzZXQpXG4gICAgICAgICAgY29uc3QgbWFza1Jvd09mZnNldCA9IChteSAtIGJ5KSAqIGJ3XG5cbiAgICAgICAgICBmb3IgKGxldCBteCA9IHN0YXJ0WDsgbXggPCBlbmRYOyBteCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkeCA9IE1hdGguYWJzKChteCAtIGZQeCkgKyBjZW50ZXJPZmZzZXQpXG4gICAgICAgICAgICBjb25zdCBtYXNrSWR4ID0gbWFza1Jvd09mZnNldCArIChteCAtIGJ4KVxuXG4gICAgICAgICAgICBpZiAoZHggPD0gaGFsZlcgJiYgZHkgPD0gaGFsZkgpIHtcbiAgICAgICAgICAgICAgbWFza0RhdGFbbWFza0lkeF0gPSAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmJsZW5kRm4gPSBibGVuZEZuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmFscGhhID0gYWxwaGFcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMueCA9IGJ4XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnkgPSBieVxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy53ID0gYndcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuaCA9IGJoXG5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlci50YXJnZXQsIGNvbG9yLCBtYXNrIGFzIEJpbmFyeU1hc2ssIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendColorPixelData(dst: IPixelData, color: Color32, opts: ColorBlendOptions = {}) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect\n } = opts;\n if (globalAlpha === 0) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n\n // Clipping\n let x = targetX,\n y = targetY,\n w = width,\n h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // Single-color fills can pre-calculate the source color once\n let finalSrcColor = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return;\n finalSrcColor = (color & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const dst32 = dst.data32;\n const dw = dst.width;\n let dIdx = y * dw + x | 0;\n const dStride = dw - actualW | 0;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = blendFn(finalSrcColor, dst32[dIdx] as Color32);\n dIdx++;\n }\n dIdx += dStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIENvbG9yQmxlbmRPcHRpb25zLCB0eXBlIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kQ29sb3JQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIG9wdHM6IENvbG9yQmxlbmRPcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVyblxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2VcbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVyblxuXG4gIC8vIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WCwgeSA9IHRhcmdldFksIHcgPSB3aWR0aCwgaCA9IGhlaWdodFxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIFNpbmdsZS1jb2xvciBmaWxscyBjYW4gcHJlLWNhbGN1bGF0ZSB0aGUgc291cmNlIGNvbG9yIG9uY2VcbiAgbGV0IGZpbmFsU3JjQ29sb3IgPSBjb2xvclxuICBpZiAoZ2xvYmFsQWxwaGEgPCAyNTUpIHtcbiAgICBjb25zdCBhID0gKGJhc2VTcmNBbHBoYSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm5cbiAgICBmaW5hbFNyY0NvbG9yID0gKChjb2xvciAmIDB4MDBmZmZmZmYpIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gIH1cblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxTcmNDb2xvciwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcbiAgICAgIGRJZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData';\nconst defaults = {\n blendColorPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColor = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n blendColorPixelData = defaults.blendColorPixelData\n } = deps;\n return {\n blendColor(color: Color32, opts: ColorBlendOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n blendColorPixelData(writer.target, color, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBDb2xvckJsZW5kT3B0aW9ucywgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHsgYmxlbmRDb2xvclBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JCbGVuZENvbG9yID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YSA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBibGVuZENvbG9yKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBvcHRzOiBDb2xvckJsZW5kT3B0aW9ucyA9IHt9LFxuICAgICkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHcgPSB3cml0ZXIudGFyZ2V0LndpZHRoLFxuICAgICAgICBoID0gd3JpdGVyLnRhcmdldC5oZWlnaHQsXG4gICAgICB9ID0gb3B0c1xuICAgICAgd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaClcbiAgICAgIGJsZW5kQ29sb3JQaXhlbERhdGEod3JpdGVyLnRhcmdldCwgY29sb3IsIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../../_types';\nimport { overwriteFast } from '../../BlendModes/blend-modes-fast';\nexport function mutatorBlendPixel(writer: PixelWriter<any>) {\n return {\n blendPixel(x: number, y: number, color: Color32, alpha: number = 255, blendFn: BlendColor32 = overwriteFast) {\n let target = writer.target;\n let width = target.width;\n let height = target.height;\n if (x < 0 || x >= width || y < 0 || y >= height) return;\n writer.accumulator.storeTileBeforeState(x, y);\n let index = y * width + x;\n let bg = target.data32[index] as Color32;\n let finalColor = color;\n if (alpha < 255) {\n let baseSrcAlpha = color >>> 24;\n let finalAlpha = baseSrcAlpha * alpha + 128 >> 8;\n finalColor = (color & 0x00ffffff | finalAlpha << 24) >>> 0 as Color32;\n }\n target.data32[index] = blendFn(finalColor, bg);\n }\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBvdmVyd3JpdGVGYXN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1mYXN0J1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuZXhwb3J0IGZ1bmN0aW9uIG11dGF0b3JCbGVuZFBpeGVsKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55Pikge1xuICByZXR1cm4ge1xuICAgIGJsZW5kUGl4ZWwoXG4gICAgICB4OiBudW1iZXIsXG4gICAgICB5OiBudW1iZXIsXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIGFscGhhOiBudW1iZXIgPSAyNTUsXG4gICAgICBibGVuZEZuOiBCbGVuZENvbG9yMzIgPSBvdmVyd3JpdGVGYXN0LFxuICAgICkge1xuICAgICAgbGV0IHRhcmdldCA9IHdyaXRlci50YXJnZXRcbiAgICAgIGxldCB3aWR0aCA9IHRhcmdldC53aWR0aFxuICAgICAgbGV0IGhlaWdodCA9IHRhcmdldC5oZWlnaHRcblxuICAgICAgaWYgKHggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA8IDAgfHwgeSA+PSBoZWlnaHQpIHJldHVyblxuXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVUaWxlQmVmb3JlU3RhdGUoeCwgeSlcblxuICAgICAgbGV0IGluZGV4ID0geSAqIHdpZHRoICsgeFxuICAgICAgbGV0IGJnID0gdGFyZ2V0LmRhdGEzMltpbmRleF0gYXMgQ29sb3IzMlxuXG4gICAgICBsZXQgZmluYWxDb2xvciA9IGNvbG9yXG5cbiAgICAgIGlmIChhbHBoYSA8IDI1NSkge1xuICAgICAgICBsZXQgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0XG4gICAgICAgIGxldCBmaW5hbEFscGhhID0gKGJhc2VTcmNBbHBoYSAqIGFscGhhICsgMTI4KSA+PiA4XG5cbiAgICAgICAgZmluYWxDb2xvciA9ICgoKGNvbG9yICYgMHgwMGZmZmZmZikgfCAoZmluYWxBbHBoYSA8PCAyNCkpID4+PiAwKSBhcyBDb2xvcjMyXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5kYXRhMzJbaW5kZXhdID0gYmxlbmRGbihmaW5hbENvbG9yLCBiZylcbiAgICB9LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blits source PixelData into a destination PixelData using 32-bit integer bitwise blending.\n * This function bypasses standard ImageData limitations by operating directly on\n * Uint32Array views. It supports various blend modes, binary/alpha masking, and\n * automatic clipping of both source and destination bounds.\n * @example\n *\n * const dst = new PixelData(ctx.getImageData(0,0,100,100))\n * blendImageData32(dst, sprite, {\n * blendFn: COLOR_32_BLEND_MODES.multiply,\n * mask: brushMask,\n * maskType: MaskType.ALPHA\n * });\n */\nexport function blendPixelData(dst: IPixelData, src: IPixelData, opts: PixelBlendOptions) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n const dst32 = dst.data32;\n const src32 = src.data32;\n const dw = dst.width;\n const sw = src.width;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (!isOpaque) {\n const a = srcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIElQaXhlbERhdGEsIHR5cGUgUGl4ZWxCbGVuZE9wdGlvbnMgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuLyoqXG4gKiBCbGl0cyBzb3VyY2UgUGl4ZWxEYXRhIGludG8gYSBkZXN0aW5hdGlvbiBQaXhlbERhdGEgdXNpbmcgMzItYml0IGludGVnZXIgYml0d2lzZSBibGVuZGluZy5cbiAqIFRoaXMgZnVuY3Rpb24gYnlwYXNzZXMgc3RhbmRhcmQgSW1hZ2VEYXRhIGxpbWl0YXRpb25zIGJ5IG9wZXJhdGluZyBkaXJlY3RseSBvblxuICogVWludDMyQXJyYXkgdmlld3MuIEl0IHN1cHBvcnRzIHZhcmlvdXMgYmxlbmQgbW9kZXMsIGJpbmFyeS9hbHBoYSBtYXNraW5nLCBhbmRcbiAqIGF1dG9tYXRpYyBjbGlwcGluZyBvZiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYm91bmRzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkc3QgPSBuZXcgUGl4ZWxEYXRhKGN0eC5nZXRJbWFnZURhdGEoMCwwLDEwMCwxMDApKVxuICogYmxlbmRJbWFnZURhdGEzMihkc3QsIHNwcml0ZSwge1xuICogICBibGVuZEZuOiBDT0xPUl8zMl9CTEVORF9NT0RFUy5tdWx0aXBseSxcbiAqICAgbWFzazogYnJ1c2hNYXNrLFxuICogICBtYXNrVHlwZTogTWFza1R5cGUuQUxQSEFcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgc3JjOiBJUGl4ZWxEYXRhLFxuICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyxcbikge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgc3g6IHNvdXJjZVggPSAwLFxuICAgIHN5OiBzb3VyY2VZID0gMCxcbiAgICB3OiB3aWR0aCA9IHNyYy53aWR0aCxcbiAgICBoOiBoZWlnaHQgPSBzcmMuaGVpZ2h0LFxuICAgIGFscGhhOiBnbG9iYWxBbHBoYSA9IDI1NSxcbiAgICBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm5cblxuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCBzeCA9IHNvdXJjZVhcbiAgbGV0IHN5ID0gc291cmNlWVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3hcbiAgICB3ICs9IHN4XG4gICAgc3ggPSAwXG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3lcbiAgICBoICs9IHN5XG4gICAgc3kgPSAwXG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyYy53aWR0aCAtIHN4KVxuICBoID0gTWF0aC5taW4oaCwgc3JjLmhlaWdodCAtIHN5KVxuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG5cbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGxldCBzSWR4ID0gKHN5ICogc3cgKyBzeCkgfCAwXG5cbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBzU3RyaWRlID0gKHN3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IGlzT3BhcXVlID0gZ2xvYmFsQWxwaGEgPT09IDI1NVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IGJsZW5kRm4uaXNPdmVyd3JpdGVcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IChzcmNDb2wgPj4+IDI0KVxuXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sXG4gICAgICBpZiAoIWlzT3BhcXVlKSB7XG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG4gICAgICBkSWR4KytcbiAgICAgIHNJZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBzSWR4ICs9IHNTdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { blendPixelData } from '../../PixelData/blendPixelData';\nconst defaults = {\n blendPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixelData = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelData = defaults.blendPixelData\n } = deps;\n return {\n blendPixelData(src: IPixelData, opts: PixelBlendOptions) {\n const {\n x = 0,\n y = 0,\n w = src.width,\n h = src.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n blendPixelData(writer.target, src, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgSVBpeGVsRGF0YSwgUGl4ZWxCbGVuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBibGVuZFBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JCbGVuZFBpeGVsRGF0YSA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBQYXJ0aWFsPERlcHM+ID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kUGl4ZWxEYXRhID0gZGVmYXVsdHMuYmxlbmRQaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBibGVuZFBpeGVsRGF0YShcbiAgICAgIHNyYzogSVBpeGVsRGF0YSxcbiAgICAgIG9wdHM6IFBpeGVsQmxlbmRPcHRpb25zLFxuICAgICkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHcgPSBzcmMud2lkdGgsXG4gICAgICAgIGggPSBzcmMuaGVpZ2h0LFxuICAgICAgfSA9IG9wdHNcbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGJsZW5kUGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIHNyYywgb3B0cylcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link IPixelData} buffer with a solid color.\n *\n * @param dst - The target to modify.\n * @param color - The color to apply.\n * @param rect - Defines the area to fill. If omitted, the entire\n * buffer is filled.\n */\nexport function fillPixelData(dst: IPixelData, color: Color32, rect?: Partial<Rect>): void;\n/**\n * @param dst - The target to modify.\n * @param color - The color to apply.\n * @param x - Starting horizontal coordinate.\n * @param y - Starting vertical coordinate.\n * @param w - Width of the fill area.\n * @param h - Height of the fill area.\n */\nexport function fillPixelData(dst: IPixelData, color: Color32, x: number, y: number, w: number, h: number): void;\nexport function fillPixelData(dst: IPixelData, color: Color32, _x?: Partial<Rect> | number, _y?: number, _w?: number, _h?: number): void {\n let x: number;\n let y: number;\n let w: number;\n let h: number;\n if (typeof _x === 'object') {\n x = _x.x ?? 0;\n y = _x.y ?? 0;\n w = _x.w ?? dst.width;\n h = _x.h ?? dst.height;\n } else if (typeof _x === 'number') {\n x = _x;\n y = _y!;\n w = _w!;\n h = _h!;\n } else {\n x = 0;\n y = 0;\n w = dst.width;\n h = dst.height;\n }\n const clip = resolveRectClipping(x, y, w, h, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return;\n\n // Use the clipped values\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data32;\n const dw = dst.width;\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (actualW === dw && actualH === dst.height && finalX === 0 && finalY === 0) {\n dst32.fill(color);\n return;\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < actualH; iy++) {\n const start = (finalY + iy) * dw + finalX;\n const end = start + actualW;\n dst32.fill(color, start, end);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRSZWN0LCByZXNvbHZlUmVjdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX1JFQ1QgPSBtYWtlQ2xpcHBlZFJlY3QoKVxuXG4vKipcbiAqIEZpbGxzIGEgcmVnaW9uIG9yIHRoZSB7QGxpbmsgSVBpeGVsRGF0YX0gYnVmZmVyIHdpdGggYSBzb2xpZCBjb2xvci5cbiAqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gcmVjdCAtIERlZmluZXMgdGhlIGFyZWEgdG8gZmlsbC4gSWYgb21pdHRlZCwgdGhlIGVudGlyZVxuICogYnVmZmVyIGlzIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIHJlY3Q/OiBQYXJ0aWFsPFJlY3Q+LFxuKTogdm9pZFxuLyoqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gV2lkdGggb2YgdGhlIGZpbGwgYXJlYS5cbiAqIEBwYXJhbSBoIC0gSGVpZ2h0IG9mIHRoZSBmaWxsIGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBjb2xvcjogQ29sb3IzMixcbiAgX3g/OiBQYXJ0aWFsPFJlY3Q+IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGxldCB4OiBudW1iZXJcbiAgbGV0IHk6IG51bWJlclxuICBsZXQgdzogbnVtYmVyXG4gIGxldCBoOiBudW1iZXJcblxuICBpZiAodHlwZW9mIF94ID09PSAnb2JqZWN0Jykge1xuICAgIHggPSBfeC54ID8/IDBcbiAgICB5ID0gX3gueSA/PyAwXG4gICAgdyA9IF94LncgPz8gZHN0LndpZHRoXG4gICAgaCA9IF94LmggPz8gZHN0LmhlaWdodFxuICB9IGVsc2UgaWYgKHR5cGVvZiBfeCA9PT0gJ251bWJlcicpIHtcbiAgICB4ID0gX3hcbiAgICB5ID0gX3khXG4gICAgdyA9IF93IVxuICAgIGggPSBfaCFcbiAgfSBlbHNlIHtcbiAgICB4ID0gMFxuICAgIHkgPSAwXG4gICAgdyA9IGRzdC53aWR0aFxuICAgIGggPSBkc3QuaGVpZ2h0XG4gIH1cblxuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh4LCB5LCB3LCBoLCBkc3Qud2lkdGgsIGRzdC5oZWlnaHQsIFNDUkFUQ0hfUkVDVClcblxuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVyblxuXG4gIC8vIFVzZSB0aGUgY2xpcHBlZCB2YWx1ZXNcbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuXG4gIC8vIE9wdGltaXphdGlvbjogSWYgZmlsbGluZyB0aGUgZW50aXJlIGJ1ZmZlciwgdXNlIHRoZSBuYXRpdmUgLmZpbGwoKVxuICBpZiAoYWN0dWFsVyA9PT0gZHcgJiYgYWN0dWFsSCA9PT0gZHN0LmhlaWdodCAmJiBmaW5hbFggPT09IDAgJiYgZmluYWxZID09PSAwKSB7XG4gICAgZHN0MzIuZmlsbChjb2xvcilcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFJvdy1ieS1yb3cgZmlsbCBmb3IgcGFydGlhbCByZWN0YW5nbGVzXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3Qgc3RhcnQgPSAoZmluYWxZICsgaXkpICogZHcgKyBmaW5hbFhcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGFjdHVhbFdcbiAgICBkc3QzMi5maWxsKGNvbG9yLCBzdGFydCwgZW5kKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32, HistoryMutator } from '../../_types';\nimport { fillPixelData } from '../../PixelData/fillPixelData';\nconst defaults = {\n fillPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorClear = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n clear(rect: Partial<BinaryMaskRect> = {}) {\n const x = rect.x ?? 0;\n const y = rect.y ?? 0;\n const w = rect.w ?? writer.target.width;\n const h = rect.h ?? writer.target.height;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n fillPixelData(writer.target, 0 as Color32, x, y, w, h);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrUmVjdCwgQ29sb3IzMiwgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBmaWxsUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGEnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHsgZmlsbFBpeGVsRGF0YSB9XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckNsZWFyID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZmlsbFBpeGVsRGF0YSA9IGRlZmF1bHRzLmZpbGxQaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBjbGVhcihcbiAgICAgIHJlY3Q6IFBhcnRpYWw8QmluYXJ5TWFza1JlY3Q+ID0ge30sXG4gICAgKSB7XG4gICAgICBjb25zdCB4ID0gcmVjdC54ID8/IDBcbiAgICAgIGNvbnN0IHkgPSByZWN0LnkgPz8gMFxuICAgICAgY29uc3QgdyA9IHJlY3QudyA/PyB3cml0ZXIudGFyZ2V0LndpZHRoXG4gICAgICBjb25zdCBoID0gcmVjdC5oID8/IHdyaXRlci50YXJnZXQuaGVpZ2h0XG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBmaWxsUGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIDAgYXMgQ29sb3IzMiwgeCwgeSwgdywgaClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { fillPixelData } from '../../PixelData/fillPixelData';\nconst defaults = {\n fillPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFill = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n fill(color: Color32, rect: Partial<Rect> = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = rect;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n fillPixelData(writer.target, color, x, y, w, h);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciwgUmVjdCB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvZmlsbFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBmaWxsUGl4ZWxEYXRhIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YSxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGZpbGwoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHJlY3Q6IFBhcnRpYWw8UmVjdD4gPSB7fSxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gd3JpdGVyLnRhcmdldC53aWR0aCxcbiAgICAgICAgaCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgfSA9IHJlY3RcbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBmaWxsUGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIGNvbG9yLCB4LCB5LCB3LCBoKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\nexport function invertPixelData(pixelData: IPixelData, opts: PixelMutateOptions = {}): void {\n const dst = pixelData;\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = pixelData.width,\n h: height = pixelData.height,\n mask,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n const clip = resolveRectClipping(targetX, targetY, width, height, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return;\n const {\n x,\n y,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mask?.w ?? width;\n const dx = x - targetX;\n const dy = y - targetY;\n let dIdx = y * dw + x;\n let mIdx = (my + dy) * mPitch + (mx + dx);\n const dStride = dw - actualW;\n const mStride = mPitch - actualW;\n\n // Optimization: Split loops to avoid checking `if (mask)` for every pixel.\n if (mask) {\n const maskData = mask.data;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = maskData[mIdx];\n const isHit = invertMask ? mVal === 0 : mVal === 1;\n if (isHit) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha (the top 8 bits)\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n dIdx++;\n }\n dIdx += dStride;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFBpeGVsTXV0YXRlT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IG1ha2VDbGlwcGVkUmVjdCwgcmVzb2x2ZVJlY3RDbGlwcGluZyB9IGZyb20gJy4uL0ludGVybmFsL3Jlc29sdmVDbGlwcGluZydcblxuY29uc3QgU0NSQVRDSF9SRUNUID0gbWFrZUNsaXBwZWRSZWN0KClcblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydFBpeGVsRGF0YShcbiAgcGl4ZWxEYXRhOiBJUGl4ZWxEYXRhLFxuICBvcHRzOiBQaXhlbE11dGF0ZU9wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBjb25zdCBkc3QgPSBwaXhlbERhdGFcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gcGl4ZWxEYXRhLndpZHRoLFxuICAgIGg6IGhlaWdodCA9IHBpeGVsRGF0YS5oZWlnaHQsXG4gICAgbWFzayxcbiAgICBteCA9IDAsXG4gICAgbXkgPSAwLFxuICAgIGludmVydE1hc2sgPSBmYWxzZSxcbiAgfSA9IG9wdHNcblxuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh0YXJnZXRYLCB0YXJnZXRZLCB3aWR0aCwgaGVpZ2h0LCBkc3Qud2lkdGgsIGRzdC5oZWlnaHQsIFNDUkFUQ0hfUkVDVClcblxuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVyblxuXG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBtYXNrPy53ID8/IHdpZHRoXG5cbiAgY29uc3QgZHggPSB4IC0gdGFyZ2V0WFxuICBjb25zdCBkeSA9IHkgLSB0YXJnZXRZXG5cbiAgbGV0IGRJZHggPSB5ICogZHcgKyB4XG4gIGxldCBtSWR4ID0gKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpXG5cbiAgY29uc3QgZFN0cmlkZSA9IGR3IC0gYWN0dWFsV1xuICBjb25zdCBtU3RyaWRlID0gbVBpdGNoIC0gYWN0dWFsV1xuXG4gIC8vIE9wdGltaXphdGlvbjogU3BsaXQgbG9vcHMgdG8gYXZvaWQgY2hlY2tpbmcgYGlmIChtYXNrKWAgZm9yIGV2ZXJ5IHBpeGVsLlxuICBpZiAobWFzaykge1xuICAgIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhXG4gICAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICAgIGNvbnN0IG1WYWwgPSBtYXNrRGF0YVttSWR4XVxuICAgICAgICBjb25zdCBpc0hpdCA9IGludmVydE1hc2tcbiAgICAgICAgICA/IG1WYWwgPT09IDBcbiAgICAgICAgICA6IG1WYWwgPT09IDFcblxuICAgICAgICBpZiAoaXNIaXQpIHtcbiAgICAgICAgICAvLyBYT1Igd2l0aCAweDAwRkZGRkZGIGZsaXBzIFJHQiBiaXRzIGFuZCBpZ25vcmVzIEFscGhhICh0aGUgdG9wIDggYml0cylcbiAgICAgICAgICBkc3QzMltkSWR4XSA9IGRzdDMyW2RJZHhdIF4gMHgwMEZGRkZGRlxuICAgICAgICB9XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgIH1cbiAgICAgIGRJZHggKz0gZFN0cmlkZVxuICAgICAgbUlkeCArPSBtU3RyaWRlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgICBkc3QzMltkSWR4XSA9IGRzdDMyW2RJZHhdIF4gMHgwMEZGRkZGRlxuICAgICAgICBkSWR4KytcbiAgICAgIH1cbiAgICAgIGRJZHggKz0gZFN0cmlkZVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { invertPixelData } from '../../PixelData/invertPixelData';\nconst defaults = {\n invertPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorInvert = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n invertPixelData = defaults.invertPixelData\n } = deps;\n return {\n invert(opts: PixelMutateOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n invertPixelData(writer.target, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgUGl4ZWxNdXRhdGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgaW52ZXJ0UGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ludmVydFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBpbnZlcnRQaXhlbERhdGEgfVxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9ySW52ZXJ0ID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgaW52ZXJ0UGl4ZWxEYXRhID0gZGVmYXVsdHMuaW52ZXJ0UGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgaW52ZXJ0KG9wdHM6IFBpeGVsTXV0YXRlT3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuICAgICAgaW52ZXJ0UGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { mutatorApplyAlphaMask } from './PixelMutator/mutatorApplyAlphaMask';\nimport { mutatorApplyBinaryMask } from './PixelMutator/mutatorApplyBinaryMask';\nimport { mutatorApplyCircleBrush } from './PixelMutator/mutatorApplyCircleBrush';\nimport { mutatorApplyCircleBrushStroke } from './PixelMutator/mutatorApplyCircleBrushStroke';\nimport { mutatorApplyCirclePencilStroke } from './PixelMutator/mutatorApplyCirclePencilStroke';\nimport { mutatorApplyRectBrush } from './PixelMutator/mutatorApplyRectBrush';\nimport { mutatorApplyRectBrushStroke } from './PixelMutator/mutatorApplyRectBrushStroke';\nimport { mutatorApplyRectPencil } from './PixelMutator/mutatorApplyRectPencil';\nimport { mutatorApplyRectPencilStroke } from './PixelMutator/mutatorApplyRectPencilStroke';\nimport { mutatorBlendColor } from './PixelMutator/mutatorBlendColor';\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel';\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData';\nimport { mutatorClear } from './PixelMutator/mutatorClear';\nimport { mutatorFill } from './PixelMutator/mutatorFill';\nimport { mutatorInvert } from './PixelMutator/mutatorInvert';\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n ...mutatorApplyAlphaMask(writer),\n ...mutatorApplyBinaryMask(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorBlendColor(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorFill(writer),\n ...mutatorInvert(writer),\n ...mutatorApplyCircleBrush(writer),\n ...mutatorApplyCircleBrushStroke(writer),\n ...mutatorApplyCirclePencilStroke(writer),\n ...mutatorApplyRectBrush(writer),\n ...mutatorApplyRectBrushStroke(writer),\n ...mutatorApplyRectPencil(writer),\n ...mutatorApplyRectPencilStroke(writer),\n ...mutatorClear(writer)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbXV0YXRvckFwcGx5QWxwaGFNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckFwcGx5QWxwaGFNYXNrJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5QmluYXJ5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUJpbmFyeU1hc2snXG5pbXBvcnQgeyBtdXRhdG9yQXBwbHlDaXJjbGVCcnVzaCB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUNpcmNsZUJydXNoJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5Q2lyY2xlQnJ1c2hTdHJva2UgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseUNpcmNsZVBlbmNpbFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUNpcmNsZVBlbmNpbFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RCcnVzaCB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RCcnVzaCdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RCcnVzaFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RCcnVzaFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RQZW5jaWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlSZWN0UGVuY2lsJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5UmVjdFBlbmNpbFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RQZW5jaWxTdHJva2UnXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRDb2xvciB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yJ1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kUGl4ZWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbCdcbmltcG9ydCB7IG11dGF0b3JCbGVuZFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZFBpeGVsRGF0YSdcbmltcG9ydCB7IG11dGF0b3JDbGVhciB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JDbGVhcidcbmltcG9ydCB7IG11dGF0b3JGaWxsIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckZpbGwnXG5pbXBvcnQgeyBtdXRhdG9ySW52ZXJ0IH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckludmVydCdcbmltcG9ydCB0eXBlIHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuL1BpeGVsV3JpdGVyJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUZ1bGxQaXhlbE11dGF0b3Iod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+KSB7XG4gIHJldHVybiB7XG4gICAgLi4ubXV0YXRvckFwcGx5QWxwaGFNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckFwcGx5QmluYXJ5TWFzayh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckJsZW5kUGl4ZWxEYXRhKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3Iod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbCh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JGaWxsKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckludmVydCh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckFwcGx5Q2lyY2xlQnJ1c2god3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckFwcGx5Q2lyY2xlUGVuY2lsU3Ryb2tlKHdyaXRlciksXG5cbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0QnJ1c2god3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0QnJ1c2hTdHJva2Uod3JpdGVyKSxcblxuICAgIC4uLm11dGF0b3JBcHBseVJlY3RQZW5jaWwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0UGVuY2lsU3Ryb2tlKHdyaXRlciksXG5cbiAgICAuLi5tdXRhdG9yQ2xlYXIod3JpdGVyKSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { HistoryManager } from './HistoryManager';\nimport { PixelAccumulator } from './PixelAccumulator';\nimport { PixelEngineConfig } from './PixelEngineConfig';\nimport { applyPatchTiles } from './PixelPatchTiles';\nexport interface PixelWriterOptions {\n maxHistorySteps?: number;\n tileSize?: number;\n historyManager?: HistoryManager;\n}\n\n/**\n * @example\n * const targ = new PixelData(new ImageData(10, 10))\n * const writer = new PixelWriter(targ, (writer) => {\n * return {\n * ...mutatorApplyMask(writer),\n * ...mutatorBlendPixelData(writer),\n * ...mutatorBlendColor(writer),\n * ...mutatorBlendPixel(writer),\n * ...mutatorFill(writer),\n * }\n * })\n *\n * // to import all mutator functions\n * const writer = new PixelWriter(targ, makeFullPixelMutator)\n *\n * writer.withHistory((mutator) => {\n * mutator.applyMask()\n * mutator.blendPixelData()\n * })\n */\nexport class PixelWriter<M> {\n public target: IPixelData;\n public historyManager: HistoryManager;\n public accumulator: PixelAccumulator;\n protected config: PixelEngineConfig;\n readonly mutator: M;\n constructor(target: IPixelData, mutatorFactory: (writer: PixelWriter<any>) => M, {\n tileSize = 256,\n maxHistorySteps = 50,\n historyManager = new HistoryManager(maxHistorySteps)\n }: PixelWriterOptions = {}) {\n this.target = target;\n this.config = new PixelEngineConfig(tileSize);\n this.historyManager = historyManager;\n this.accumulator = new PixelAccumulator(target, this.config);\n this.mutator = mutatorFactory(this);\n }\n withHistory(cb: (mutator: M) => void) {\n cb(this.mutator);\n this.captureHistory();\n }\n captureHistory() {\n const beforeTiles = this.accumulator.beforeTiles;\n if (beforeTiles.length === 0) return;\n const afterTiles = this.accumulator.extractAfterTiles();\n const patch: PixelPatchTiles = {\n beforeTiles: beforeTiles,\n afterTiles: afterTiles\n };\n const target = this.target;\n const tileSize = this.config.tileSize;\n const accumulator = this.accumulator;\n const action: HistoryAction = {\n undo: () => applyPatchTiles(target, patch.beforeTiles, tileSize),\n redo: () => applyPatchTiles(target, patch.afterTiles, tileSize),\n dispose: () => accumulator.recyclePatch(patch)\n };\n this.historyManager.commit(action);\n this.accumulator.reset();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5QWN0aW9uLCBIaXN0b3J5TWFuYWdlciB9IGZyb20gJy4vSGlzdG9yeU1hbmFnZXInXG5pbXBvcnQgeyBQaXhlbEFjY3VtdWxhdG9yIH0gZnJvbSAnLi9QaXhlbEFjY3VtdWxhdG9yJ1xuaW1wb3J0IHsgUGl4ZWxFbmdpbmVDb25maWcgfSBmcm9tICcuL1BpeGVsRW5naW5lQ29uZmlnJ1xuaW1wb3J0IHsgYXBwbHlQYXRjaFRpbGVzLCB0eXBlIFBpeGVsUGF0Y2hUaWxlcyB9IGZyb20gJy4vUGl4ZWxQYXRjaFRpbGVzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsV3JpdGVyT3B0aW9ucyB7XG4gIG1heEhpc3RvcnlTdGVwcz86IG51bWJlclxuICB0aWxlU2l6ZT86IG51bWJlclxuICBoaXN0b3J5TWFuYWdlcj86IEhpc3RvcnlNYW5hZ2VyXG59XG5cbi8qKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRhcmcgPSBuZXcgUGl4ZWxEYXRhKG5ldyBJbWFnZURhdGEoMTAsIDEwKSlcbiAqIGNvbnN0IHdyaXRlciA9IG5ldyBQaXhlbFdyaXRlcih0YXJnLCAod3JpdGVyKSA9PiB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgLi4ubXV0YXRvckFwcGx5TWFzayh3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsRGF0YSh3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZENvbG9yKHdyaXRlciksXG4gKiAgICAgLi4ubXV0YXRvckJsZW5kUGl4ZWwod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yRmlsbCh3cml0ZXIpLFxuICogICB9XG4gKiB9KVxuICpcbiAqIC8vIHRvIGltcG9ydCBhbGwgbXV0YXRvciBmdW5jdGlvbnNcbiAqIGNvbnN0IHdyaXRlciA9IG5ldyBQaXhlbFdyaXRlcih0YXJnLCBtYWtlRnVsbFBpeGVsTXV0YXRvcilcbiAqXG4gKiB3cml0ZXIud2l0aEhpc3RvcnkoKG11dGF0b3IpID0+IHtcbiAqICAgbXV0YXRvci5hcHBseU1hc2soKVxuICogICBtdXRhdG9yLmJsZW5kUGl4ZWxEYXRhKClcbiAqIH0pXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXhlbFdyaXRlcjxNPiB7XG4gIHB1YmxpYyB0YXJnZXQ6IElQaXhlbERhdGFcbiAgcHVibGljIGhpc3RvcnlNYW5hZ2VyOiBIaXN0b3J5TWFuYWdlclxuICBwdWJsaWMgYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3JcbiAgcHJvdGVjdGVkIGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWdcbiAgcmVhZG9ubHkgbXV0YXRvcjogTVxuXG4gIGNvbnN0cnVjdG9yKHRhcmdldDogSVBpeGVsRGF0YSwgbXV0YXRvckZhY3Rvcnk6ICh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4pID0+IE0sIHtcbiAgICB0aWxlU2l6ZSA9IDI1NixcbiAgICBtYXhIaXN0b3J5U3RlcHMgPSA1MCxcbiAgICBoaXN0b3J5TWFuYWdlciA9IG5ldyBIaXN0b3J5TWFuYWdlcihtYXhIaXN0b3J5U3RlcHMpLFxuICB9OiBQaXhlbFdyaXRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGhpcy5jb25maWcgPSBuZXcgUGl4ZWxFbmdpbmVDb25maWcodGlsZVNpemUpXG4gICAgdGhpcy5oaXN0b3J5TWFuYWdlciA9IGhpc3RvcnlNYW5hZ2VyXG4gICAgdGhpcy5hY2N1bXVsYXRvciA9IG5ldyBQaXhlbEFjY3VtdWxhdG9yKHRhcmdldCwgdGhpcy5jb25maWcpXG4gICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvckZhY3RvcnkodGhpcylcbiAgfVxuXG4gIHdpdGhIaXN0b3J5KGNiOiAobXV0YXRvcjogTSkgPT4gdm9pZCkge1xuICAgIGNiKHRoaXMubXV0YXRvcilcblxuICAgIHRoaXMuY2FwdHVyZUhpc3RvcnkoKVxuICB9XG5cbiAgY2FwdHVyZUhpc3RvcnkoKSB7XG4gICAgY29uc3QgYmVmb3JlVGlsZXMgPSB0aGlzLmFjY3VtdWxhdG9yLmJlZm9yZVRpbGVzXG4gICAgaWYgKGJlZm9yZVRpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBhZnRlclRpbGVzID0gdGhpcy5hY2N1bXVsYXRvci5leHRyYWN0QWZ0ZXJUaWxlcygpXG5cbiAgICBjb25zdCBwYXRjaDogUGl4ZWxQYXRjaFRpbGVzID0ge1xuICAgICAgYmVmb3JlVGlsZXM6IGJlZm9yZVRpbGVzLFxuICAgICAgYWZ0ZXJUaWxlczogYWZ0ZXJUaWxlcyxcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5jb25maWcudGlsZVNpemVcbiAgICBjb25zdCBhY2N1bXVsYXRvciA9IHRoaXMuYWNjdW11bGF0b3JcblxuICAgIGNvbnN0IGFjdGlvbjogSGlzdG9yeUFjdGlvbiA9IHtcbiAgICAgIHVuZG86ICgpID0+IGFwcGx5UGF0Y2hUaWxlcyh0YXJnZXQsIHBhdGNoLmJlZm9yZVRpbGVzLCB0aWxlU2l6ZSksXG4gICAgICByZWRvOiAoKSA9PiBhcHBseVBhdGNoVGlsZXModGFyZ2V0LCBwYXRjaC5hZnRlclRpbGVzLCB0aWxlU2l6ZSksXG4gICAgICBkaXNwb3NlOiAoKSA9PiBhY2N1bXVsYXRvci5yZWN5Y2xlUGF0Y2gocGF0Y2gpLFxuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuY29tbWl0KGFjdGlvbilcbiAgICB0aGlzLmFjY3VtdWxhdG9yLnJlc2V0KClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { applyCircleBrushToPixelData } from '../../PixelData/applyCircleBrushToPixelData';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nconst defaults = {\n applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n **/\nexport const mutatorApplyCirclePencil = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyCircleBrushToPixelData = defaults.applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCirclePencil(color: Color32, centerX: number, centerY: number, brush: CircleBrushMask, alpha = 255, blendFn?: BlendColor32) {\n const bounds = getCircleBrushOrPencilBounds(centerX, centerY, brush.size, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyCircleBrushToPixelData(writer.target, color, centerX, centerY, brush, alpha, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENpcmNsZUJydXNoTWFzaywgQ29sb3IzMiwgSGlzdG9yeU11dGF0b3IsIFJlY3QgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBhcHBseUNpcmNsZUJydXNoVG9QaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcydcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBhcHBseUNpcmNsZUJydXNoVG9QaXhlbERhdGEsXG4gIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICoqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUNpcmNsZVBlbmNpbCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgfSA9IGRlcHNcblxuICBjb25zdCBib3VuZHNPdXQ6IFJlY3QgPSB7IHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfVxuXG4gIHJldHVybiB7XG4gICAgYXBwbHlDaXJjbGVQZW5jaWwoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIGNlbnRlclg6IG51bWJlcixcbiAgICAgIGNlbnRlclk6IG51bWJlcixcbiAgICAgIGJydXNoOiBDaXJjbGVCcnVzaE1hc2ssXG4gICAgICBhbHBoYSA9IDI1NSxcbiAgICAgIGJsZW5kRm4/OiBCbGVuZENvbG9yMzIsXG4gICAgKSB7XG5cbiAgICAgIGNvbnN0IGJvdW5kcyA9IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoLnNpemUsXG4gICAgICAgIHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBib3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gYm91bmRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YShcbiAgICAgICAgd3JpdGVyLnRhcmdldCxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoLFxuICAgICAgICBhbHBoYSxcbiAgICAgICAgYmxlbmRGbixcbiAgICAgICAgYm91bmRzLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region of the {@link IPixelData} buffer with a solid color using a mask.\n * @param dst - The target to modify.\n * @param color - The color to apply.\n * @param mask - The mask defining the area to fill.\n * @param alpha - The overall opacity of the fill (0-255).\n * @param x - Starting horizontal coordinate for the mask placement.\n * @param y - Starting vertical coordinate for the mask placement.\n */\nexport function fillPixelDataBinaryMask(dst: IPixelData, color: Color32, mask: BinaryMask, alpha = 255, x = 0, y = 0): void {\n if (alpha === 0) return;\n const maskW = mask.w;\n const maskH = mask.h;\n const clip = resolveRectClipping(x, y, maskW, maskH, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return;\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const maskData = mask.data;\n const dst32 = dst.data32;\n const dw = dst.width;\n\n // Pre-calculate the alpha-adjusted color once outside the loop\n let finalCol = color;\n if (alpha < 255) {\n const baseSrcAlpha = color >>> 24;\n const colorRGB = color & 0x00ffffff;\n const a = baseSrcAlpha * alpha + 128 >> 8;\n finalCol = (colorRGB | a << 24) >>> 0 as Color32;\n }\n for (let iy = 0; iy < actualH; iy++) {\n const currentY = finalY + iy;\n const maskY = currentY - y;\n const maskOffset = maskY * maskW;\n const dstRowOffset = currentY * dw;\n for (let ix = 0; ix < actualW; ix++) {\n const currentX = finalX + ix;\n const maskX = currentX - x;\n const maskIndex = maskOffset + maskX;\n if (maskData[maskIndex]) {\n dst32[dstRowOffset + currentX] = finalCol;\n }\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRSZWN0LCByZXNvbHZlUmVjdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX1JFQ1QgPSBtYWtlQ2xpcHBlZFJlY3QoKVxuXG4vKipcbiAqIEZpbGxzIGEgcmVnaW9uIG9mIHRoZSB7QGxpbmsgSVBpeGVsRGF0YX0gYnVmZmVyIHdpdGggYSBzb2xpZCBjb2xvciB1c2luZyBhIG1hc2suXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gbWFzayAtIFRoZSBtYXNrIGRlZmluaW5nIHRoZSBhcmVhIHRvIGZpbGwuXG4gKiBAcGFyYW0gYWxwaGEgLSBUaGUgb3ZlcmFsbCBvcGFjaXR5IG9mIHRoZSBmaWxsICgwLTI1NSkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZSBmb3IgdGhlIG1hc2sgcGxhY2VtZW50LlxuICogQHBhcmFtIHkgLSBTdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlIGZvciB0aGUgbWFzayBwbGFjZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayhcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBjb2xvcjogQ29sb3IzMixcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgYWxwaGEgPSAyNTUsXG4gIHggPSAwLFxuICB5ID0gMCxcbik6IHZvaWQge1xuICBpZiAoYWxwaGEgPT09IDApIHJldHVyblxuXG4gIGNvbnN0IG1hc2tXID0gbWFzay53XG4gIGNvbnN0IG1hc2tIID0gbWFzay5oXG5cbiAgY29uc3QgY2xpcCA9IHJlc29sdmVSZWN0Q2xpcHBpbmcoXG4gICAgeCxcbiAgICB5LFxuICAgIG1hc2tXLFxuICAgIG1hc2tILFxuICAgIGRzdC53aWR0aCxcbiAgICBkc3QuaGVpZ2h0LFxuICAgIFNDUkFUQ0hfUkVDVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuXG5cbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuXG4gIC8vIFByZS1jYWxjdWxhdGUgdGhlIGFscGhhLWFkanVzdGVkIGNvbG9yIG9uY2Ugb3V0c2lkZSB0aGUgbG9vcFxuICBsZXQgZmluYWxDb2wgPSBjb2xvclxuXG4gIGlmIChhbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGJhc2VTcmNBbHBoYSA9IGNvbG9yID4+PiAyNFxuICAgIGNvbnN0IGNvbG9yUkdCID0gY29sb3IgJiAweDAwZmZmZmZmXG4gICAgY29uc3QgYSA9IChiYXNlU3JjQWxwaGEgKiBhbHBoYSArIDEyOCkgPj4gOFxuXG4gICAgZmluYWxDb2wgPSAoKGNvbG9yUkdCIHwgKGEgPDwgMjQpKSA+Pj4gMCkgYXMgQ29sb3IzMlxuICB9XG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBjb25zdCBjdXJyZW50WSA9IGZpbmFsWSArIGl5XG4gICAgY29uc3QgbWFza1kgPSBjdXJyZW50WSAtIHlcbiAgICBjb25zdCBtYXNrT2Zmc2V0ID0gbWFza1kgKiBtYXNrV1xuXG4gICAgY29uc3QgZHN0Um93T2Zmc2V0ID0gY3VycmVudFkgKiBkd1xuXG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRYID0gZmluYWxYICsgaXhcbiAgICAgIGNvbnN0IG1hc2tYID0gY3VycmVudFggLSB4XG4gICAgICBjb25zdCBtYXNrSW5kZXggPSBtYXNrT2Zmc2V0ICsgbWFza1hcblxuICAgICAgaWYgKG1hc2tEYXRhW21hc2tJbmRleF0pIHtcbiAgICAgICAgZHN0MzJbZHN0Um93T2Zmc2V0ICsgY3VycmVudFhdID0gZmluYWxDb2xcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { HistoryMutator } from '../../_types';\nimport { fillPixelDataBinaryMask } from '../../PixelData/fillPixelDataBinaryMask';\nconst defaults = {\n fillPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFillBinaryMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelDataBinaryMask = defaults.fillPixelDataBinaryMask\n } = deps;\n return {\n fillBinaryMask(color: Color32, mask: BinaryMask, alpha = 255, x = 0, y = 0) {\n writer.accumulator.storeRegionBeforeState(x, y, mask.w, mask.h);\n fillPixelDataBinaryMask(writer.target, color, mask, alpha, x, y);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGxCaW5hcnlNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGZpbGxCaW5hcnlNYXNrKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBtYXNrOiBCaW5hcnlNYXNrLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICB4ID0gMCxcbiAgICAgIHkgPSAwLFxuICAgICkge1xuICAgICAgd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgbWFzay53LCBtYXNrLmgpXG4gICAgICBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIudGFyZ2V0LCBjb2xvciwgbWFzaywgYWxwaGEsIHgsIHkpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function copyImageData({\n data,\n width,\n height\n}: ImageDataLike): ImageData {\n return new ImageData(data.slice(), width, height);\n}\nexport function copyImageDataLike({\n data,\n width,\n height\n}: ImageDataLike): ImageDataLike {\n return {\n data: data.slice(),\n width,\n height\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29weUltYWdlRGF0YSh7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfTogSW1hZ2VEYXRhTGlrZSk6IEltYWdlRGF0YSB7XG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGRhdGEuc2xpY2UoKSwgd2lkdGgsIGhlaWdodClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJbWFnZURhdGFMaWtlKHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9OiBJbWFnZURhdGFMaWtlKTogSW1hZ2VEYXRhTGlrZSB7XG4gIHJldHVybiB7XG4gICAgZGF0YTogZGF0YS5zbGljZSgpLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function makeImageDataLike(width: number, height: number, data?: Buffer): ImageDataLike {\n const size = width * height * 4;\n const buffer = data ? new Uint8ClampedArray(data.buffer, data.byteOffset, size) : new Uint8ClampedArray(size);\n return {\n width,\n height,\n data: buffer\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUltYWdlRGF0YUxpa2Uod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE/OiBCdWZmZXIpOiBJbWFnZURhdGFMaWtlIHtcbiAgY29uc3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogNFxuICBjb25zdCBidWZmZXIgPSBkYXRhXG4gICAgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgc2l6ZSlcbiAgICA6IG5ldyBVaW50OENsYW1wZWRBcnJheShzaXplKVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkYXRhOiBidWZmZXIsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Extracts the alpha channel from raw ImageData into an AlphaMask.\n * When possible use {@link pixelDataToAlphaMask} instead.\n * Repeat calls to the same data will use less memory.\n */\nexport function imageDataToAlphaMaskBuffer(imageData: ImageData): Uint8Array {\n const {\n width,\n height,\n data\n } = imageData;\n\n // Create a 32-bit view of the existing buffer\n const data32 = new Uint32Array(data.buffer, data.byteOffset, data.byteLength >> 2);\n const len = data32.length;\n const mask = new Uint8Array(width * height);\n for (let i = 0; i < len; i++) {\n const val = data32[i];\n\n // Extract Alpha (top 8 bits in Little-Endian/ABGR)\n mask[i] = val >>> 24 & 0xff;\n }\n return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGl4ZWxEYXRhVG9BbHBoYU1hc2sgfSBmcm9tICcuLi9QaXhlbERhdGEvcGl4ZWxEYXRhVG9BbHBoYU1hc2snXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSByYXcgSW1hZ2VEYXRhIGludG8gYW4gQWxwaGFNYXNrLlxuICogV2hlbiBwb3NzaWJsZSB1c2Uge0BsaW5rIHBpeGVsRGF0YVRvQWxwaGFNYXNrfSBpbnN0ZWFkLlxuICogUmVwZWF0IGNhbGxzIHRvIHRoZSBzYW1lIGRhdGEgd2lsbCB1c2UgbGVzcyBtZW1vcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZURhdGFUb0FscGhhTWFza0J1ZmZlcihcbiAgaW1hZ2VEYXRhOiBJbWFnZURhdGEsXG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkYXRhLFxuICB9ID0gaW1hZ2VEYXRhXG5cbiAgLy8gQ3JlYXRlIGEgMzItYml0IHZpZXcgb2YgdGhlIGV4aXN0aW5nIGJ1ZmZlclxuICBjb25zdCBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkoXG4gICAgZGF0YS5idWZmZXIsXG4gICAgZGF0YS5ieXRlT2Zmc2V0LFxuICAgIGRhdGEuYnl0ZUxlbmd0aCA+PiAyLFxuICApXG4gIGNvbnN0IGxlbiA9IGRhdGEzMi5sZW5ndGhcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0KVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhMzJbaV1cblxuICAgIC8vIEV4dHJhY3QgQWxwaGEgKHRvcCA4IGJpdHMgaW4gTGl0dGxlLUVuZGlhbi9BQkdSKVxuICAgIG1hc2tbaV0gPSAodmFsID4+PiAyNCkgJiAweGZmXG4gIH1cblxuICByZXR1cm4gbWFza1xufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeReusableCanvas } from '../Canvas/ReusableCanvas';\nconst get = makeReusableCanvas();\n\n/**\n * Converts an {@link ImageData} object into a base64-encoded Data URL string.\n *\n * @param imageData - The pixel data to be converted.\n *\n * @returns A string representing the image in `image/png` format as a\n * [Data URL](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data).\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n * @example\n * ```typescript\n * const dataUrl = imageDataToDataUrl(imageData);\n * const img = new Image();\n * img.src = dataUrl;\n * ```\n */\nexport function imageDataToDataUrl(imageData: ImageData): string {\n const {\n canvas,\n ctx\n } = get(imageData.width, imageData.height);\n ctx.putImageData(imageData, 0, 0);\n return canvas.toDataURL();\n}\nimageDataToDataUrl.reset = get.reset;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFrZVJldXNhYmxlQ2FudmFzIH0gZnJvbSAnLi4vQ2FudmFzL1JldXNhYmxlQ2FudmFzJ1xuXG5jb25zdCBnZXQgPSBtYWtlUmV1c2FibGVDYW52YXMoKVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIHtAbGluayBJbWFnZURhdGF9IG9iamVjdCBpbnRvIGEgYmFzZTY0LWVuY29kZWQgRGF0YSBVUkwgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBpbWFnZURhdGEgLSBUaGUgcGl4ZWwgZGF0YSB0byBiZSBjb252ZXJ0ZWQuXG4gKlxuICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBpbWFnZSBpbiBgaW1hZ2UvcG5nYCBmb3JtYXQgYXMgYVxuICogW0RhdGEgVVJMXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9VUkkvUmVmZXJlbmNlL1NjaGVtZXMvZGF0YSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHtAbGluayBIVE1MQ2FudmFzRWxlbWVudH0gY29udGV4dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGF0YVVybCA9IGltYWdlRGF0YVRvRGF0YVVybChpbWFnZURhdGEpO1xuICogY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gKiBpbWcuc3JjID0gZGF0YVVybDtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VEYXRhVG9EYXRhVXJsKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjYW52YXMsIGN0eCB9ID0gZ2V0KGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodClcblxuICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMClcbiAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoKVxufVxuXG5pbWFnZURhdGFUb0RhdGFVcmwucmVzZXQgPSBnZXQucmVzZXRcbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * converts {@link ImageData} to a faster Uint32Array\n */\nexport function imageDataToUInt32Array(imageData: ImageDataLike): Uint32Array {\n return new Uint32Array(imageData.data.buffer, imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIGNvbnZlcnRzIHtAbGluayBJbWFnZURhdGF9IHRvIGEgZmFzdGVyIFVpbnQzMkFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSk6IFVpbnQzMkFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShcbiAgICBpbWFnZURhdGEuZGF0YS5idWZmZXIsXG4gICAgaW1hZ2VEYXRhLmRhdGEuYnl0ZU9mZnNldCxcbiAgICAvLyBTaGlmdCByaWdodCBieSAyIGlzIGEgZmFzdCBiaXR3aXNlIGRpdmlzaW9uIGJ5IDQuXG4gICAgaW1hZ2VEYXRhLmRhdGEuYnl0ZUxlbmd0aCA+PiAyLFxuICApXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function invertImageData(imageData: ImageData) {\n const data = imageData.data;\n let length = data.length;\n for (let i = 0; i < length; i += 4) {\n data[i] = 255 - data[i]!;\n data[i + 1] = 255 - data[i + 1]!;\n data[i + 2] = 255 - data[i + 2]!;\n }\n return imageData;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGludmVydEltYWdlRGF0YShpbWFnZURhdGE6IEltYWdlRGF0YSkge1xuICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGFcbiAgbGV0IGxlbmd0aCA9IGRhdGEubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICBkYXRhW2ldID0gMjU1IC0gZGF0YVtpXSFcbiAgICBkYXRhW2kgKyAxXSA9IDI1NSAtIGRhdGFbaSArIDFdIVxuICAgIGRhdGFbaSArIDJdID0gMjU1IC0gZGF0YVtpICsgMl0hXG4gIH1cbiAgcmV0dXJuIGltYWdlRGF0YVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","const resample32Scratch = {\n data: null as null | Int32Array,\n width: 0,\n height: 0\n};\n\n/**\n * @internal\n */\ntype Resample32Result = {\n data: Int32Array;\n width: number;\n height: number;\n};\n\n/**\n * @internal\n */\nexport function resample32(srcData32: Uint32Array | Int32Array, srcW: number, srcH: number, factor: number): Resample32Result {\n const dstW = Math.max(1, srcW * factor | 0);\n const dstH = Math.max(1, srcH * factor | 0);\n const dstData = new Int32Array(dstW * dstH);\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW;\n const scaleY = srcH / dstH;\n for (let y = 0; y < dstH; y++) {\n const srcY = Math.min(srcH - 1, y * scaleY | 0);\n const srcRowOffset = srcY * srcW;\n const dstRowOffset = y * dstW;\n for (let x = 0; x < dstW; x++) {\n const srcX = Math.min(srcW - 1, x * scaleX | 0);\n dstData[dstRowOffset + x] = srcData32[srcRowOffset + srcX]!;\n }\n }\n resample32Scratch.data = dstData;\n resample32Scratch.width = dstW;\n resample32Scratch.height = dstH;\n return resample32Scratch as Resample32Result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmVzYW1wbGUzMlNjcmF0Y2ggPSB7XG4gIGRhdGE6IG51bGwgYXMgbnVsbCB8IEludDMyQXJyYXksXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG59XG5cbi8qKlxuICogIEBpbnRlcm5hbFxuICovXG50eXBlIFJlc2FtcGxlMzJSZXN1bHQgPSB7IGRhdGE6IEludDMyQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cblxuLyoqXG4gKiAgQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNhbXBsZTMyKFxuICBzcmNEYXRhMzI6IFVpbnQzMkFycmF5IHwgSW50MzJBcnJheSxcbiAgc3JjVzogbnVtYmVyLFxuICBzcmNIOiBudW1iZXIsXG4gIGZhY3RvcjogbnVtYmVyLFxuKTogUmVzYW1wbGUzMlJlc3VsdCB7XG4gIGNvbnN0IGRzdFcgPSBNYXRoLm1heCgxLCAoc3JjVyAqIGZhY3RvcikgfCAwKVxuICBjb25zdCBkc3RIID0gTWF0aC5tYXgoMSwgKHNyY0ggKiBmYWN0b3IpIHwgMClcbiAgY29uc3QgZHN0RGF0YSA9IG5ldyBJbnQzMkFycmF5KGRzdFcgKiBkc3RIKVxuXG4gIC8vIFVzZSB0aGUgcmVjaXByb2NhbCB0byBtYXAgYmFjayBwcmVjaXNlbHlcbiAgY29uc3Qgc2NhbGVYID0gc3JjVyAvIGRzdFdcbiAgY29uc3Qgc2NhbGVZID0gc3JjSCAvIGRzdEhcblxuICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzdEg7IHkrKykge1xuICAgIGNvbnN0IHNyY1kgPSBNYXRoLm1pbihzcmNIIC0gMSwgKHkgKiBzY2FsZVkpIHwgMClcbiAgICBjb25zdCBzcmNSb3dPZmZzZXQgPSBzcmNZICogc3JjV1xuICAgIGNvbnN0IGRzdFJvd09mZnNldCA9IHkgKiBkc3RXXG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGRzdFc7IHgrKykge1xuICAgICAgY29uc3Qgc3JjWCA9IE1hdGgubWluKHNyY1cgLSAxLCAoeCAqIHNjYWxlWCkgfCAwKVxuXG4gICAgICBkc3REYXRhW2RzdFJvd09mZnNldCArIHhdID0gc3JjRGF0YTMyW3NyY1Jvd09mZnNldCArIHNyY1hdIVxuICAgIH1cbiAgfVxuXG4gIHJlc2FtcGxlMzJTY3JhdGNoLmRhdGEgPSBkc3REYXRhXG4gIHJlc2FtcGxlMzJTY3JhdGNoLndpZHRoID0gZHN0V1xuICByZXNhbXBsZTMyU2NyYXRjaC5oZWlnaHQgPSBkc3RIXG5cbiAgcmV0dXJuIHJlc2FtcGxlMzJTY3JhdGNoIGFzIFJlc2FtcGxlMzJSZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer);\n const {\n data,\n width,\n height\n } = resample32(src32, source.width, source.height, factor);\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>;\n return new ImageData(uint8ClampedArray, width, height);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNhbXBsZXMgSW1hZ2VEYXRhIGJ5IGEgc3BlY2lmaWMgZmFjdG9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5pbXBvcnQgeyByZXNhbXBsZTMyIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzYW1wbGUzMidcblxuLyoqXG4gKiBSZXNhbXBsZXMgSW1hZ2VEYXRhIGJ5IGEgc3BlY2lmaWMgZmFjdG9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVJbWFnZURhdGEoc291cmNlOiBJbWFnZURhdGEsIGZhY3RvcjogbnVtYmVyKTogSW1hZ2VEYXRhIHtcbiAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc291cmNlLmRhdGEuYnVmZmVyKVxuICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfSA9IHJlc2FtcGxlMzIoc3JjMzIsIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCwgZmFjdG9yKVxuXG4gIGNvbnN0IHVpbnQ4Q2xhbXBlZEFycmF5ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEuYnVmZmVyKSBhcyBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlcj5cbiAgcmV0dXJuIG5ldyBJbWFnZURhdGEodWludDhDbGFtcGVkQXJyYXksIHdpZHRoLCBoZWlnaHQpXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Non destructively resizes the {@link ImageData} buffer to new dimensions, optionally\n * offsetting the original content.\n * This operation creates a new buffer. It does not scale or stretch pixels;\n * instead, it crops or pads the image based on the new dimensions and\n * provides an offset for repositioning.\n *\n * @param target The target to resize.\n * @param newWidth The target width in pixels.\n * @param newHeight The target height in pixels.\n * @param offsetX The horizontal offset for placing the\n * original image within the new buffer.\n * @param offsetY The vertical offset for placing the\n * original image within the new buffer.\n *\n * @returns A new {@link ImageData} instance with the specified dimensions.\n *\n * @example\n * ```typescript\n * // Centers an 80x80 image in a new 100x100 buffer\n * const resized = resizeImageData(\n * originalData,\n * 100,\n * 100,\n * 10,\n * 10\n * );\n * ```\n */\nexport function resizeImageData(target: ImageDataLike, newWidth: number, newHeight: number, offsetX = 0, offsetY = 0): ImageData {\n const result = new ImageData(newWidth, newHeight);\n const {\n width: oldW,\n height: oldH,\n data: oldData\n } = target;\n const newData = result.data;\n\n // Determine intersection of the old image (at offset) and new canvas bounds\n const x0 = Math.max(0, offsetX);\n const y0 = Math.max(0, offsetY);\n const x1 = Math.min(newWidth, offsetX + oldW);\n const y1 = Math.min(newHeight, offsetY + oldH);\n if (x1 <= x0 || y1 <= y0) {\n return result;\n }\n const rowCount = y1 - y0;\n const rowLen = (x1 - x0) * 4;\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row;\n const srcY = dstY - offsetY;\n const srcX = x0 - offsetX;\n const dstStart = (dstY * newWidth + x0) * 4;\n const srcStart = (srcY * oldW + srcX) * 4;\n newData.set(oldData.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIE5vbiBkZXN0cnVjdGl2ZWx5IHJlc2l6ZXMgdGhlIHtAbGluayBJbWFnZURhdGF9IGJ1ZmZlciB0byBuZXcgZGltZW5zaW9ucywgb3B0aW9uYWxseVxuICogb2Zmc2V0dGluZyB0aGUgb3JpZ2luYWwgY29udGVudC5cbiAqIFRoaXMgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYnVmZmVyLiBJdCBkb2VzIG5vdCBzY2FsZSBvciBzdHJldGNoIHBpeGVscztcbiAqIGluc3RlYWQsIGl0IGNyb3BzIG9yIHBhZHMgdGhlIGltYWdlIGJhc2VkIG9uIHRoZSBuZXcgZGltZW5zaW9ucyBhbmRcbiAqIHByb3ZpZGVzIGFuIG9mZnNldCBmb3IgcmVwb3NpdGlvbmluZy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gcmVzaXplLlxuICogQHBhcmFtIG5ld1dpZHRoIFRoZSB0YXJnZXQgd2lkdGggaW4gcGl4ZWxzLlxuICogQHBhcmFtIG5ld0hlaWdodCBUaGUgdGFyZ2V0IGhlaWdodCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0gb2Zmc2V0WCBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgZm9yIHBsYWNpbmcgdGhlXG4gKiBvcmlnaW5hbCBpbWFnZSB3aXRoaW4gdGhlIG5ldyBidWZmZXIuXG4gKiBAcGFyYW0gb2Zmc2V0WSBUaGUgdmVydGljYWwgb2Zmc2V0IGZvciBwbGFjaW5nIHRoZVxuICogb3JpZ2luYWwgaW1hZ2Ugd2l0aGluIHRoZSBuZXcgYnVmZmVyLlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBJbWFnZURhdGF9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDZW50ZXJzIGFuIDgweDgwIGltYWdlIGluIGEgbmV3IDEwMHgxMDAgYnVmZmVyXG4gKiBjb25zdCByZXNpemVkID0gcmVzaXplSW1hZ2VEYXRhKFxuICogICBvcmlnaW5hbERhdGEsXG4gKiAgIDEwMCxcbiAqICAgMTAwLFxuICogICAxMCxcbiAqICAgMTBcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUltYWdlRGF0YShcbiAgdGFyZ2V0OiBJbWFnZURhdGFMaWtlLFxuICBuZXdXaWR0aDogbnVtYmVyLFxuICBuZXdIZWlnaHQ6IG51bWJlcixcbiAgb2Zmc2V0WCA9IDAsXG4gIG9mZnNldFkgPSAwLFxuKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEltYWdlRGF0YShuZXdXaWR0aCwgbmV3SGVpZ2h0KVxuICBjb25zdCB7XG4gICAgd2lkdGg6IG9sZFcsXG4gICAgaGVpZ2h0OiBvbGRILFxuICAgIGRhdGE6IG9sZERhdGEsXG4gIH0gPSB0YXJnZXRcbiAgY29uc3QgbmV3RGF0YSA9IHJlc3VsdC5kYXRhXG5cbiAgLy8gRGV0ZXJtaW5lIGludGVyc2VjdGlvbiBvZiB0aGUgb2xkIGltYWdlIChhdCBvZmZzZXQpIGFuZCBuZXcgY2FudmFzIGJvdW5kc1xuICBjb25zdCB4MCA9IE1hdGgubWF4KDAsIG9mZnNldFgpXG4gIGNvbnN0IHkwID0gTWF0aC5tYXgoMCwgb2Zmc2V0WSlcbiAgY29uc3QgeDEgPSBNYXRoLm1pbihuZXdXaWR0aCwgb2Zmc2V0WCArIG9sZFcpXG4gIGNvbnN0IHkxID0gTWF0aC5taW4obmV3SGVpZ2h0LCBvZmZzZXRZICsgb2xkSClcblxuICBpZiAoeDEgPD0geDAgfHwgeTEgPD0geTApIHtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCByb3dDb3VudCA9IHkxIC0geTBcbiAgY29uc3Qgcm93TGVuID0gKHgxIC0geDApICogNFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd0NvdW50OyByb3crKykge1xuICAgIGNvbnN0IGRzdFkgPSB5MCArIHJvd1xuICAgIGNvbnN0IHNyY1kgPSBkc3RZIC0gb2Zmc2V0WVxuICAgIGNvbnN0IHNyY1ggPSB4MCAtIG9mZnNldFhcblxuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKiBuZXdXaWR0aCArIHgwKSAqIDRcbiAgICBjb25zdCBzcmNTdGFydCA9IChzcmNZICogb2xkVyArIHNyY1gpICogNFxuXG4gICAgbmV3RGF0YS5zZXQoXG4gICAgICBvbGREYXRhLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIHJvd0xlbiksXG4gICAgICBkc3RTdGFydCxcbiAgICApXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export type ReusableImageData = ReturnType<typeof makeReusableImageData>;\n\n/**\n * Creates a factory function that manages a single, reusable ImageData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled ImageData instance.\n */\nexport function makeReusableImageData() {\n let imageData: ImageData | null = null;\n\n /**\n * Retrieves an ImageData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached or newly allocated ImageData object.\n */\n return function getReusableImageData(width: number, height: number) {\n const hasInstance = !!imageData;\n const widthMatches = hasInstance && imageData!.width === width;\n const heightMatches = hasInstance && imageData!.height === height;\n if (!widthMatches || !heightMatches) {\n imageData = new ImageData(width, height);\n }\n return imageData!;\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUmV1c2FibGVJbWFnZURhdGEgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlUmV1c2FibGVJbWFnZURhdGE+XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIGEgc2luZ2xlLCByZXVzYWJsZSBJbWFnZURhdGEgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIHVzZWQgdG8gbWluaW1pemUgZ2FyYmFnZSBjb2xsZWN0aW9uIG92ZXJoZWFkIGJ5IHJlY3ljbGluZyB0aGVcbiAqIHVuZGVybHlpbmcgcGl4ZWwgYnVmZmVyIGFjcm9zcyBtdWx0aXBsZSBvcGVyYXRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJldHVybnMgYSBwb29sZWQgSW1hZ2VEYXRhIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJldXNhYmxlSW1hZ2VEYXRhKCkge1xuICBsZXQgaW1hZ2VEYXRhOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gSW1hZ2VEYXRhIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucy5cbiAgICogSWYgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGRpZmZlciBmcm9tIHRoZSBjYWNoZWQgaW5zdGFuY2UsIGEgbmV3IG9uZSBpcyBhbGxvY2F0ZWQuXG4gICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscy5cbiAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBpbiBwaXhlbHMuXG4gICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgYWxsb2NhdGVkIEltYWdlRGF0YSBvYmplY3QuXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UmV1c2FibGVJbWFnZURhdGEod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBoYXNJbnN0YW5jZSA9ICEhaW1hZ2VEYXRhXG4gICAgY29uc3Qgd2lkdGhNYXRjaGVzID0gaGFzSW5zdGFuY2UgJiYgaW1hZ2VEYXRhIS53aWR0aCA9PT0gd2lkdGhcbiAgICBjb25zdCBoZWlnaHRNYXRjaGVzID0gaGFzSW5zdGFuY2UgJiYgaW1hZ2VEYXRhIS5oZWlnaHQgPT09IGhlaWdodFxuXG4gICAgaWYgKCF3aWR0aE1hdGNoZXMgfHwgIWhlaWdodE1hdGNoZXMpIHtcbiAgICAgIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodClcbiAgICB9XG5cbiAgICByZXR1cm4gaW1hZ2VEYXRhIVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_types';\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const uint8 = new Uint8Array(buffer);\n const decoder = new TextDecoder('latin1');\n const binary = decoder.decode(uint8);\n return btoa(binary) as Base64EncodedUInt8Array;\n}\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray<ArrayBuffer> {\n const binary = atob(encoded);\n const bytes = new Uint8ClampedArray(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer)\n };\n}\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any;\n return serializeImageData(imageData) as any;\n}\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n };\n}\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array);\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any;\n}\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any;\n return deserializeImageData(serialized) as any;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCYXNlNjRFbmNvZGVkVUludDhBcnJheSwgSW1hZ2VEYXRhTGlrZSwgU2VyaWFsaXplZEltYWdlRGF0YSB9IGZyb20gJy4uL190eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NEVuY29kZUFycmF5QnVmZmVyKGJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlKTogQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkge1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcilcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignbGF0aW4xJylcbiAgY29uc3QgYmluYXJ5ID0gZGVjb2Rlci5kZWNvZGUodWludDgpXG5cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KSBhcyBCYXNlNjRFbmNvZGVkVUludDhBcnJheVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0RGVjb2RlQXJyYXlCdWZmZXIoZW5jb2RlZDogQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpOiBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlcj4ge1xuICBjb25zdCBiaW5hcnkgPSBhdG9iKGVuY29kZWQpXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJpbmFyeS5sZW5ndGgpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgYnl0ZXNbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKVxuICB9XG4gIHJldHVybiBieXRlc1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBmb3IgdXNlIGluIEpTT04uIFBpeGVsIGRhdGEgaXMgc3RvcmVkIGFzIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUltYWdlRGF0YTxUIGV4dGVuZHMgSW1hZ2VEYXRhTGlrZT4oaW1hZ2VEYXRhOiBUKTogU2VyaWFsaXplZEltYWdlRGF0YSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IGltYWdlRGF0YS53aWR0aCxcbiAgICBoZWlnaHQ6IGltYWdlRGF0YS5oZWlnaHQsXG4gICAgZGF0YTogYmFzZTY0RW5jb2RlQXJyYXlCdWZmZXIoaW1hZ2VEYXRhLmRhdGEuYnVmZmVyKSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTnVsbGFibGVJbWFnZURhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgfCBudWxsPihpbWFnZURhdGE6IFQpOiBUIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBTZXJpYWxpemVkSW1hZ2VEYXRhIHtcbiAgaWYgKCFpbWFnZURhdGEpIHJldHVybiBudWxsIGFzIGFueVxuXG4gIHJldHVybiBzZXJpYWxpemVJbWFnZURhdGEoaW1hZ2VEYXRhKSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUmF3SW1hZ2VEYXRhPFQgZXh0ZW5kcyBTZXJpYWxpemVkSW1hZ2VEYXRhPihzZXJpYWxpemVkOiBUKTogSW1hZ2VEYXRhTGlrZSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHNlcmlhbGl6ZWQud2lkdGgsXG4gICAgaGVpZ2h0OiBzZXJpYWxpemVkLmhlaWdodCxcbiAgICBkYXRhOiBiYXNlNjREZWNvZGVBcnJheUJ1ZmZlcihzZXJpYWxpemVkLmRhdGEgYXMgQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZUltYWdlRGF0YTxUIGV4dGVuZHMgU2VyaWFsaXplZEltYWdlRGF0YT4oc2VyaWFsaXplZDogVCk6IEltYWdlRGF0YSB7XG4gIGNvbnN0IGRhdGEgPSBiYXNlNjREZWNvZGVBcnJheUJ1ZmZlcihzZXJpYWxpemVkLmRhdGEgYXMgQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpXG5cbiAgcmV0dXJuIG5ldyBJbWFnZURhdGEoZGF0YSBhcyBJbWFnZURhdGFBcnJheSwgc2VyaWFsaXplZC53aWR0aCwgc2VyaWFsaXplZC5oZWlnaHQpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVOdWxsYWJsZUltYWdlRGF0YTxUIGV4dGVuZHMgU2VyaWFsaXplZEltYWdlRGF0YSB8IG51bGw+KHNlcmlhbGl6ZWQ6IFQpOiBUIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBJbWFnZURhdGEge1xuICBpZiAoIXNlcmlhbGl6ZWQpIHJldHVybiBudWxsIGFzIGFueVxuICByZXR1cm4gZGVzZXJpYWxpemVJbWFnZURhdGEoc2VyaWFsaXplZCkgYXMgYW55XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function uInt32ArrayToImageData(data: Uint32Array, width: number, height: number): ImageData {\n const buffer = data.buffer as ArrayBuffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n return new ImageData(clampedArray, width, height);\n}\nexport function uInt32ArrayToImageDataLike(data: Uint32Array, width: number, height: number): ImageDataLike {\n const buffer = data.buffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n return {\n width,\n height,\n data: clampedArray\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdUludDMyQXJyYXlUb0ltYWdlRGF0YShcbiAgZGF0YTogVWludDMyQXJyYXksXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgYnVmZmVyID0gZGF0YS5idWZmZXIgYXMgQXJyYXlCdWZmZXJcbiAgY29uc3QgYnl0ZU9mZnNldCA9IGRhdGEuYnl0ZU9mZnNldFxuICBjb25zdCBieXRlTGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoXG4gIGNvbnN0IGNsYW1wZWRBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpXG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGNsYW1wZWRBcnJheSwgd2lkdGgsIGhlaWdodClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVJbnQzMkFycmF5VG9JbWFnZURhdGFMaWtlKFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4pOiBJbWFnZURhdGFMaWtlIHtcbiAgY29uc3QgYnVmZmVyID0gZGF0YS5idWZmZXJcbiAgY29uc3QgYnl0ZU9mZnNldCA9IGRhdGEuYnl0ZU9mZnNldFxuICBjb25zdCBieXRlTGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoXG4gIGNvbnN0IGNsYW1wZWRBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpXG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGRhdGE6IGNsYW1wZWRBcnJheSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_types';\nimport { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Writes image data from a source to a target with support for clipping and alpha masking.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n * @param sx - The x-coordinate in the source to start copying from.\n * @param sy - The y-coordinate in the source to start copying from.\n * @param sw - The width of the rectangle to copy.\n * @param sh - The height of the rectangle to copy.\n * @param mask - An optional Uint8Array mask (0-255). 0 is transparent, 255 is opaque.\n * @param maskType - type of mask\n */\nexport function writeImageData(target: ImageData, source: ImageData, x: number, y: number, sx: number = 0, sy: number = 0, sw: number = source.width, sh: number = source.height, mask: Uint8Array | null = null, maskType: MaskType = MaskType.BINARY): void {\n const dstW = target.width;\n const dstH = target.height;\n const dstData = target.data;\n const srcW = source.width;\n const srcData = source.data;\n const clip = resolveBlitClipping(x, y, sx, sy, sw, sh, dstW, dstH, srcW, source.height, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const useMask = !!mask;\n for (let row = 0; row < copyH; row++) {\n const currentDstY = dstY + row;\n const currentSrcY = srcY + row;\n const dstStart = (currentDstY * dstW + dstX) * 4;\n const srcStart = (currentSrcY * srcW + srcX) * 4;\n if (useMask && mask) {\n for (let ix = 0; ix < copyW; ix++) {\n const mi = currentSrcY * srcW + (srcX + ix);\n const alpha = mask[mi];\n if (alpha === 0) {\n continue;\n }\n const di = dstStart + ix * 4;\n const si = srcStart + ix * 4;\n if (maskType === MaskType.BINARY || alpha === 255) {\n dstData[di] = srcData[si];\n dstData[di + 1] = srcData[si + 1];\n dstData[di + 2] = srcData[si + 2];\n dstData[di + 3] = srcData[si + 3];\n } else {\n const a = alpha / 255;\n const invA = 1 - a;\n dstData[di] = srcData[si] * a + dstData[di] * invA;\n dstData[di + 1] = srcData[si + 1] * a + dstData[di + 1] * invA;\n dstData[di + 2] = srcData[si + 2] * a + dstData[di + 2] * invA;\n dstData[di + 3] = srcData[si + 3] * a + dstData[di + 3] * invA;\n }\n }\n } else {\n const byteLen = copyW * 4;\n const sub = srcData.subarray(srcStart, srcStart + byteLen);\n dstData.set(sub, dstStart);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfQkxJVCA9IG1ha2VDbGlwcGVkQmxpdCgpXG5cbi8qKlxuICogV3JpdGVzIGltYWdlIGRhdGEgZnJvbSBhIHNvdXJjZSB0byBhIHRhcmdldCB3aXRoIHN1cHBvcnQgZm9yIGNsaXBwaW5nIGFuZCBhbHBoYSBtYXNraW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZGVzdGluYXRpb24gSW1hZ2VEYXRhIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBpbiB0aGUgdGFyZ2V0IHdoZXJlIGRyYXdpbmcgc3RhcnRzLlxuICogQHBhcmFtIHkgLSBUaGUgeS1jb29yZGluYXRlIGluIHRoZSB0YXJnZXQgd2hlcmUgZHJhd2luZyBzdGFydHMuXG4gKiBAcGFyYW0gc3ggLSBUaGUgeC1jb29yZGluYXRlIGluIHRoZSBzb3VyY2UgdG8gc3RhcnQgY29weWluZyBmcm9tLlxuICogQHBhcmFtIHN5IC0gVGhlIHktY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbS5cbiAqIEBwYXJhbSBzdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvcHkuXG4gKiBAcGFyYW0gc2ggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdG8gY29weS5cbiAqIEBwYXJhbSBtYXNrIC0gQW4gb3B0aW9uYWwgVWludDhBcnJheSBtYXNrICgwLTI1NSkuIDAgaXMgdHJhbnNwYXJlbnQsIDI1NSBpcyBvcGFxdWUuXG4gKiBAcGFyYW0gbWFza1R5cGUgLSB0eXBlIG9mIG1hc2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhKFxuICB0YXJnZXQ6IEltYWdlRGF0YSxcbiAgc291cmNlOiBJbWFnZURhdGEsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBzeDogbnVtYmVyID0gMCxcbiAgc3k6IG51bWJlciA9IDAsXG4gIHN3OiBudW1iZXIgPSBzb3VyY2Uud2lkdGgsXG4gIHNoOiBudW1iZXIgPSBzb3VyY2UuaGVpZ2h0LFxuICBtYXNrOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4gIG1hc2tUeXBlOiBNYXNrVHlwZSA9IE1hc2tUeXBlLkJJTkFSWSxcbik6IHZvaWQge1xuICBjb25zdCBkc3RXID0gdGFyZ2V0LndpZHRoXG4gIGNvbnN0IGRzdEggPSB0YXJnZXQuaGVpZ2h0XG4gIGNvbnN0IGRzdERhdGEgPSB0YXJnZXQuZGF0YVxuICBjb25zdCBzcmNXID0gc291cmNlLndpZHRoXG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsIHksIHN4LCBzeSwgc3csIHNoLFxuICAgIGRzdFcsIGRzdEgsIHNyY1csIHNvdXJjZS5oZWlnaHQsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IHVzZU1hc2sgPSAhIW1hc2tcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBjdXJyZW50RHN0WSA9IGRzdFkgKyByb3dcbiAgICBjb25zdCBjdXJyZW50U3JjWSA9IHNyY1kgKyByb3dcblxuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGN1cnJlbnREc3RZICogZHN0VyArIGRzdFgpICogNFxuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKGN1cnJlbnRTcmNZICogc3JjVyArIHNyY1gpICogNFxuXG4gICAgaWYgKHVzZU1hc2sgJiYgbWFzaykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGNvcHlXOyBpeCsrKSB7XG4gICAgICAgIGNvbnN0IG1pID0gY3VycmVudFNyY1kgKiBzcmNXICsgKHNyY1ggKyBpeClcbiAgICAgICAgY29uc3QgYWxwaGEgPSBtYXNrW21pXVxuXG4gICAgICAgIGlmIChhbHBoYSA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaSA9IGRzdFN0YXJ0ICsgKGl4ICogNClcbiAgICAgICAgY29uc3Qgc2kgPSBzcmNTdGFydCArIChpeCAqIDQpXG5cbiAgICAgICAgaWYgKG1hc2tUeXBlID09PSBNYXNrVHlwZS5CSU5BUlkgfHwgYWxwaGEgPT09IDI1NSkge1xuICAgICAgICAgIGRzdERhdGFbZGldID0gc3JjRGF0YVtzaV1cbiAgICAgICAgICBkc3REYXRhW2RpICsgMV0gPSBzcmNEYXRhW3NpICsgMV1cbiAgICAgICAgICBkc3REYXRhW2RpICsgMl0gPSBzcmNEYXRhW3NpICsgMl1cbiAgICAgICAgICBkc3REYXRhW2RpICsgM10gPSBzcmNEYXRhW3NpICsgM11cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhID0gYWxwaGEgLyAyNTVcbiAgICAgICAgICBjb25zdCBpbnZBID0gMSAtIGFcblxuICAgICAgICAgIGRzdERhdGFbZGldID0gc3JjRGF0YVtzaV0gKiBhICsgZHN0RGF0YVtkaV0gKiBpbnZBXG4gICAgICAgICAgZHN0RGF0YVtkaSArIDFdID0gc3JjRGF0YVtzaSArIDFdICogYSArIGRzdERhdGFbZGkgKyAxXSAqIGludkFcbiAgICAgICAgICBkc3REYXRhW2RpICsgMl0gPSBzcmNEYXRhW3NpICsgMl0gKiBhICsgZHN0RGF0YVtkaSArIDJdICogaW52QVxuICAgICAgICAgIGRzdERhdGFbZGkgKyAzXSA9IHNyY0RhdGFbc2kgKyAzXSAqIGEgKyBkc3REYXRhW2RpICsgM10gKiBpbnZBXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnl0ZUxlbiA9IGNvcHlXICogNFxuICAgICAgY29uc3Qgc3ViID0gc3JjRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBieXRlTGVuKVxuICAgICAgZHN0RGF0YS5zZXQoc3ViLCBkc3RTdGFydClcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of an {@link ImageData} object.\n *\n * This function performs a direct memory copy from a {@link Uint8ClampedArray}\n * into the target {@link ImageData} buffer. It supports both {@link Rect}\n * objects and discrete coordinates.\n *\n * @param target - The target to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A rect defining the destination region.\n */\nexport function writeImageDataBuffer(target: ImageData, data: Uint8ClampedArray, rect: Rect): void;\n/**\n * @param target - The target to write into.\n * @param data - The source pixel data (RGBA). Must match the width/height.\n * @param x - The starting horizontal coordinate in the target.\n * @param y - The starting vertical coordinate in the target.\n * @param w - The width of the region to write.\n * @param h - The height of the region to write.\n */\nexport function writeImageDataBuffer(target: ImageData, data: Uint8ClampedArray, x: number, y: number, w: number, h: number): void;\nexport function writeImageDataBuffer(target: ImageData, data: Uint8ClampedArray, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const {\n width: dstW,\n height: dstH,\n data: dst\n } = target;\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const dstStart = ((dstY + row) * dstW + dstX) * 4;\n const srcStart = ((srcY + row) * w + srcX) * 4;\n dst.set(data.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIENvcGllcyBhIHBpeGVsIGJ1ZmZlciBpbnRvIGEgc3BlY2lmaWMgcmVnaW9uIG9mIGFuIHtAbGluayBJbWFnZURhdGF9IG9iamVjdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZGlyZWN0IG1lbW9yeSBjb3B5IGZyb20gYSB7QGxpbmsgVWludDhDbGFtcGVkQXJyYXl9XG4gKiBpbnRvIHRoZSB0YXJnZXQge0BsaW5rIEltYWdlRGF0YX0gYnVmZmVyLiBJdCBzdXBwb3J0cyBib3RoIHtAbGluayBSZWN0fVxuICogb2JqZWN0cyBhbmQgZGlzY3JldGUgY29vcmRpbmF0ZXMuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gd3JpdGUgaW50by4gTXVzdCBtYXRjaCB0aGUgcmVjdCB3aWR0aC9oZWlnaHQuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBzb3VyY2UgcGl4ZWwgZGF0YSAoUkdCQSkuXG4gKiBAcGFyYW0gcmVjdCAtIEEgcmVjdCBkZWZpbmluZyB0aGUgZGVzdGluYXRpb24gcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIoXG4gIHRhcmdldDogSW1hZ2VEYXRhLFxuICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgcmVjdDogUmVjdCxcbik6IHZvaWRcbi8qKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gd3JpdGUgaW50by5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHNvdXJjZSBwaXhlbCBkYXRhIChSR0JBKS4gTXVzdCBtYXRjaCB0aGUgd2lkdGgvaGVpZ2h0LlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIHdyaXRlLlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gd3JpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJbWFnZURhdGEsXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIoXG4gIHRhcmdldDogSW1hZ2VEYXRhLFxuICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgX3g6IFJlY3QgfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDogeyB4OiBfeCwgeTogX3khLCB3OiBfdyEsIGg6IF9oISB9XG5cbiAgY29uc3QgeyB3aWR0aDogZHN0VywgaGVpZ2h0OiBkc3RILCBkYXRhOiBkc3QgfSA9IHRhcmdldFxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsXG4gICAgeSxcbiAgICAwLFxuICAgIDAsXG4gICAgdyxcbiAgICBoLFxuICAgIGRzdFcsXG4gICAgZHN0SCxcbiAgICB3LFxuICAgIGgsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IHJvd0xlbiA9IGNvcHlXICogNFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKChkc3RZICsgcm93KSAqIGRzdFcgKyBkc3RYKSAqIDRcbiAgICBjb25zdCBzcmNTdGFydCA9ICgoc3JjWSArIHJvdykgKiB3ICsgc3JjWCkgKiA0XG5cbiAgICBkc3Quc2V0KGRhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgcm93TGVuKSwgZHN0U3RhcnQpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Calculates the frequency of each palette index based on the image data.\n * The index of the returned array maps directly to the index of the palette.\n * @param indexedImage - The source image containing data and palette definitions.\n * @returns A typed array where each entry represents the total count of that palette index.\n */\nexport function getIndexedImageColorCounts(indexedImage: IndexedImage): Int32Array {\n const data = indexedImage.data;\n const palette = indexedImage.palette;\n const frequencies = new Int32Array(palette.length);\n for (let i = 0; i < data.length; i++) {\n const colorIndex = data[i]!;\n frequencies[colorIndex]++;\n }\n return frequencies;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbmRleGVkSW1hZ2UgfSBmcm9tICcuL0luZGV4ZWRJbWFnZS50cydcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBwYWxldHRlIGluZGV4IGJhc2VkIG9uIHRoZSBpbWFnZSBkYXRhLlxuICogVGhlIGluZGV4IG9mIHRoZSByZXR1cm5lZCBhcnJheSBtYXBzIGRpcmVjdGx5IHRvIHRoZSBpbmRleCBvZiB0aGUgcGFsZXR0ZS5cbiAqIEBwYXJhbSBpbmRleGVkSW1hZ2UgLSBUaGUgc291cmNlIGltYWdlIGNvbnRhaW5pbmcgZGF0YSBhbmQgcGFsZXR0ZSBkZWZpbml0aW9ucy5cbiAqIEByZXR1cm5zIEEgdHlwZWQgYXJyYXkgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIHRoZSB0b3RhbCBjb3VudCBvZiB0aGF0IHBhbGV0dGUgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmRleGVkSW1hZ2VDb2xvckNvdW50cyhpbmRleGVkSW1hZ2U6IEluZGV4ZWRJbWFnZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBkYXRhID0gaW5kZXhlZEltYWdlLmRhdGFcbiAgY29uc3QgcGFsZXR0ZSA9IGluZGV4ZWRJbWFnZS5wYWxldHRlXG4gIGNvbnN0IGZyZXF1ZW5jaWVzID0gbmV3IEludDMyQXJyYXkocGFsZXR0ZS5sZW5ndGgpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY29sb3JJbmRleCA9IGRhdGFbaV0hXG4gICAgZnJlcXVlbmNpZXNbY29sb3JJbmRleF0rK1xuICB9XG5cbiAgcmV0dXJuIGZyZXF1ZW5jaWVzXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\n\n/**\n * Represents an image using a palette-based indexing system.\n * Instead of storing 4 bytes (RGBA) per pixel, this class stores a single index\n * into a color palette. This format is optimized for memory efficiency and\n * high-speed pattern matching or recoloring operations.\n */\nexport class IndexedImage {\n /** The width of the image in pixels. */\n public readonly width: number;\n /** The height of the image in pixels. */\n public readonly height: number;\n /** Flat array of palette indices. Index = x + (y * width). */\n public readonly data: Int32Array;\n /** The palette of unique 32-bit colors (ABGR/RGBA packed) found in the image. */\n public readonly palette: Uint32Array;\n /** The specific index in the palette reserved for fully transparent pixels. */\n public readonly transparentPalletIndex: number;\n\n /**\n * @param width - Image width.\n * @param height - Image height.\n * @param data - The indexed pixel data.\n * @param palette - The array of packed colors.\n * @param transparentPalletIndex - The index representing alpha 0.\n */\n constructor(width: number, height: number, data: Int32Array, palette: Uint32Array, transparentPalletIndex: number) {\n this.width = width;\n this.height = height;\n this.data = data;\n this.palette = palette;\n this.transparentPalletIndex = transparentPalletIndex;\n }\n\n /**\n * Creates an IndexedImage from standard browser ImageData.\n * @param imageData - The source ImageData to convert.\n * @returns A new IndexedImage instance.\n */\n static fromImageData(imageData: ImageData): IndexedImage {\n return IndexedImage.fromRaw(imageData.data, imageData.width, imageData.height);\n }\n\n /**\n * Creates an IndexedImage from a raw byte buffer and dimensions.\n * Any pixel with an alpha channel of 0 is normalized to the transparent palette index.\n * @param data - Raw RGBA byte data.\n * @param width - Image width.\n * @param height - Image height.\n * @returns A new IndexedImage instance.\n */\n static fromRaw(data: Uint8ClampedArray, width: number, height: number): IndexedImage {\n const buffer = data.buffer;\n const rawData = new Uint32Array(buffer);\n const indexedData = new Int32Array(rawData.length);\n const colorMap = new Map<number, number>();\n const transparentColor = 0;\n const transparentPalletIndex = 0;\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex);\n for (let i = 0; i < rawData.length; i++) {\n const pixel = rawData[i] as number;\n const alpha = pixel >>> 24 & 0xFF;\n const isTransparent = alpha === 0;\n const colorKey = isTransparent ? transparentColor : pixel >>> 0;\n let id = colorMap.get(colorKey);\n if (id === undefined) {\n id = colorMap.size;\n colorMap.set(colorKey, id);\n }\n indexedData[i] = id;\n }\n const palette = Uint32Array.from(colorMap.keys());\n return new IndexedImage(width, height, indexedData, palette, transparentPalletIndex);\n }\n\n /**\n * Retrieves the 32-bit packed color value at the given coordinates.\n * @param x - X coordinate.\n * @param y - Y coordinate.\n * @returns The packed color from the palette.\n */\n public getColorAt(x: number, y: number): Color32 {\n const index = x + y * this.width;\n const paletteIndex = this.data[index];\n return this.palette[paletteIndex] as Color32;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1hZ2UgdXNpbmcgYSBwYWxldHRlLWJhc2VkIGluZGV4aW5nIHN5c3RlbS5cbiAqIEluc3RlYWQgb2Ygc3RvcmluZyA0IGJ5dGVzIChSR0JBKSBwZXIgcGl4ZWwsIHRoaXMgY2xhc3Mgc3RvcmVzIGEgc2luZ2xlIGluZGV4XG4gKiBpbnRvIGEgY29sb3IgcGFsZXR0ZS4gVGhpcyBmb3JtYXQgaXMgb3B0aW1pemVkIGZvciBtZW1vcnkgZWZmaWNpZW5jeSBhbmRcbiAqIGhpZ2gtc3BlZWQgcGF0dGVybiBtYXRjaGluZyBvciByZWNvbG9yaW5nIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleGVkSW1hZ2Uge1xuICAvKiogVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuICovXG4gIHB1YmxpYyByZWFkb25seSB3aWR0aDogbnVtYmVyXG4gIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuICovXG4gIHB1YmxpYyByZWFkb25seSBoZWlnaHQ6IG51bWJlclxuICAvKiogRmxhdCBhcnJheSBvZiBwYWxldHRlIGluZGljZXMuIEluZGV4ID0geCArICh5ICogd2lkdGgpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YTogSW50MzJBcnJheVxuICAvKiogVGhlIHBhbGV0dGUgb2YgdW5pcXVlIDMyLWJpdCBjb2xvcnMgKEFCR1IvUkdCQSBwYWNrZWQpIGZvdW5kIGluIHRoZSBpbWFnZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhbGV0dGU6IFVpbnQzMkFycmF5XG4gIC8qKiBUaGUgc3BlY2lmaWMgaW5kZXggaW4gdGhlIHBhbGV0dGUgcmVzZXJ2ZWQgZm9yIGZ1bGx5IHRyYW5zcGFyZW50IHBpeGVscy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYW5zcGFyZW50UGFsbGV0SW5kZXg6IG51bWJlclxuXG4gIC8qKlxuICAgKiBAcGFyYW0gd2lkdGggLSBJbWFnZSB3aWR0aC5cbiAgICogQHBhcmFtIGhlaWdodCAtIEltYWdlIGhlaWdodC5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5kZXhlZCBwaXhlbCBkYXRhLlxuICAgKiBAcGFyYW0gcGFsZXR0ZSAtIFRoZSBhcnJheSBvZiBwYWNrZWQgY29sb3JzLlxuICAgKiBAcGFyYW0gdHJhbnNwYXJlbnRQYWxsZXRJbmRleCAtIFRoZSBpbmRleCByZXByZXNlbnRpbmcgYWxwaGEgMC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGF0YTogSW50MzJBcnJheSxcbiAgICBwYWxldHRlOiBVaW50MzJBcnJheSxcbiAgICB0cmFuc3BhcmVudFBhbGxldEluZGV4OiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMud2lkdGggPSB3aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIHRoaXMucGFsZXR0ZSA9IHBhbGV0dGVcbiAgICB0aGlzLnRyYW5zcGFyZW50UGFsbGV0SW5kZXggPSB0cmFuc3BhcmVudFBhbGxldEluZGV4XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBJbmRleGVkSW1hZ2UgZnJvbSBzdGFuZGFyZCBicm93c2VyIEltYWdlRGF0YS5cbiAgICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIEEgbmV3IEluZGV4ZWRJbWFnZSBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBmcm9tSW1hZ2VEYXRhKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogSW5kZXhlZEltYWdlIHtcbiAgICByZXR1cm4gSW5kZXhlZEltYWdlLmZyb21SYXcoaW1hZ2VEYXRhLmRhdGEsIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEluZGV4ZWRJbWFnZSBmcm9tIGEgcmF3IGJ5dGUgYnVmZmVyIGFuZCBkaW1lbnNpb25zLlxuICAgKiBBbnkgcGl4ZWwgd2l0aCBhbiBhbHBoYSBjaGFubmVsIG9mIDAgaXMgbm9ybWFsaXplZCB0byB0aGUgdHJhbnNwYXJlbnQgcGFsZXR0ZSBpbmRleC5cbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgUkdCQSBieXRlIGRhdGEuXG4gICAqIEBwYXJhbSB3aWR0aCAtIEltYWdlIHdpZHRoLlxuICAgKiBAcGFyYW0gaGVpZ2h0IC0gSW1hZ2UgaGVpZ2h0LlxuICAgKiBAcmV0dXJucyBBIG5ldyBJbmRleGVkSW1hZ2UgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZnJvbVJhdyhcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBJbmRleGVkSW1hZ2Uge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGRhdGEuYnVmZmVyXG4gICAgY29uc3QgcmF3RGF0YSA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpXG4gICAgY29uc3QgaW5kZXhlZERhdGEgPSBuZXcgSW50MzJBcnJheShyYXdEYXRhLmxlbmd0aClcbiAgICBjb25zdCBjb2xvck1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KClcbiAgICBjb25zdCB0cmFuc3BhcmVudENvbG9yID0gMFxuICAgIGNvbnN0IHRyYW5zcGFyZW50UGFsbGV0SW5kZXggPSAwXG5cbiAgICAvLyBJbml0aWFsaXplIHBhbGV0dGUgd2l0aCBub3JtYWxpemVkIHRyYW5zcGFyZW50IGNvbG9yXG4gICAgY29sb3JNYXAuc2V0KHRyYW5zcGFyZW50Q29sb3IsIHRyYW5zcGFyZW50UGFsbGV0SW5kZXgpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0RhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBpeGVsID0gcmF3RGF0YVtpXSBhcyBudW1iZXJcbiAgICAgIGNvbnN0IGFscGhhID0gKHBpeGVsID4+PiAyNCkgJiAweEZGXG4gICAgICBjb25zdCBpc1RyYW5zcGFyZW50ID0gYWxwaGEgPT09IDBcbiAgICAgIGNvbnN0IGNvbG9yS2V5ID0gaXNUcmFuc3BhcmVudCA/IHRyYW5zcGFyZW50Q29sb3IgOiAocGl4ZWwgPj4+IDApXG5cbiAgICAgIGxldCBpZCA9IGNvbG9yTWFwLmdldChjb2xvcktleSlcblxuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWQgPSBjb2xvck1hcC5zaXplXG4gICAgICAgIGNvbG9yTWFwLnNldChjb2xvcktleSwgaWQpXG4gICAgICB9XG5cbiAgICAgIGluZGV4ZWREYXRhW2ldID0gaWRcbiAgICB9XG5cbiAgICBjb25zdCBwYWxldHRlID0gVWludDMyQXJyYXkuZnJvbShjb2xvck1hcC5rZXlzKCkpXG5cbiAgICByZXR1cm4gbmV3IEluZGV4ZWRJbWFnZShcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgaW5kZXhlZERhdGEsXG4gICAgICBwYWxldHRlLFxuICAgICAgdHJhbnNwYXJlbnRQYWxsZXRJbmRleCxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSAzMi1iaXQgcGFja2VkIGNvbG9yIHZhbHVlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHggLSBYIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSB5IC0gWSBjb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyBUaGUgcGFja2VkIGNvbG9yIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sb3JBdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbG9yMzIge1xuICAgIGNvbnN0IGluZGV4ID0geCArIHkgKiB0aGlzLndpZHRoXG4gICAgY29uc3QgcGFsZXR0ZUluZGV4ID0gdGhpcy5kYXRhW2luZGV4XVxuXG4gICAgcmV0dXJuIHRoaXMucGFsZXR0ZVtwYWxldHRlSW5kZXhdIGFzIENvbG9yMzJcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { packColor } from '../color';\n/**\n * Calculates the area-weighted average color of an IndexedImage.\n * This accounts for how often each palette index appears in the pixel data.\n * @param indexedImage - The IndexedImage containing pixel indices and the palette.\n * @param includeTransparent - Whether to include the transparent pixels in the average.\n * @returns The average RGBA color of the image.\n */\nexport function indexedImageToAverageColor(indexedImage: IndexedImage, includeTransparent: boolean = false): Color32 {\n const {\n data,\n palette,\n transparentPalletIndex\n } = indexedImage;\n const counts = new Uint32Array(palette.length);\n\n // Tally occurrences of each index\n for (let i = 0; i < data.length; i++) {\n const id = data[i]!;\n counts[id]!++;\n }\n let rSum = 0;\n let gSum = 0;\n let bSum = 0;\n let aSum = 0;\n let totalWeight = 0;\n for (let id = 0; id < counts.length; id++) {\n const weight = counts[id]!;\n if (weight === 0) {\n continue;\n }\n if (!includeTransparent && id === transparentPalletIndex) {\n continue;\n }\n const color = palette[id]! >>> 0;\n const r = color & 0xFF;\n const g = color >> 8 & 0xFF;\n const b = color >> 16 & 0xFF;\n const a = color >> 24 & 0xFF;\n rSum += r * weight;\n gSum += g * weight;\n bSum += b * weight;\n aSum += a * weight;\n totalWeight += weight;\n }\n if (totalWeight === 0) {\n return packColor(0, 0, 0, 0);\n }\n const r = rSum / totalWeight | 0;\n const g = gSum / totalWeight | 0;\n const b = bSum / totalWeight | 0;\n const a = aSum / totalWeight | 0;\n return packColor(r, g, b, a);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgcGFja0NvbG9yIH0gZnJvbSAnLi4vY29sb3InXG5pbXBvcnQgdHlwZSB7IEluZGV4ZWRJbWFnZSB9IGZyb20gJy4vSW5kZXhlZEltYWdlJ1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFyZWEtd2VpZ2h0ZWQgYXZlcmFnZSBjb2xvciBvZiBhbiBJbmRleGVkSW1hZ2UuXG4gKiBUaGlzIGFjY291bnRzIGZvciBob3cgb2Z0ZW4gZWFjaCBwYWxldHRlIGluZGV4IGFwcGVhcnMgaW4gdGhlIHBpeGVsIGRhdGEuXG4gKiBAcGFyYW0gaW5kZXhlZEltYWdlIC0gVGhlIEluZGV4ZWRJbWFnZSBjb250YWluaW5nIHBpeGVsIGluZGljZXMgYW5kIHRoZSBwYWxldHRlLlxuICogQHBhcmFtIGluY2x1ZGVUcmFuc3BhcmVudCAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIHRoZSBhdmVyYWdlLlxuICogQHJldHVybnMgVGhlIGF2ZXJhZ2UgUkdCQSBjb2xvciBvZiB0aGUgaW1hZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleGVkSW1hZ2VUb0F2ZXJhZ2VDb2xvcihcbiAgaW5kZXhlZEltYWdlOiBJbmRleGVkSW1hZ2UsXG4gIGluY2x1ZGVUcmFuc3BhcmVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogQ29sb3IzMiB7XG4gIGNvbnN0IHsgZGF0YSwgcGFsZXR0ZSwgdHJhbnNwYXJlbnRQYWxsZXRJbmRleCB9ID0gaW5kZXhlZEltYWdlXG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShwYWxldHRlLmxlbmd0aClcblxuICAvLyBUYWxseSBvY2N1cnJlbmNlcyBvZiBlYWNoIGluZGV4XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGlkID0gZGF0YVtpXSFcbiAgICBjb3VudHNbaWRdISsrXG4gIH1cblxuICBsZXQgclN1bSA9IDBcbiAgbGV0IGdTdW0gPSAwXG4gIGxldCBiU3VtID0gMFxuICBsZXQgYVN1bSA9IDBcbiAgbGV0IHRvdGFsV2VpZ2h0ID0gMFxuXG4gIGZvciAobGV0IGlkID0gMDsgaWQgPCBjb3VudHMubGVuZ3RoOyBpZCsrKSB7XG4gICAgY29uc3Qgd2VpZ2h0ID0gY291bnRzW2lkXSFcblxuICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlVHJhbnNwYXJlbnQgJiYgaWQgPT09IHRyYW5zcGFyZW50UGFsbGV0SW5kZXgpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY29sb3IgPSBwYWxldHRlW2lkXSEgPj4+IDBcblxuICAgIGNvbnN0IHIgPSBjb2xvciAmIDB4RkZcbiAgICBjb25zdCBnID0gKGNvbG9yID4+IDgpICYgMHhGRlxuICAgIGNvbnN0IGIgPSAoY29sb3IgPj4gMTYpICYgMHhGRlxuICAgIGNvbnN0IGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRlxuXG4gICAgclN1bSArPSByICogd2VpZ2h0XG4gICAgZ1N1bSArPSBnICogd2VpZ2h0XG4gICAgYlN1bSArPSBiICogd2VpZ2h0XG4gICAgYVN1bSArPSBhICogd2VpZ2h0XG4gICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0XG4gIH1cblxuICBpZiAodG90YWxXZWlnaHQgPT09IDApIHtcbiAgICByZXR1cm4gcGFja0NvbG9yKDAsIDAsIDAsIDApXG4gIH1cblxuICBjb25zdCByID0gKHJTdW0gLyB0b3RhbFdlaWdodCkgfCAwXG4gIGNvbnN0IGcgPSAoZ1N1bSAvIHRvdGFsV2VpZ2h0KSB8IDBcbiAgY29uc3QgYiA9IChiU3VtIC8gdG90YWxXZWlnaHQpIHwgMFxuICBjb25zdCBhID0gKGFTdW0gLyB0b3RhbFdlaWdodCkgfCAwXG5cbiAgcmV0dXJuIHBhY2tDb2xvcihyLCBnLCBiLCBhKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Converts an IndexedImage back into standard ImageData.\n */\nexport function indexedImageToImageData(indexedImage: IndexedImage): ImageData {\n const {\n width,\n height,\n data,\n palette\n } = indexedImage;\n const result = new ImageData(width, height);\n const data32 = new Uint32Array(result.data.buffer);\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i];\n const color = palette[paletteIndex];\n data32[i] = color;\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbmRleGVkSW1hZ2UgfSBmcm9tICcuL0luZGV4ZWRJbWFnZSdcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBJbmRleGVkSW1hZ2UgYmFjayBpbnRvIHN0YW5kYXJkIEltYWdlRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4ZWRJbWFnZVRvSW1hZ2VEYXRhKGluZGV4ZWRJbWFnZTogSW5kZXhlZEltYWdlKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkYXRhLCBwYWxldHRlIH0gPSBpbmRleGVkSW1hZ2VcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KVxuICBjb25zdCBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0LmRhdGEuYnVmZmVyKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBhbGV0dGVJbmRleCA9IGRhdGFbaV1cbiAgICBjb25zdCBjb2xvciA9IHBhbGV0dGVbcGFsZXR0ZUluZGV4XVxuXG4gICAgZGF0YTMyW2ldID0gY29sb3JcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { IndexedImage } from '../index';\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleIndexedImage(source: IndexedImage, factor: number): IndexedImage {\n const {\n data,\n width,\n height\n } = resample32(source.data, source.width, source.height, factor);\n return new IndexedImage(width, height, data, source.palette, source.transparentPalletIndex);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNhbXBsZXMgYW4gSW5kZXhlZEltYWdlIGJ5IGEgc3BlY2lmaWMgZmFjdG9yIHVzaW5nIG5lYXJlc3QgbmVpZ2hib3JcbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuaW1wb3J0IHsgSW5kZXhlZEltYWdlIH0gZnJvbSAnLi4vaW5kZXgnXG5pbXBvcnQgeyByZXNhbXBsZTMyIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzYW1wbGUzMidcblxuLyoqXG4gKiBSZXNhbXBsZXMgYW4gSW5kZXhlZEltYWdlIGJ5IGEgc3BlY2lmaWMgZmFjdG9yIHVzaW5nIG5lYXJlc3QgbmVpZ2hib3JcbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlSW5kZXhlZEltYWdlKFxuICBzb3VyY2U6IEluZGV4ZWRJbWFnZSxcbiAgZmFjdG9yOiBudW1iZXIsXG4pOiBJbmRleGVkSW1hZ2Uge1xuXG4gIGNvbnN0IHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9ID0gcmVzYW1wbGUzMihcbiAgICBzb3VyY2UuZGF0YSxcbiAgICBzb3VyY2Uud2lkdGgsXG4gICAgc291cmNlLmhlaWdodCxcbiAgICBmYWN0b3IsXG4gIClcblxuICByZXR1cm4gbmV3IEluZGV4ZWRJbWFnZShcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZGF0YSxcbiAgICBzb3VyY2UucGFsZXR0ZSxcbiAgICBzb3VyY2UudHJhbnNwYXJlbnRQYWxsZXRJbmRleCxcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { fileToImageData } from '../../src';\n\n/**\n * A convenience wrapper that extracts the first {@link File} from an\n * {@link HTMLInputElement} change event and converts it into {@link ImageData}.\n *\n * This function handles the boilerplate of accessing the file list and checking\n * for existence. It is ideal for use directly in an `onchange` event listener.\n *\n * @param event - The change {@link Event} from an `<input type=\"file\">` element.\n *\n * @returns A promise that resolves to {@link ImageData} if a file was successfully\n * processed, or `null` if no file was selected or the input was cleared.\n *\n * @example\n * ```typescript\n * const input = document.querySelector('input[type=\"file\"]');\n *\n * input.addEventListener('change', async (event) => {\n * const imageData = await fileInputChangeToImageData(event);\n *\n * if (imageData) {\n * console.log('Image loaded:', imageData.width, imageData.height);\n * }\n * });\n * ```\n */\nexport async function fileInputChangeToImageData(event: Event): Promise<ImageData | null> {\n const target = event.target as HTMLInputElement;\n const file = target.files?.[0];\n if (!file) return null;\n return await fileToImageData(file);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmlsZVRvSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vc3JjJ1xuXG4vKipcbiAqIEEgY29udmVuaWVuY2Ugd3JhcHBlciB0aGF0IGV4dHJhY3RzIHRoZSBmaXJzdCB7QGxpbmsgRmlsZX0gZnJvbSBhblxuICoge0BsaW5rIEhUTUxJbnB1dEVsZW1lbnR9IGNoYW5nZSBldmVudCBhbmQgY29udmVydHMgaXQgaW50byB7QGxpbmsgSW1hZ2VEYXRhfS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGJvaWxlcnBsYXRlIG9mIGFjY2Vzc2luZyB0aGUgZmlsZSBsaXN0IGFuZCBjaGVja2luZ1xuICogZm9yIGV4aXN0ZW5jZS4gSXQgaXMgaWRlYWwgZm9yIHVzZSBkaXJlY3RseSBpbiBhbiBgb25jaGFuZ2VgIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFRoZSBjaGFuZ2Uge0BsaW5rIEV2ZW50fSBmcm9tIGFuIGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIEltYWdlRGF0YX0gaWYgYSBmaWxlIHdhcyBzdWNjZXNzZnVsbHlcbiAqIHByb2Nlc3NlZCwgb3IgYG51bGxgIGlmIG5vIGZpbGUgd2FzIHNlbGVjdGVkIG9yIHRoZSBpbnB1dCB3YXMgY2xlYXJlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpO1xuICpcbiAqIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChldmVudCkgPT4ge1xuICogICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBmaWxlSW5wdXRDaGFuZ2VUb0ltYWdlRGF0YShldmVudCk7XG4gKlxuICogICBpZiAoaW1hZ2VEYXRhKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0ltYWdlIGxvYWRlZDonLCBpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQpO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsZUlucHV0Q2hhbmdlVG9JbWFnZURhdGEoXG4gIGV2ZW50OiBFdmVudCxcbik6IFByb21pc2U8SW1hZ2VEYXRhIHwgbnVsbD4ge1xuICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuXG4gIGNvbnN0IGZpbGUgPSB0YXJnZXQuZmlsZXM/LlswXVxuICBpZiAoIWZpbGUpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVUb0ltYWdlRGF0YShmaWxlKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { OFFSCREEN_CANVAS_CTX_FAILED } from '../Canvas/_constants';\n\n/**\n * Thrown when the user provides a file that isn't an image.\n */\nexport class UnsupportedFormatError extends Error {\n constructor(mimeType: string) {\n super(`File type ${mimeType} is not a supported image format.`);\n this.name = 'UnsupportedFormatError';\n }\n}\n\n/**\n * Converts a browser {@link File} object into {@link ImageData}.\n * This utility handles the full pipeline of image decoding using hardware-accelerated\n * APIs {@link createImageBitmap} and {@link OffscreenCanvas}. It ensures that underlying\n * resources like `ImageBitmap` are properly closed even if the conversion fails.\n *\n * @param file - The image file to convert. Can be null or undefined.\n * @returns A `Promise` resolving to the pixel data as {@link ImageData},\n * or `null` if no file was provided.\n * @throws {@link UnsupportedFormatError}\n * Thrown if the provided file's MIME type does not start with `image/`.\n * @example\n * ```typescript\n * try {\n * const imageData = await fileToImageData(file);\n * if (imageData) {\n * console.log('Pixels:', imageData.data);\n * }\n * } catch (err) {\n * if (err instanceof UnsupportedFormatError) {\n * // Handle bad file type\n * }\n * }\n * ```\n */\nexport async function fileToImageData(file: File | null | undefined): Promise<ImageData | null> {\n if (!file) return null;\n if (!file.type.startsWith('image/')) {\n throw new UnsupportedFormatError(file.type);\n }\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(file);\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(OFFSCREEN_CANVAS_CTX_FAILED);\n ctx.drawImage(bitmap, 0, 0);\n return ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n } finally {\n bitmap?.close();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT0ZGU0NSRUVOX0NBTlZBU19DVFhfRkFJTEVEIH0gZnJvbSAnLi4vQ2FudmFzL19jb25zdGFudHMnXG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHVzZXIgcHJvdmlkZXMgYSBmaWxlIHRoYXQgaXNuJ3QgYW4gaW1hZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEZvcm1hdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtaW1lVHlwZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYEZpbGUgdHlwZSAke21pbWVUeXBlfSBpcyBub3QgYSBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0LmApXG4gICAgdGhpcy5uYW1lID0gJ1Vuc3VwcG9ydGVkRm9ybWF0RXJyb3InXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJyb3dzZXIge0BsaW5rIEZpbGV9IG9iamVjdCBpbnRvIHtAbGluayBJbWFnZURhdGF9LlxuICogVGhpcyB1dGlsaXR5IGhhbmRsZXMgdGhlIGZ1bGwgcGlwZWxpbmUgb2YgaW1hZ2UgZGVjb2RpbmcgdXNpbmcgaGFyZHdhcmUtYWNjZWxlcmF0ZWRcbiAqIEFQSXMge0BsaW5rIGNyZWF0ZUltYWdlQml0bWFwfSBhbmQge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30uIEl0IGVuc3VyZXMgdGhhdCB1bmRlcmx5aW5nXG4gKiByZXNvdXJjZXMgbGlrZSBgSW1hZ2VCaXRtYXBgIGFyZSBwcm9wZXJseSBjbG9zZWQgZXZlbiBpZiB0aGUgY29udmVyc2lvbiBmYWlscy5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBpbWFnZSBmaWxlIHRvIGNvbnZlcnQuIENhbiBiZSBudWxsIG9yIHVuZGVmaW5lZC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmluZyB0byB0aGUgcGl4ZWwgZGF0YSBhcyB7QGxpbmsgSW1hZ2VEYXRhfSxcbiAqIG9yIGBudWxsYCBpZiBubyBmaWxlIHdhcyBwcm92aWRlZC5cbiAqIEB0aHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkRm9ybWF0RXJyb3J9XG4gKiBUaHJvd24gaWYgdGhlIHByb3ZpZGVkIGZpbGUncyBNSU1FIHR5cGUgZG9lcyBub3Qgc3RhcnQgd2l0aCBgaW1hZ2UvYC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBmaWxlVG9JbWFnZURhdGEoZmlsZSk7XG4gKiAgIGlmIChpbWFnZURhdGEpIHtcbiAqICAgICBjb25zb2xlLmxvZygnUGl4ZWxzOicsIGltYWdlRGF0YS5kYXRhKTtcbiAqICAgfVxuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIGlmIChlcnIgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEZvcm1hdEVycm9yKSB7XG4gKiAgICAgLy8gSGFuZGxlIGJhZCBmaWxlIHR5cGVcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaWxlVG9JbWFnZURhdGEoXG4gIGZpbGU6IEZpbGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxJbWFnZURhdGEgfCBudWxsPiB7XG4gIGlmICghZmlsZSkgcmV0dXJuIG51bGxcblxuICBpZiAoIWZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZvcm1hdEVycm9yKGZpbGUudHlwZSlcbiAgfVxuXG4gIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGxcblxuICB0cnkge1xuICAgIGJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGZpbGUpXG5cbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKFxuICAgICAgYml0bWFwLndpZHRoLFxuICAgICAgYml0bWFwLmhlaWdodCxcbiAgICApXG5cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoT0ZGU0NSRUVOX0NBTlZBU19DVFhfRkFJTEVEKVxuXG4gICAgY3R4LmRyYXdJbWFnZShcbiAgICAgIGJpdG1hcCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgIClcblxuICAgIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICBiaXRtYXAud2lkdGgsXG4gICAgICBiaXRtYXAuaGVpZ2h0LFxuICAgIClcbiAgfSBmaW5hbGx5IHtcbiAgICBiaXRtYXA/LmNsb3NlKClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","// Cache the Promise to prevent race conditions during initialization\nlet formatsPromise: Promise<string[]> | null = null;\nconst defaultRasterMimes = ['image/png', 'image/jpeg', 'image/webp', 'image/avif', 'image/gif', 'image/bmp'];\n\n/**\n * Probes the browser environment to determine which image MIME types are\n * supported for pixel-level operations.\n * This function performs a one-time check by attempting to convert a\n * {@link OffscreenCanvas} to MIME types. The result is\n * cached to prevent redundant hardware-accelerated operations on\n * subsequent calls.\n * @param rasterMimes List of MIME types to check\n * @default ['image/png',\n * 'image/jpeg',\n * 'image/webp',\n * 'image/avif',\n * 'image/gif',\n * 'image/bmp']\n * @returns A `Promise` resolving to an array of supported MIME\n * types from the `rasterMimes` list.\n * @throws {Error} If the {@link OffscreenCanvas} context cannot be initialized.\n * @example\n * ```typescript\n * const supported = await getSupportedPixelFormats();\n * if (supported.includes('image/avif')) {\n * console.log('High-efficiency formats available');\n * }\n * ```\n */\nexport async function getSupportedPixelFormats(rasterMimes = defaultRasterMimes): Promise<string[]> {\n if (formatsPromise) {\n return formatsPromise;\n }\n const probeCanvas = async () => {\n const canvas = new OffscreenCanvas(1, 1);\n const results = await Promise.all(rasterMimes.map(async mime => {\n try {\n const blob = await canvas.convertToBlob({\n type: mime\n });\n return blob.type === mime ? mime : null;\n } catch {\n return null;\n }\n }));\n return results.filter((type): type is string => {\n return type !== null;\n });\n };\n\n // By chaining .catch here, the microtask guarantees formatsPromise\n // is assigned the promise BEFORE the catch block runs to reset it.\n formatsPromise = probeCanvas().catch(error => {\n formatsPromise = null;\n throw error;\n });\n return formatsPromise;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ2FjaGUgdGhlIFByb21pc2UgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIGluaXRpYWxpemF0aW9uXG5sZXQgZm9ybWF0c1Byb21pc2U6IFByb21pc2U8c3RyaW5nW10+IHwgbnVsbCA9IG51bGxcblxuY29uc3QgZGVmYXVsdFJhc3Rlck1pbWVzID0gW1xuICAnaW1hZ2UvcG5nJyxcbiAgJ2ltYWdlL2pwZWcnLFxuICAnaW1hZ2Uvd2VicCcsXG4gICdpbWFnZS9hdmlmJyxcbiAgJ2ltYWdlL2dpZicsXG4gICdpbWFnZS9ibXAnLFxuXVxuXG4vKipcbiAqIFByb2JlcyB0aGUgYnJvd3NlciBlbnZpcm9ubWVudCB0byBkZXRlcm1pbmUgd2hpY2ggaW1hZ2UgTUlNRSB0eXBlcyBhcmVcbiAqIHN1cHBvcnRlZCBmb3IgcGl4ZWwtbGV2ZWwgb3BlcmF0aW9ucy5cbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBvbmUtdGltZSBjaGVjayBieSBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgYVxuICoge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30gdG8gTUlNRSB0eXBlcy4gVGhlIHJlc3VsdCBpc1xuICogY2FjaGVkIHRvIHByZXZlbnQgcmVkdW5kYW50IGhhcmR3YXJlLWFjY2VsZXJhdGVkIG9wZXJhdGlvbnMgb25cbiAqIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBAcGFyYW0gcmFzdGVyTWltZXMgTGlzdCBvZiBNSU1FIHR5cGVzIHRvIGNoZWNrXG4gKiBAZGVmYXVsdCBbJ2ltYWdlL3BuZycsXG4gKiAgICdpbWFnZS9qcGVnJyxcbiAqICAgJ2ltYWdlL3dlYnAnLFxuICogICAnaW1hZ2UvYXZpZicsXG4gKiAgICdpbWFnZS9naWYnLFxuICogICAnaW1hZ2UvYm1wJ11cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgTUlNRVxuICogdHlwZXMgZnJvbSB0aGUgYHJhc3Rlck1pbWVzYCBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdXBwb3J0ZWQgPSBhd2FpdCBnZXRTdXBwb3J0ZWRQaXhlbEZvcm1hdHMoKTtcbiAqIGlmIChzdXBwb3J0ZWQuaW5jbHVkZXMoJ2ltYWdlL2F2aWYnKSkge1xuICogICBjb25zb2xlLmxvZygnSGlnaC1lZmZpY2llbmN5IGZvcm1hdHMgYXZhaWxhYmxlJyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN1cHBvcnRlZFBpeGVsRm9ybWF0cyhyYXN0ZXJNaW1lcyA9IGRlZmF1bHRSYXN0ZXJNaW1lcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKGZvcm1hdHNQcm9taXNlKSB7XG4gICAgcmV0dXJuIGZvcm1hdHNQcm9taXNlXG4gIH1cblxuICBjb25zdCBwcm9iZUNhbnZhcyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpXG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByYXN0ZXJNaW1lcy5tYXAoYXN5bmMgKG1pbWUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgY2FudmFzLmNvbnZlcnRUb0Jsb2Ioe1xuICAgICAgICAgICAgdHlwZTogbWltZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuIGJsb2IudHlwZSA9PT0gbWltZSA/IG1pbWUgOiBudWxsXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigodHlwZSk6IHR5cGUgaXMgc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiB0eXBlICE9PSBudWxsXG4gICAgfSlcbiAgfVxuXG4gIC8vIEJ5IGNoYWluaW5nIC5jYXRjaCBoZXJlLCB0aGUgbWljcm90YXNrIGd1YXJhbnRlZXMgZm9ybWF0c1Byb21pc2VcbiAgLy8gaXMgYXNzaWduZWQgdGhlIHByb21pc2UgQkVGT1JFIHRoZSBjYXRjaCBibG9jayBydW5zIHRvIHJlc2V0IGl0LlxuICBmb3JtYXRzUHJvbWlzZSA9IHByb2JlQ2FudmFzKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgZm9ybWF0c1Byb21pc2UgPSBudWxsXG5cbiAgICB0aHJvdyBlcnJvclxuICB9KVxuXG4gIHJldHVybiBmb3JtYXRzUHJvbWlzZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_types';\n\n/**\n * Creates an Alpha Mask\n * @param w - width\n * @param h - height\n * @param data - values 0-255\n */\nexport function makeAlphaMask(w: number, h: number, data?: Uint8Array): AlphaMask {\n return {\n type: MaskType.ALPHA,\n data: data ?? new Uint8Array(w * h),\n w,\n h\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIE1hc2tUeXBlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gQWxwaGEgTWFza1xuICogQHBhcmFtIHcgLSB3aWR0aFxuICogQHBhcmFtIGggLSBoZWlnaHRcbiAqIEBwYXJhbSBkYXRhIC0gdmFsdWVzIDAtMjU1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQWxwaGFNYXNrKHc6IG51bWJlciwgaDogbnVtYmVyLCBkYXRhPzogVWludDhBcnJheSk6IEFscGhhTWFzayB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQUxQSEEsXG4gICAgZGF0YTogZGF0YSA/PyBuZXcgVWludDhBcnJheSh3ICogaCksXG4gICAgdyxcbiAgICBoLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\n\n/**\n * Creates a Binary Mask\n * @param w - width\n * @param h - height\n * @param data - values 0-1\n */\nexport function makeBinaryMask(w: number, h: number, data?: Uint8Array): BinaryMask {\n return {\n type: MaskType.BINARY,\n data: data ?? new Uint8Array(w * h),\n w,\n h\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBCaW5hcnlNYXNrLCBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcydcblxuLyoqXG4gKiBDcmVhdGVzIGEgQmluYXJ5IE1hc2tcbiAqIEBwYXJhbSB3IC0gd2lkdGhcbiAqIEBwYXJhbSBoIC0gaGVpZ2h0XG4gKiBAcGFyYW0gZGF0YSAtIHZhbHVlcyAwLTFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VCaW5hcnlNYXNrKHc6IG51bWJlciwgaDogbnVtYmVyLCBkYXRhPzogVWludDhBcnJheSk6IEJpbmFyeU1hc2sge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkJJTkFSWSxcbiAgICBkYXRhOiBkYXRhID8/IG5ldyBVaW50OEFycmF5KHcgKiBoKSxcbiAgICB3LFxuICAgIGgsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../_types';\nexport function makeCircleBrushAlphaMask(size: number, fallOff: (d: number) => number = () => 1): CircleBrushAlphaMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const invR = 1 / radius;\n const minOffset = -Math.ceil(radius - 0.5);\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const dx = x - radius + 0.5;\n const dy = y - radius + 0.5;\n const distSqr = dx * dx + dy * dy;\n if (distSqr <= radius * radius) {\n const dist = Math.sqrt(distSqr);\n data[y * size + x] = fallOff(1 - dist * invR) * 255 | 0;\n }\n }\n }\n return {\n type: MaskType.ALPHA,\n data,\n w: size,\n h: size,\n radius,\n size,\n minOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDaXJjbGVCcnVzaEFscGhhTWFzaywgTWFza1R5cGUgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2lyY2xlQnJ1c2hBbHBoYU1hc2soc2l6ZTogbnVtYmVyLCBmYWxsT2ZmOiAoZDogbnVtYmVyKSA9PiBudW1iZXIgPSAoKSA9PiAxKTogQ2lyY2xlQnJ1c2hBbHBoYU1hc2sge1xuICBjb25zdCBhcmVhID0gc2l6ZSAqIHNpemVcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGFyZWEpXG4gIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyXG4gIGNvbnN0IGludlIgPSAxIC8gcmFkaXVzXG5cbiAgY29uc3QgbWluT2Zmc2V0ID0gLU1hdGguY2VpbChyYWRpdXMgLSAwLjUpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNpemU7IHgrKykge1xuICAgICAgY29uc3QgZHggPSB4IC0gcmFkaXVzICsgMC41XG4gICAgICBjb25zdCBkeSA9IHkgLSByYWRpdXMgKyAwLjVcbiAgICAgIGNvbnN0IGRpc3RTcXIgPSBkeCAqIGR4ICsgZHkgKiBkeVxuICAgICAgaWYgKGRpc3RTcXIgPD0gKHJhZGl1cyAqIHJhZGl1cykpIHtcbiAgICAgICAgY29uc3QgZGlzdCA9IE1hdGguc3FydChkaXN0U3FyKVxuICAgICAgICBkYXRhW3kgKiBzaXplICsgeF0gPSAoZmFsbE9mZigxIC0gKGRpc3QgKiBpbnZSKSkgKiAyNTUpIHwgMFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQUxQSEEsXG4gICAgZGF0YSxcbiAgICB3OiBzaXplLFxuICAgIGg6IHNpemUsXG4gICAgcmFkaXVzLFxuICAgIHNpemUsXG4gICAgbWluT2Zmc2V0LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\nexport function makeCircleBrushBinaryMask(size: number): CircleBrushBinaryMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const minOffset = -Math.ceil(radius - 0.5);\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const dx = x - radius + 0.5;\n const dy = y - radius + 0.5;\n const distSqr = dx * dx + dy * dy;\n if (distSqr <= radius * radius) {\n data[y * size + x] = 1;\n }\n }\n }\n return {\n type: MaskType.BINARY,\n data,\n w: size,\n h: size,\n radius,\n size,\n minOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDaXJjbGVCcnVzaEJpbmFyeU1hc2ssIE1hc2tUeXBlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNpcmNsZUJydXNoQmluYXJ5TWFzayhzaXplOiBudW1iZXIpOiBDaXJjbGVCcnVzaEJpbmFyeU1hc2sge1xuICBjb25zdCBhcmVhID0gc2l6ZSAqIHNpemVcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGFyZWEpXG4gIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyXG5cbiAgY29uc3QgbWluT2Zmc2V0ID0gLU1hdGguY2VpbChyYWRpdXMgLSAwLjUpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNpemU7IHgrKykge1xuICAgICAgY29uc3QgZHggPSB4IC0gcmFkaXVzICsgMC41XG4gICAgICBjb25zdCBkeSA9IHkgLSByYWRpdXMgKyAwLjVcbiAgICAgIGNvbnN0IGRpc3RTcXIgPSBkeCAqIGR4ICsgZHkgKiBkeVxuICAgICAgaWYgKGRpc3RTcXIgPD0gKHJhZGl1cyAqIHJhZGl1cykpIHtcbiAgICAgICAgZGF0YVt5ICogc2l6ZSArIHhdID0gMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIGRhdGEsXG4gICAgdzogc2l6ZSxcbiAgICBoOiBzaXplLFxuICAgIHJhZGl1cyxcbiAgICBzaXplLFxuICAgIG1pbk9mZnNldCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function applyBinaryMaskToAlphaMask(alphaMaskDst: AlphaMask, binaryMaskSrc: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: reqWidth = 0,\n h: reqHeight = 0,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n const dstWidth = alphaMaskDst.w;\n if (dstWidth <= 0) return;\n if (binaryMaskSrc.data.length === 0) return;\n const srcWidth = binaryMaskSrc.w;\n if (srcWidth <= 0) return;\n const dstHeight = alphaMaskDst.data.length / dstWidth | 0;\n const srcHeight = binaryMaskSrc.data.length / srcWidth | 0;\n if (dstHeight <= 0) return;\n if (srcHeight <= 0) return;\n const dstX0 = Math.max(0, targetX);\n const dstY0 = Math.max(0, targetY);\n const dstX1 = reqWidth > 0 ? Math.min(dstWidth, targetX + reqWidth) : dstWidth;\n const dstY1 = reqHeight > 0 ? Math.min(dstHeight, targetY + reqHeight) : dstHeight;\n if (dstX0 >= dstX1) return;\n if (dstY0 >= dstY1) return;\n const srcX0 = mx + (dstX0 - targetX);\n const srcY0 = my + (dstY0 - targetY);\n if (srcX0 >= srcWidth) return;\n if (srcY0 >= srcHeight) return;\n if (srcX0 + (dstX1 - dstX0) <= 0) return;\n if (srcY0 + (dstY1 - dstY0) <= 0) return;\n const iterW = Math.min(dstX1 - dstX0, srcWidth - srcX0);\n const iterH = Math.min(dstY1 - dstY0, srcHeight - srcY0);\n const srcData = binaryMaskSrc.data;\n const dstData = alphaMaskDst.data;\n let dstIdx = dstY0 * dstWidth + dstX0;\n let srcIdx = srcY0 * srcWidth + srcX0;\n if (invertMask) {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW;\n let d = dstIdx;\n let s = srcIdx;\n while (d < dstEnd) {\n // inverted\n if (srcData[s] !== 0) {\n dstData[d] = 0;\n }\n d++;\n s++;\n }\n dstIdx += dstWidth;\n srcIdx += srcWidth;\n }\n } else {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW;\n let d = dstIdx;\n let s = srcIdx;\n while (d < dstEnd) {\n // If binary mask is empty, clear the alpha pixel.\n if (srcData[s] === 0) {\n dstData[d] = 0;\n }\n d++;\n s++;\n }\n dstIdx += dstWidth;\n srcIdx += srcWidth;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucywgQmluYXJ5TWFzayB9IGZyb20gJy4uL190eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QmluYXJ5TWFza1RvQWxwaGFNYXNrKFxuICBhbHBoYU1hc2tEc3Q6IEFscGhhTWFzayxcbiAgYmluYXJ5TWFza1NyYzogQmluYXJ5TWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHJlcVdpZHRoID0gMCxcbiAgICBoOiByZXFIZWlnaHQgPSAwLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGNvbnN0IGRzdFdpZHRoID0gYWxwaGFNYXNrRHN0LndcbiAgaWYgKGRzdFdpZHRoIDw9IDApIHJldHVyblxuICBpZiAoYmluYXJ5TWFza1NyYy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG4gIGNvbnN0IHNyY1dpZHRoID0gYmluYXJ5TWFza1NyYy53XG4gIGlmIChzcmNXaWR0aCA8PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3RIZWlnaHQgPSAoYWxwaGFNYXNrRHN0LmRhdGEubGVuZ3RoIC8gZHN0V2lkdGgpIHwgMFxuICBjb25zdCBzcmNIZWlnaHQgPSAoYmluYXJ5TWFza1NyYy5kYXRhLmxlbmd0aCAvIHNyY1dpZHRoKSB8IDBcblxuICBpZiAoZHN0SGVpZ2h0IDw9IDApIHJldHVyblxuICBpZiAoc3JjSGVpZ2h0IDw9IDApIHJldHVyblxuXG4gIGNvbnN0IGRzdFgwID0gTWF0aC5tYXgoMCwgdGFyZ2V0WClcbiAgY29uc3QgZHN0WTAgPSBNYXRoLm1heCgwLCB0YXJnZXRZKVxuICBjb25zdCBkc3RYMSA9IHJlcVdpZHRoID4gMCA/IE1hdGgubWluKGRzdFdpZHRoLCB0YXJnZXRYICsgcmVxV2lkdGgpIDogZHN0V2lkdGhcbiAgY29uc3QgZHN0WTEgPSByZXFIZWlnaHQgPiAwID8gTWF0aC5taW4oZHN0SGVpZ2h0LCB0YXJnZXRZICsgcmVxSGVpZ2h0KSA6IGRzdEhlaWdodFxuXG4gIGlmIChkc3RYMCA+PSBkc3RYMSkgcmV0dXJuXG4gIGlmIChkc3RZMCA+PSBkc3RZMSkgcmV0dXJuXG5cbiAgY29uc3Qgc3JjWDAgPSBteCArIChkc3RYMCAtIHRhcmdldFgpXG4gIGNvbnN0IHNyY1kwID0gbXkgKyAoZHN0WTAgLSB0YXJnZXRZKVxuXG4gIGlmIChzcmNYMCA+PSBzcmNXaWR0aCkgcmV0dXJuXG4gIGlmIChzcmNZMCA+PSBzcmNIZWlnaHQpIHJldHVyblxuICBpZiAoc3JjWDAgKyAoZHN0WDEgLSBkc3RYMCkgPD0gMCkgcmV0dXJuXG4gIGlmIChzcmNZMCArIChkc3RZMSAtIGRzdFkwKSA8PSAwKSByZXR1cm5cblxuICBjb25zdCBpdGVyVyA9IE1hdGgubWluKGRzdFgxIC0gZHN0WDAsIHNyY1dpZHRoIC0gc3JjWDApXG4gIGNvbnN0IGl0ZXJIID0gTWF0aC5taW4oZHN0WTEgLSBkc3RZMCwgc3JjSGVpZ2h0IC0gc3JjWTApXG5cbiAgY29uc3Qgc3JjRGF0YSA9IGJpbmFyeU1hc2tTcmMuZGF0YVxuICBjb25zdCBkc3REYXRhID0gYWxwaGFNYXNrRHN0LmRhdGFcblxuICBsZXQgZHN0SWR4ID0gZHN0WTAgKiBkc3RXaWR0aCArIGRzdFgwXG4gIGxldCBzcmNJZHggPSBzcmNZMCAqIHNyY1dpZHRoICsgc3JjWDBcblxuICBpZiAoaW52ZXJ0TWFzaykge1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGl0ZXJIOyByb3crKykge1xuICAgICAgY29uc3QgZHN0RW5kID0gZHN0SWR4ICsgaXRlcldcbiAgICAgIGxldCBkID0gZHN0SWR4XG4gICAgICBsZXQgcyA9IHNyY0lkeFxuXG4gICAgICB3aGlsZSAoZCA8IGRzdEVuZCkge1xuICAgICAgICAvLyBpbnZlcnRlZFxuICAgICAgICBpZiAoc3JjRGF0YVtzXSAhPT0gMCkge1xuICAgICAgICAgIGRzdERhdGFbZF0gPSAwXG4gICAgICAgIH1cbiAgICAgICAgZCsrXG4gICAgICAgIHMrK1xuICAgICAgfVxuXG4gICAgICBkc3RJZHggKz0gZHN0V2lkdGhcbiAgICAgIHNyY0lkeCArPSBzcmNXaWR0aFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBpdGVySDsgcm93KyspIHtcbiAgICAgIGNvbnN0IGRzdEVuZCA9IGRzdElkeCArIGl0ZXJXXG4gICAgICBsZXQgZCA9IGRzdElkeFxuICAgICAgbGV0IHMgPSBzcmNJZHhcblxuICAgICAgd2hpbGUgKGQgPCBkc3RFbmQpIHtcbiAgICAgICAgLy8gSWYgYmluYXJ5IG1hc2sgaXMgZW1wdHksIGNsZWFyIHRoZSBhbHBoYSBwaXhlbC5cbiAgICAgICAgaWYgKHNyY0RhdGFbc10gPT09IDApIHtcbiAgICAgICAgICBkc3REYXRhW2RdID0gMFxuICAgICAgICB9XG4gICAgICAgIGQrK1xuICAgICAgICBzKytcbiAgICAgIH1cblxuICAgICAgZHN0SWR4ICs9IGRzdFdpZHRoXG4gICAgICBzcmNJZHggKz0gc3JjV2lkdGhcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Mask } from '../_types';\n\n/**\n * Creates a new copy of a mask.\n * Uses the underlying buffer's slice method for high-performance memory copying.\n */\nexport function copyMask<T extends Mask>(src: T): T {\n return {\n type: src.type,\n data: src.data.slice(),\n w: src.w,\n h: src.h\n } as T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBNYXNrIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY29weSBvZiBhIG1hc2suXG4gKiBVc2VzIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlcidzIHNsaWNlIG1ldGhvZCBmb3IgaGlnaC1wZXJmb3JtYW5jZSBtZW1vcnkgY29weWluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlNYXNrPFQgZXh0ZW5kcyBNYXNrPihzcmM6IFQpOiBUIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBzcmMudHlwZSxcbiAgICBkYXRhOiBzcmMuZGF0YS5zbGljZSgpLFxuICAgIHc6IHNyYy53LFxuICAgIGg6IHNyYy5oLFxuICB9IGFzIFRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Mask } from '../_types';\n\n/**\n * Extracts a rectangular region from a 1D {@link Uint8Array} mask.\n * This utility calculates the necessary offsets based on the `maskWidth` to\n * slice out a specific area.\n *\n * @param mask - The target mask.\n * @param rect - A rect defining the region to extract.\n * @returns A new mask containing the extracted region.\n */\nexport function extractMask<T extends Mask>(mask: T, rect: Rect): T;\n\n/**\n * @param mask - The target mask.\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask<T extends Mask>(mask: T, x: number, y: number, w: number, h: number): T;\nexport function extractMask<T extends Mask>(mask: T, xOrRect: number | Rect, y?: number, w?: number, h?: number): T {\n let finalX: number;\n let finalY: number;\n let finalW: number;\n let finalH: number;\n if (typeof xOrRect === 'object') {\n finalX = xOrRect.x;\n finalY = xOrRect.y;\n finalW = xOrRect.w;\n finalH = xOrRect.h;\n } else {\n finalX = xOrRect;\n finalY = y!;\n finalW = w!;\n finalH = h!;\n }\n const out = {\n type: mask.type,\n w: finalW,\n h: finalH,\n data: new Uint8Array(finalW * finalH)\n } as T;\n\n // Calculate the total height of the source mask based on the buffer size\n const srcH = mask.h;\n const stride = mask.w;\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row;\n\n // Safety Check: If the requested row is outside the source mask, skip it (leave as 0)\n if (currentSrcY < 0 || currentSrcY >= srcH) continue;\n\n // Calculate valid horizontal range within the source stride\n // We only copy if srcX is within the actual bounds of the source width\n const start = Math.max(0, finalX);\n const end = Math.min(stride, finalX + finalW);\n if (start < end) {\n const srcOffset = currentSrcY * stride + start;\n const dstOffset = row * finalW + (start - finalX);\n const count = end - start;\n out.data.set(mask.data.subarray(srcOffset, srcOffset + count), dstOffset);\n }\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBNYXNrLCB0eXBlIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5cbi8qKlxuICogRXh0cmFjdHMgYSByZWN0YW5ndWxhciByZWdpb24gZnJvbSBhIDFEIHtAbGluayBVaW50OEFycmF5fSBtYXNrLlxuICogVGhpcyB1dGlsaXR5IGNhbGN1bGF0ZXMgdGhlIG5lY2Vzc2FyeSBvZmZzZXRzIGJhc2VkIG9uIHRoZSBgbWFza1dpZHRoYCB0b1xuICogc2xpY2Ugb3V0IGEgc3BlY2lmaWMgYXJlYS5cbiAqXG4gKiBAcGFyYW0gbWFzayAtIFRoZSB0YXJnZXQgbWFzay5cbiAqIEBwYXJhbSByZWN0IC0gQSByZWN0IGRlZmluaW5nIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgbmV3IG1hc2sgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNYXNrPFQgZXh0ZW5kcyBNYXNrPihcbiAgbWFzazogVCxcbiAgcmVjdDogUmVjdCxcbik6IFRcblxuLyoqXG4gKiBAcGFyYW0gbWFzayAtIFRoZSB0YXJnZXQgbWFzay5cbiAqIEBwYXJhbSB4IC0gVGhlIHN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcGFyYW0gaCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIFVpbnQ4QXJyYXl9IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TWFzazxUIGV4dGVuZHMgTWFzaz4oXG4gIG1hc2s6IFQsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbik6IFRcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TWFzazxUIGV4dGVuZHMgTWFzaz4oXG4gIG1hc2s6IFQsXG4gIHhPclJlY3Q6IG51bWJlciB8IFJlY3QsXG4gIHk/OiBudW1iZXIsXG4gIHc/OiBudW1iZXIsXG4gIGg/OiBudW1iZXIsXG4pOiBUIHtcbiAgbGV0IGZpbmFsWDogbnVtYmVyXG4gIGxldCBmaW5hbFk6IG51bWJlclxuICBsZXQgZmluYWxXOiBudW1iZXJcbiAgbGV0IGZpbmFsSDogbnVtYmVyXG5cbiAgaWYgKHR5cGVvZiB4T3JSZWN0ID09PSAnb2JqZWN0Jykge1xuICAgIGZpbmFsWCA9IHhPclJlY3QueFxuICAgIGZpbmFsWSA9IHhPclJlY3QueVxuICAgIGZpbmFsVyA9IHhPclJlY3Qud1xuICAgIGZpbmFsSCA9IHhPclJlY3QuaFxuICB9IGVsc2Uge1xuICAgIGZpbmFsWCA9IHhPclJlY3RcbiAgICBmaW5hbFkgPSB5IVxuICAgIGZpbmFsVyA9IHchXG4gICAgZmluYWxIID0gaCFcbiAgfVxuXG4gIGNvbnN0IG91dCA9IHtcbiAgICB0eXBlOiBtYXNrLnR5cGUsXG4gICAgdzogZmluYWxXLFxuICAgIGg6IGZpbmFsSCxcbiAgICBkYXRhOiBuZXcgVWludDhBcnJheShmaW5hbFcgKiBmaW5hbEgpLFxuICB9IGFzIFRcblxuICAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgc291cmNlIG1hc2sgYmFzZWQgb24gdGhlIGJ1ZmZlciBzaXplXG4gIGNvbnN0IHNyY0ggPSBtYXNrLmhcbiAgY29uc3Qgc3RyaWRlID0gbWFzay53XG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZmluYWxIOyByb3crKykge1xuICAgIGNvbnN0IGN1cnJlbnRTcmNZID0gZmluYWxZICsgcm93XG5cbiAgICAvLyBTYWZldHkgQ2hlY2s6IElmIHRoZSByZXF1ZXN0ZWQgcm93IGlzIG91dHNpZGUgdGhlIHNvdXJjZSBtYXNrLCBza2lwIGl0IChsZWF2ZSBhcyAwKVxuICAgIGlmIChjdXJyZW50U3JjWSA8IDAgfHwgY3VycmVudFNyY1kgPj0gc3JjSCkgY29udGludWVcblxuICAgIC8vIENhbGN1bGF0ZSB2YWxpZCBob3Jpem9udGFsIHJhbmdlIHdpdGhpbiB0aGUgc291cmNlIHN0cmlkZVxuICAgIC8vIFdlIG9ubHkgY29weSBpZiBzcmNYIGlzIHdpdGhpbiB0aGUgYWN0dWFsIGJvdW5kcyBvZiB0aGUgc291cmNlIHdpZHRoXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBmaW5hbFgpXG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RyaWRlLCBmaW5hbFggKyBmaW5hbFcpXG5cbiAgICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICAgIGNvbnN0IHNyY09mZnNldCA9IGN1cnJlbnRTcmNZICogc3RyaWRlICsgc3RhcnRcbiAgICAgIGNvbnN0IGRzdE9mZnNldCA9IHJvdyAqIGZpbmFsVyArIChzdGFydCAtIGZpbmFsWClcbiAgICAgIGNvbnN0IGNvdW50ID0gZW5kIC0gc3RhcnRcblxuICAgICAgb3V0LmRhdGEuc2V0KG1hc2suZGF0YS5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50KSwgZHN0T2Zmc2V0KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Inverts a BinaryMask in-place.\n */\nexport function invertBinaryMask(dst: BinaryMask): void {\n const data = dst.data;\n const len = data.length;\n for (let i = 0; i < len; i++) {\n data[i] = data[i] === 0 ? 1 : 0;\n }\n}\n\n/**\n * Inverts an AlphaMask in-place.\n */\nexport function invertAlphaMask(dst: AlphaMask): void {\n const data = dst.data;\n const len = data.length;\n for (let i = 0; i < len; i++) {\n data[i] = 255 - data[i];\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIEJpbmFyeU1hc2sgfSBmcm9tICcuLi9pbmRleCdcblxuLyoqXG4gKiBJbnZlcnRzIGEgQmluYXJ5TWFzayBpbi1wbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVydEJpbmFyeU1hc2soZHN0OiBCaW5hcnlNYXNrKTogdm9pZCB7XG4gIGNvbnN0IGRhdGEgPSBkc3QuZGF0YVxuICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkYXRhW2ldID0gZGF0YVtpXSA9PT0gMFxuICAgICAgPyAxXG4gICAgICA6IDBcbiAgfVxufVxuXG4vKipcbiAqIEludmVydHMgYW4gQWxwaGFNYXNrIGluLXBsYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0QWxwaGFNYXNrKGRzdDogQWxwaGFNYXNrKTogdm9pZCB7XG4gIGNvbnN0IGRhdGEgPSBkc3QuZGF0YVxuICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkYXRhW2ldID0gMjU1IC0gZGF0YVtpXVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Merges 2 alpha masks values are 0-255\n */\nexport function mergeAlphaMasks(dst: AlphaMask, src: AlphaMask, opts: MergeAlphaMasksOptions): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n alpha: globalAlpha = 255,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (width <= 0) return;\n if (height <= 0) return;\n if (globalAlpha === 0) return;\n const dstData = dst.data;\n const srcData = src.data;\n const srcWidth = src.w;\n const dstWidth = dst.w;\n const startX = Math.max(0, -targetX, -mx);\n const startY = Math.max(0, -targetY, -my);\n const endX = Math.min(width, dstWidth - targetX, srcWidth - mx);\n const endY = Math.min(height, dst.h - targetY, src.h - my);\n if (startX >= endX) return;\n if (startY >= endY) return;\n for (let iy = startY; iy < endY; iy++) {\n const dy = targetY + iy;\n const sy = my + iy;\n let dIdx = dy * dstWidth + targetX + startX;\n let sIdx = sy * srcWidth + mx + startX;\n for (let ix = startX; ix < endX; ix++) {\n const rawM = srcData[sIdx];\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - rawM : rawM;\n let weight = 0;\n if (effectiveM === 0) {\n weight = 0;\n } else if (effectiveM === 255) {\n weight = globalAlpha;\n } else if (globalAlpha === 255) {\n weight = effectiveM;\n } else {\n weight = effectiveM * globalAlpha + 128 >> 8;\n }\n if (weight !== 255) {\n if (weight === 0) {\n dstData[dIdx] = 0;\n } else {\n const da = dstData[dIdx];\n if (da === 255) {\n dstData[dIdx] = weight;\n } else if (da !== 0) {\n dstData[dIdx] = da * weight + 128 >> 8;\n }\n }\n }\n sIdx++;\n dIdx++;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgTWVyZ2VBbHBoYU1hc2tzT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcblxuLyoqXG4gKiBNZXJnZXMgMiBhbHBoYSBtYXNrcyB2YWx1ZXMgYXJlIDAtMjU1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFscGhhTWFza3MoXG4gIGRzdDogQWxwaGFNYXNrLFxuICBzcmM6IEFscGhhTWFzayxcbiAgb3B0czogTWVyZ2VBbHBoYU1hc2tzT3B0aW9ucyxcbik6IHZvaWQge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgdzogd2lkdGggPSAwLFxuICAgIGg6IGhlaWdodCA9IDAsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmICh3aWR0aCA8PSAwKSByZXR1cm5cbiAgaWYgKGhlaWdodCA8PSAwKSByZXR1cm5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3REYXRhID0gZHN0LmRhdGFcbiAgY29uc3Qgc3JjRGF0YSA9IHNyYy5kYXRhXG4gIGNvbnN0IHNyY1dpZHRoID0gc3JjLndcbiAgY29uc3QgZHN0V2lkdGggPSBkc3Qud1xuXG4gIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWF4KDAsIC10YXJnZXRYLCAtbXgpXG4gIGNvbnN0IHN0YXJ0WSA9IE1hdGgubWF4KDAsIC10YXJnZXRZLCAtbXkpXG5cbiAgY29uc3QgZW5kWCA9IE1hdGgubWluKHdpZHRoLCBkc3RXaWR0aCAtIHRhcmdldFgsIHNyY1dpZHRoIC0gbXgpXG4gIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihoZWlnaHQsIGRzdC5oIC0gdGFyZ2V0WSwgc3JjLmggLSBteSlcblxuICBpZiAoc3RhcnRYID49IGVuZFgpIHJldHVyblxuICBpZiAoc3RhcnRZID49IGVuZFkpIHJldHVyblxuXG4gIGZvciAobGV0IGl5ID0gc3RhcnRZOyBpeSA8IGVuZFk7IGl5KyspIHtcbiAgICBjb25zdCBkeSA9IHRhcmdldFkgKyBpeVxuICAgIGNvbnN0IHN5ID0gbXkgKyBpeVxuXG4gICAgbGV0IGRJZHggPSBkeSAqIGRzdFdpZHRoICsgdGFyZ2V0WCArIHN0YXJ0WFxuICAgIGxldCBzSWR4ID0gc3kgKiBzcmNXaWR0aCArIG14ICsgc3RhcnRYXG5cbiAgICBmb3IgKGxldCBpeCA9IHN0YXJ0WDsgaXggPCBlbmRYOyBpeCsrKSB7XG4gICAgICBjb25zdCByYXdNID0gc3JjRGF0YVtzSWR4XVxuICAgICAgLy8gVW5pZmllZCBsb2dpYyBicmFuY2ggaW5zaWRlIHRoZSBob3QgcGF0aFxuICAgICAgY29uc3QgZWZmZWN0aXZlTSA9IGludmVydE1hc2sgPyAyNTUgLSByYXdNIDogcmF3TVxuXG4gICAgICBsZXQgd2VpZ2h0ID0gMFxuXG4gICAgICBpZiAoZWZmZWN0aXZlTSA9PT0gMCkge1xuICAgICAgICB3ZWlnaHQgPSAwXG4gICAgICB9IGVsc2UgaWYgKGVmZmVjdGl2ZU0gPT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBnbG9iYWxBbHBoYVxuICAgICAgfSBlbHNlIGlmIChnbG9iYWxBbHBoYSA9PT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IGVmZmVjdGl2ZU1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdlaWdodCA9IChlZmZlY3RpdmVNICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgIH1cblxuICAgICAgaWYgKHdlaWdodCAhPT0gMjU1KSB7XG4gICAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgICBkc3REYXRhW2RJZHhdID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRhID0gZHN0RGF0YVtkSWR4XVxuXG4gICAgICAgICAgaWYgKGRhID09PSAyNTUpIHtcbiAgICAgICAgICAgIGRzdERhdGFbZElkeF0gPSB3ZWlnaHRcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhICE9PSAwKSB7XG4gICAgICAgICAgICBkc3REYXRhW2RJZHhdID0gKGRhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNJZHgrK1xuICAgICAgZElkeCsrXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function mergeBinaryMasks(dst: BinaryMask, src: BinaryMask, opts: MergeAlphaMasksOptions): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n const dstData = dst.data;\n const srcData = src.data;\n const srcWidth = src.w;\n const dstWidth = dst.w;\n if (dstWidth <= 0) return;\n if (srcWidth <= 0) return;\n\n // 1. Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dstWidth - x);\n h = Math.min(h, dst.h - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Source Bounds Clipping (Double Clipping)\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(srcWidth, startX + w);\n const sY1 = Math.min(src.h, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 3. Coordinate Alignment\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dStride = dstWidth - finalW;\n const sStride = srcWidth - finalW;\n let dIdx = (y + yShift) * dstWidth + (x + xShift);\n let sIdx = sY0 * srcWidth + sX0;\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = srcData[sIdx];\n // Determine if the source pixel effectively \"clears\" the destination\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n dstData[dIdx] = 0;\n }\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBNZXJnZUFscGhhTWFza3NPcHRpb25zIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlNYXNrcyhcbiAgZHN0OiBCaW5hcnlNYXNrLFxuICBzcmM6IEJpbmFyeU1hc2ssXG4gIG9wdHM6IE1lcmdlQWxwaGFNYXNrc09wdGlvbnMsXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gMCxcbiAgICBoOiBoZWlnaHQgPSAwLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGNvbnN0IGRzdERhdGEgPSBkc3QuZGF0YVxuICBjb25zdCBzcmNEYXRhID0gc3JjLmRhdGFcbiAgY29uc3Qgc3JjV2lkdGggPSBzcmMud1xuICBjb25zdCBkc3RXaWR0aCA9IGRzdC53XG5cbiAgaWYgKGRzdFdpZHRoIDw9IDApIHJldHVyblxuICBpZiAoc3JjV2lkdGggPD0gMCkgcmV0dXJuXG5cbiAgLy8gMS4gRGVzdGluYXRpb24gQ2xpcHBpbmdcbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuXG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICB3ID0gTWF0aC5taW4odywgZHN0V2lkdGggLSB4KVxuICBoID0gTWF0aC5taW4oaCwgZHN0LmggLSB5KVxuXG4gIGlmICh3IDw9IDApIHJldHVyblxuICBpZiAoaCA8PSAwKSByZXR1cm5cblxuICAvLyAyLiBTb3VyY2UgQm91bmRzIENsaXBwaW5nIChEb3VibGUgQ2xpcHBpbmcpXG4gIGNvbnN0IHN0YXJ0WCA9IG14ICsgKHggLSB0YXJnZXRYKVxuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSlcblxuICBjb25zdCBzWDAgPSBNYXRoLm1heCgwLCBzdGFydFgpXG4gIGNvbnN0IHNZMCA9IE1hdGgubWF4KDAsIHN0YXJ0WSlcbiAgY29uc3Qgc1gxID0gTWF0aC5taW4oc3JjV2lkdGgsIHN0YXJ0WCArIHcpXG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKHNyYy5oLCBzdGFydFkgKyBoKVxuXG4gIGNvbnN0IGZpbmFsVyA9IHNYMSAtIHNYMFxuICBjb25zdCBmaW5hbEggPSBzWTEgLSBzWTBcblxuICBpZiAoZmluYWxXIDw9IDApIHJldHVyblxuICBpZiAoZmluYWxIIDw9IDApIHJldHVyblxuXG4gIC8vIDMuIENvb3JkaW5hdGUgQWxpZ25tZW50XG4gIGNvbnN0IHhTaGlmdCA9IHNYMCAtIHN0YXJ0WFxuICBjb25zdCB5U2hpZnQgPSBzWTAgLSBzdGFydFlcblxuICBjb25zdCBkU3RyaWRlID0gZHN0V2lkdGggLSBmaW5hbFdcbiAgY29uc3Qgc1N0cmlkZSA9IHNyY1dpZHRoIC0gZmluYWxXXG5cbiAgbGV0IGRJZHggPSAoeSArIHlTaGlmdCkgKiBkc3RXaWR0aCArICh4ICsgeFNoaWZ0KVxuICBsZXQgc0lkeCA9IHNZMCAqIHNyY1dpZHRoICsgc1gwXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGZpbmFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBmaW5hbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBzcmNEYXRhW3NJZHhdXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIHNvdXJjZSBwaXhlbCBlZmZlY3RpdmVseSBcImNsZWFyc1wiIHRoZSBkZXN0aW5hdGlvblxuICAgICAgY29uc3QgaXNNYXNrZWRPdXQgPSBpbnZlcnRNYXNrID8gbVZhbCAhPT0gMCA6IG1WYWwgPT09IDBcblxuICAgICAgaWYgKGlzTWFza2VkT3V0KSB7XG4gICAgICAgIGRzdERhdGFbZElkeF0gPSAwXG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgfVxuXG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgc0lkeCArPSBzU3RyaWRlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function setMaskData(mask: Mask, width: number, height: number, data: Uint8Array): void {\n ;\n (mask as any).w = width;\n (mask as any).h = height;\n (mask as any).data = data;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNYXNrIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWFza0RhdGEobWFzazogTWFzaywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE6IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgOyhtYXNrIGFzIGFueSkudyA9IHdpZHRoXG4gIDsobWFzayBhcyBhbnkpLmggPSBoZWlnaHRcbiAgOyhtYXNrIGFzIGFueSkuZGF0YSA9IGRhdGFcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../_types';\nexport function subtractBinaryMaskRects(current: NullableBinaryMaskRect[], subtracting: NullableBinaryMaskRect[]): NullableBinaryMaskRect[] {\n let result = [...current];\n for (const sub of subtracting) {\n const next: NullableBinaryMaskRect[] = [];\n for (const r of result) {\n const ix = Math.max(r.x, sub.x);\n const iy = Math.max(r.y, sub.y);\n const ix2 = Math.min(r.x + r.w, sub.x + sub.w);\n const iy2 = Math.min(r.y + r.h, sub.y + sub.h);\n if (ix >= ix2 || iy >= iy2) {\n next.push(r);\n continue;\n }\n\n // Split r into up to 4 pieces around the intersection.\n // Extract directly from r.mask — no intermediate copy, no mutation.\n //\n // ┌──────────────┐\n // │ TOP │ r.y .. iy (full width)\n // ├────┬─────┬───┤\n // │LEFT│ sub │RGT│ iy .. iy2 (side strips)\n // ├────┴─────┴───┤\n // │ BOTTOM │ iy2 .. r.y+r.h (full width)\n // └──────────────┘\n\n if (r.y < iy) pushPiece(next, r, r.x, r.y, r.w, iy - r.y);\n if (iy2 < r.y + r.h) pushPiece(next, r, r.x, iy2, r.w, r.y + r.h - iy2);\n if (r.x < ix) pushPiece(next, r, r.x, iy, ix - r.x, iy2 - iy);\n if (ix2 < r.x + r.w) pushPiece(next, r, ix2, iy, r.x + r.w - ix2, iy2 - iy);\n }\n result = next;\n }\n return result;\n}\n\n/**\n * Extract sub-region (x, y, w, h) in global coords from r's mask and push\n * onto dest. If r.mask is null (fully selected) the piece is also null —\n * zero allocations on the happy path.\n */\nfunction pushPiece(dest: NullableBinaryMaskRect[], r: NullableBinaryMaskRect, x: number, y: number, w: number, h: number): void {\n if (r.data === null || r.data === undefined) {\n dest.push({\n x,\n y,\n w,\n h,\n data: null,\n type: null\n });\n return;\n }\n\n // Coords local to r.mask\n const lx = x - r.x;\n const ly = y - r.y;\n const data = new Uint8Array(w * h);\n for (let row = 0; row < h; row++) {\n data.set(r.data.subarray((ly + row) * r.w + lx, (ly + row) * r.w + lx + w), row * w);\n }\n dest.push({\n x,\n y,\n w,\n h,\n data,\n type: MaskType.BINARY\n });\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUsIHR5cGUgTnVsbGFibGVCaW5hcnlNYXNrUmVjdCB9IGZyb20gJy4uL190eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0QmluYXJ5TWFza1JlY3RzKFxuICBjdXJyZW50OiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0W10sXG4gIHN1YnRyYWN0aW5nOiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0W10sXG4pOiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0W10ge1xuICBsZXQgcmVzdWx0ID0gWy4uLmN1cnJlbnRdXG5cbiAgZm9yIChjb25zdCBzdWIgb2Ygc3VidHJhY3RpbmcpIHtcbiAgICBjb25zdCBuZXh0OiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0W10gPSBbXVxuXG4gICAgZm9yIChjb25zdCByIG9mIHJlc3VsdCkge1xuICAgICAgY29uc3QgaXggPSBNYXRoLm1heChyLngsIHN1Yi54KVxuICAgICAgY29uc3QgaXkgPSBNYXRoLm1heChyLnksIHN1Yi55KVxuICAgICAgY29uc3QgaXgyID0gTWF0aC5taW4oci54ICsgci53LCBzdWIueCArIHN1Yi53KVxuICAgICAgY29uc3QgaXkyID0gTWF0aC5taW4oci55ICsgci5oLCBzdWIueSArIHN1Yi5oKVxuXG4gICAgICBpZiAoaXggPj0gaXgyIHx8IGl5ID49IGl5Mikge1xuICAgICAgICBuZXh0LnB1c2gocilcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gU3BsaXQgciBpbnRvIHVwIHRvIDQgcGllY2VzIGFyb3VuZCB0aGUgaW50ZXJzZWN0aW9uLlxuICAgICAgLy8gRXh0cmFjdCBkaXJlY3RseSBmcm9tIHIubWFzayDigJQgbm8gaW50ZXJtZWRpYXRlIGNvcHksIG5vIG11dGF0aW9uLlxuICAgICAgLy9cbiAgICAgIC8vICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAgICAvLyAgIOKUgiAgICAgVE9QICAgICAg4pSCICByLnkgLi4gaXkgICAgICAoZnVsbCB3aWR0aClcbiAgICAgIC8vICAg4pSc4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSkXG4gICAgICAvLyAgIOKUgkxFRlTilIIgc3ViIOKUglJHVOKUgiAgaXkgLi4gaXkyICAgICAgKHNpZGUgc3RyaXBzKVxuICAgICAgLy8gICDilJzilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilLTilIDilIDilIDilKRcbiAgICAgIC8vICAg4pSCICAgIEJPVFRPTSAgICDilIIgIGl5MiAuLiByLnkrci5oIChmdWxsIHdpZHRoKVxuICAgICAgLy8gICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuICAgICAgaWYgKHIueSA8IGl5KSBwdXNoUGllY2UobmV4dCwgciwgci54LCByLnksIHIudywgaXkgLSByLnkpXG4gICAgICBpZiAoaXkyIDwgci55ICsgci5oKSBwdXNoUGllY2UobmV4dCwgciwgci54LCBpeTIsIHIudywgci55ICsgci5oIC0gaXkyKVxuICAgICAgaWYgKHIueCA8IGl4KSBwdXNoUGllY2UobmV4dCwgciwgci54LCBpeSwgaXggLSByLngsIGl5MiAtIGl5KVxuICAgICAgaWYgKGl4MiA8IHIueCArIHIudykgcHVzaFBpZWNlKG5leHQsIHIsIGl4MiwgaXksIHIueCArIHIudyAtIGl4MiwgaXkyIC0gaXkpXG4gICAgfVxuXG4gICAgcmVzdWx0ID0gbmV4dFxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEV4dHJhY3Qgc3ViLXJlZ2lvbiAoeCwgeSwgdywgaCkgaW4gZ2xvYmFsIGNvb3JkcyBmcm9tIHIncyBtYXNrIGFuZCBwdXNoXG4gKiBvbnRvIGRlc3QuIElmIHIubWFzayBpcyBudWxsIChmdWxseSBzZWxlY3RlZCkgdGhlIHBpZWNlIGlzIGFsc28gbnVsbCDigJRcbiAqIHplcm8gYWxsb2NhdGlvbnMgb24gdGhlIGhhcHB5IHBhdGguXG4gKi9cbmZ1bmN0aW9uIHB1c2hQaWVjZShcbiAgZGVzdDogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdLFxuICByOiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgaWYgKHIuZGF0YSA9PT0gbnVsbCB8fCByLmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIGRlc3QucHVzaCh7IHgsIHksIHcsIGgsIGRhdGE6IG51bGwsIHR5cGU6IG51bGwgfSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIENvb3JkcyBsb2NhbCB0byByLm1hc2tcbiAgY29uc3QgbHggPSB4IC0gci54XG4gIGNvbnN0IGx5ID0geSAtIHIueVxuXG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3ICogaClcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaDsgcm93KyspIHtcbiAgICBkYXRhLnNldChcbiAgICAgIHIuZGF0YS5zdWJhcnJheShcbiAgICAgICAgKGx5ICsgcm93KSAqIHIudyArIGx4LFxuICAgICAgICAobHkgKyByb3cpICogci53ICsgbHggKyB3LFxuICAgICAgKSxcbiAgICAgIHJvdyAqIHcsXG4gICAgKVxuICB9XG5cbiAgZGVzdC5wdXNoKHsgeCwgeSwgdywgaCwgZGF0YSwgdHlwZTogTWFza1R5cGUuQklOQVJZIH0pXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Rect } from '../_types';\nexport function getRectsBounds<T extends Rect>(rects: T[]): T {\n if (rects.length === 1) return {\n ...rects[0]\n };\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n for (let i = 0; i < rects.length; i++) {\n const r = rects[i];\n const x1 = r.x;\n const y1 = r.y;\n const x2 = x1 + r.w;\n const y2 = y1 + r.h;\n if (x1 < minX) minX = x1;\n if (y1 < minY) minY = y1;\n if (x2 > maxX) maxX = x2;\n if (y2 > maxY) maxY = y2;\n }\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY\n } as T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdHNCb3VuZHM8VCBleHRlbmRzIFJlY3Q+KHJlY3RzOiBUW10pOiBUIHtcbiAgaWYgKHJlY3RzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHsgLi4ucmVjdHNbMF0gfVxuICBsZXQgbWluWCA9IEluZmluaXR5LCBtaW5ZID0gSW5maW5pdHlcbiAgbGV0IG1heFggPSAtSW5maW5pdHksIG1heFkgPSAtSW5maW5pdHlcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgciA9IHJlY3RzW2ldXG4gICAgY29uc3QgeDEgPSByLnhcbiAgICBjb25zdCB5MSA9IHIueVxuICAgIGNvbnN0IHgyID0geDEgKyByLndcbiAgICBjb25zdCB5MiA9IHkxICsgci5oXG5cbiAgICBpZiAoeDEgPCBtaW5YKSBtaW5YID0geDFcbiAgICBpZiAoeTEgPCBtaW5ZKSBtaW5ZID0geTFcbiAgICBpZiAoeDIgPiBtYXhYKSBtYXhYID0geDJcbiAgICBpZiAoeTIgPiBtYXhZKSBtYXhZID0geTJcbiAgfVxuXG4gIHJldHVybiB7IHg6IG1pblgsIHk6IG1pblksIHc6IG1heFggLSBtaW5YLCBoOiBtYXhZIC0gbWluWSB9IGFzIFRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../_types';\nimport { getRectsBounds } from '../Rect/getRectsBounds';\nexport function merge2BinaryMaskRects(a: NullableBinaryMaskRect, b: NullableBinaryMaskRect): NullableBinaryMaskRect {\n const bounds = getRectsBounds([a, b]);\n\n // If both are fully selected, check if they form a perfect, gapless rectangle\n if ((a.data === null || a.data === undefined) && (b.data === null || b.data === undefined)) {\n const ix = Math.max(a.x, b.x);\n const iy = Math.max(a.y, b.y);\n const ir = Math.min(a.x + a.w, b.x + b.w);\n const ib = Math.min(a.y + a.h, b.y + b.h);\n const iw = Math.max(0, ir - ix);\n const ih = Math.max(0, ib - iy);\n const intersectionArea = iw * ih;\n const areaA = a.w * a.h;\n const areaB = b.w * b.h;\n const boundsArea = bounds.w * bounds.h;\n if (boundsArea === areaA + areaB - intersectionArea) {\n return {\n ...bounds,\n data: null,\n type: null\n };\n }\n }\n const maskData = new Uint8Array(bounds.w * bounds.h);\n\n // --- Write A's contribution ---\n const aOffY = a.y - bounds.y;\n const aOffX = a.x - bounds.x;\n if (a.data === undefined || a.data === null) {\n for (let ay = 0; ay < a.h; ay++) {\n const destRow = (aOffY + ay) * bounds.w + aOffX;\n maskData.fill(1, destRow, destRow + a.w);\n }\n } else {\n for (let ay = 0; ay < a.h; ay++) {\n const srcRow = ay * a.w;\n const destRow = (aOffY + ay) * bounds.w + aOffX;\n maskData.set(a.data.subarray(srcRow, srcRow + a.w), destRow);\n }\n }\n\n // --- OR B's contribution ---\n const bOffY = b.y - bounds.y;\n const bOffX = b.x - bounds.x;\n if (b.data === undefined || b.data === null) {\n for (let by = 0; by < b.h; by++) {\n const destRow = (bOffY + by) * bounds.w + bOffX;\n maskData.fill(1, destRow, destRow + b.w);\n }\n } else {\n for (let by = 0; by < b.h; by++) {\n const srcRow = by * b.w;\n const destRow = (bOffY + by) * bounds.w + bOffX;\n for (let bx = 0; bx < b.w; bx++) {\n maskData[destRow + bx] |= b.data[srcRow + bx];\n }\n }\n }\n return {\n ...bounds,\n data: maskData,\n type: MaskType.BINARY\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUsIHR5cGUgTnVsbGFibGVCaW5hcnlNYXNrUmVjdCB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IGdldFJlY3RzQm91bmRzIH0gZnJvbSAnLi4vUmVjdC9nZXRSZWN0c0JvdW5kcydcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlMkJpbmFyeU1hc2tSZWN0cyhcbiAgYTogTnVsbGFibGVCaW5hcnlNYXNrUmVjdCxcbiAgYjogTnVsbGFibGVCaW5hcnlNYXNrUmVjdCxcbik6IE51bGxhYmxlQmluYXJ5TWFza1JlY3Qge1xuICBjb25zdCBib3VuZHMgPSBnZXRSZWN0c0JvdW5kcyhbYSwgYl0pXG5cbiAgLy8gSWYgYm90aCBhcmUgZnVsbHkgc2VsZWN0ZWQsIGNoZWNrIGlmIHRoZXkgZm9ybSBhIHBlcmZlY3QsIGdhcGxlc3MgcmVjdGFuZ2xlXG4gIGlmIChcbiAgICAoYS5kYXRhID09PSBudWxsIHx8IGEuZGF0YSA9PT0gdW5kZWZpbmVkKVxuICAgICYmIChiLmRhdGEgPT09IG51bGwgfHwgYi5kYXRhID09PSB1bmRlZmluZWQpXG4gICkge1xuICAgIGNvbnN0IGl4ID0gTWF0aC5tYXgoYS54LCBiLngpXG4gICAgY29uc3QgaXkgPSBNYXRoLm1heChhLnksIGIueSlcbiAgICBjb25zdCBpciA9IE1hdGgubWluKGEueCArIGEudywgYi54ICsgYi53KVxuICAgIGNvbnN0IGliID0gTWF0aC5taW4oYS55ICsgYS5oLCBiLnkgKyBiLmgpXG5cbiAgICBjb25zdCBpdyA9IE1hdGgubWF4KDAsIGlyIC0gaXgpXG4gICAgY29uc3QgaWggPSBNYXRoLm1heCgwLCBpYiAtIGl5KVxuXG4gICAgY29uc3QgaW50ZXJzZWN0aW9uQXJlYSA9IGl3ICogaWhcbiAgICBjb25zdCBhcmVhQSA9IGEudyAqIGEuaFxuICAgIGNvbnN0IGFyZWFCID0gYi53ICogYi5oXG4gICAgY29uc3QgYm91bmRzQXJlYSA9IGJvdW5kcy53ICogYm91bmRzLmhcblxuICAgIGlmIChib3VuZHNBcmVhID09PSBhcmVhQSArIGFyZWFCIC0gaW50ZXJzZWN0aW9uQXJlYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYm91bmRzLFxuICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICB0eXBlOiBudWxsLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gY29uc3QgbWFza0RhdGEgPSAgbmV3IFVpbnQ4QXJyYXkoYm91bmRzLncgKiBib3VuZHMuaClcblxuICAvLyAtLS0gV3JpdGUgQSdzIGNvbnRyaWJ1dGlvbiAtLS1cbiAgY29uc3QgYU9mZlkgPSBhLnkgLSBib3VuZHMueVxuICBjb25zdCBhT2ZmWCA9IGEueCAtIGJvdW5kcy54XG5cbiAgaWYgKGEuZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGEuZGF0YSA9PT0gbnVsbCkge1xuICAgIGZvciAobGV0IGF5ID0gMDsgYXkgPCBhLmg7IGF5KyspIHtcbiAgICAgIGNvbnN0IGRlc3RSb3cgPSAoYU9mZlkgKyBheSkgKiBib3VuZHMudyArIGFPZmZYXG4gICAgICBtYXNrRGF0YS5maWxsKDEsIGRlc3RSb3csIGRlc3RSb3cgKyBhLncpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGF5ID0gMDsgYXkgPCBhLmg7IGF5KyspIHtcbiAgICAgIGNvbnN0IHNyY1JvdyA9IGF5ICogYS53XG4gICAgICBjb25zdCBkZXN0Um93ID0gKGFPZmZZICsgYXkpICogYm91bmRzLncgKyBhT2ZmWFxuICAgICAgbWFza0RhdGEuc2V0KGEuZGF0YS5zdWJhcnJheShzcmNSb3csIHNyY1JvdyArIGEudyksIGRlc3RSb3cpXG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIE9SIEIncyBjb250cmlidXRpb24gLS0tXG4gIGNvbnN0IGJPZmZZID0gYi55IC0gYm91bmRzLnlcbiAgY29uc3QgYk9mZlggPSBiLnggLSBib3VuZHMueFxuXG4gIGlmIChiLmRhdGEgPT09IHVuZGVmaW5lZCB8fCBiLmRhdGEgPT09IG51bGwpIHtcbiAgICBmb3IgKGxldCBieSA9IDA7IGJ5IDwgYi5oOyBieSsrKSB7XG4gICAgICBjb25zdCBkZXN0Um93ID0gKGJPZmZZICsgYnkpICogYm91bmRzLncgKyBiT2ZmWFxuICAgICAgbWFza0RhdGEuZmlsbCgxLCBkZXN0Um93LCBkZXN0Um93ICsgYi53KVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBieSA9IDA7IGJ5IDwgYi5oOyBieSsrKSB7XG4gICAgICBjb25zdCBzcmNSb3cgPSBieSAqIGIud1xuICAgICAgY29uc3QgZGVzdFJvdyA9IChiT2ZmWSArIGJ5KSAqIGJvdW5kcy53ICsgYk9mZlhcblxuICAgICAgZm9yIChsZXQgYnggPSAwOyBieCA8IGIudzsgYngrKykge1xuICAgICAgICBtYXNrRGF0YVtkZXN0Um93ICsgYnhdIHw9IGIuZGF0YVtzcmNSb3cgKyBieF1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmJvdW5kcyxcbiAgICBkYXRhOiBtYXNrRGF0YSxcbiAgICB0eXBlOiBNYXNrVHlwZS5CSU5BUlksXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { merge2BinaryMaskRects } from './merge2BinaryMaskRects';\nexport function mergeBinaryMaskRects(current: NullableBinaryMaskRect[], adding: NullableBinaryMaskRect[]): NullableBinaryMaskRect[] {\n const rects = [...current, ...adding];\n let changed = true;\n while (changed) {\n changed = false;\n const next: NullableBinaryMaskRect[] = [];\n for (const r of rects) {\n let merged = false;\n for (let i = 0; i < next.length; i++) {\n const n = next[i];\n const overlap = r.x <= n.x + n.w && r.x + r.w >= n.x && r.y <= n.y + n.h && r.y + r.h >= n.y;\n if (overlap) {\n next[i] = merge2BinaryMaskRects(n, r);\n merged = true;\n changed = true;\n break;\n }\n }\n if (!merged) next.push(r);\n }\n rects.splice(0, rects.length, ...next);\n }\n return rects;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWVyZ2UyQmluYXJ5TWFza1JlY3RzIH0gZnJvbSAnLi9tZXJnZTJCaW5hcnlNYXNrUmVjdHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUJpbmFyeU1hc2tSZWN0cyhjdXJyZW50OiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0W10sIGFkZGluZzogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdKTogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdIHtcbiAgY29uc3QgcmVjdHMgPSBbLi4uY3VycmVudCwgLi4uYWRkaW5nXVxuXG4gIGxldCBjaGFuZ2VkID0gdHJ1ZVxuICB3aGlsZSAoY2hhbmdlZCkge1xuICAgIGNoYW5nZWQgPSBmYWxzZVxuICAgIGNvbnN0IG5leHQ6IE51bGxhYmxlQmluYXJ5TWFza1JlY3RbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVjdHMpIHtcbiAgICAgIGxldCBtZXJnZWQgPSBmYWxzZVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbiA9IG5leHRbaV1cblxuICAgICAgICBjb25zdCBvdmVybGFwID1cbiAgICAgICAgICByLnggPD0gbi54ICsgbi53ICYmXG4gICAgICAgICAgci54ICsgci53ID49IG4ueCAmJlxuICAgICAgICAgIHIueSA8PSBuLnkgKyBuLmggJiZcbiAgICAgICAgICByLnkgKyByLmggPj0gbi55XG5cbiAgICAgICAgaWYgKG92ZXJsYXApIHtcbiAgICAgICAgICBuZXh0W2ldID0gbWVyZ2UyQmluYXJ5TWFza1JlY3RzKG4sIHIpXG4gICAgICAgICAgbWVyZ2VkID0gdHJ1ZVxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW1lcmdlZCkgbmV4dC5wdXNoKHIpXG4gICAgfVxuXG4gICAgcmVjdHMuc3BsaWNlKDAsIHJlY3RzLmxlbmd0aCwgLi4ubmV4dClcbiAgfVxuXG4gIHJldHVybiByZWN0c1xufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { ImageDataLike, ImageDataLikeConstructor, IPixelData } from '../_types';\nimport { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array';\nexport class PixelData<T extends ImageDataLike = ImageData> implements IPixelData {\n readonly data32: Uint32Array;\n readonly imageData: T;\n readonly width: number;\n readonly height: number;\n constructor(imageData: T) {\n this.data32 = imageDataToUInt32Array(imageData);\n this.imageData = imageData;\n this.width = imageData.width;\n this.height = imageData.height;\n }\n set(imageData: T): void {\n ;\n (this as any).imageData = imageData;\n (this as any).data32 = imageDataToUInt32Array(imageData);\n (this as any).width = imageData.width;\n (this as any).height = imageData.height;\n }\n\n // should only be used for debug and testing\n copy(): PixelData<T> {\n const data = this.imageData.data;\n const buffer = new Uint8ClampedArray(data);\n const Ctor = this.imageData.constructor;\n const isCtorValid = typeof Ctor === 'function';\n let newImageData: T;\n if (isCtorValid && Ctor !== Object) {\n const ImageConstructor = Ctor as ImageDataLikeConstructor<T>;\n newImageData = new ImageConstructor(buffer, this.width, this.height);\n } else {\n newImageData = {\n width: this.width,\n height: this.height,\n data: buffer\n } as unknown as T;\n }\n return new PixelData<T>(newImageData);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlLCBJbWFnZURhdGFMaWtlQ29uc3RydWN0b3IsIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBpbWFnZURhdGFUb1VJbnQzMkFycmF5IH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvVUludDMyQXJyYXknXG5cbmV4cG9ydCBjbGFzcyBQaXhlbERhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgPSBJbWFnZURhdGE+IGltcGxlbWVudHMgSVBpeGVsRGF0YSB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXlcbiAgcmVhZG9ubHkgaW1hZ2VEYXRhOiBUXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXJcbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXJcblxuICBjb25zdHJ1Y3RvcihpbWFnZURhdGE6IFQpIHtcbiAgICB0aGlzLmRhdGEzMiA9IGltYWdlRGF0YVRvVUludDMyQXJyYXkoaW1hZ2VEYXRhKVxuICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhXG4gICAgdGhpcy53aWR0aCA9IGltYWdlRGF0YS53aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodFxuICB9XG5cbiAgc2V0KGltYWdlRGF0YTogVCk6IHZvaWQge1xuICAgIDsodGhpcyBhcyBhbnkpLmltYWdlRGF0YSA9IGltYWdlRGF0YVxuICAgIDsodGhpcyBhcyBhbnkpLmRhdGEzMiA9IGltYWdlRGF0YVRvVUludDMyQXJyYXkoaW1hZ2VEYXRhKVxuICAgIDsodGhpcyBhcyBhbnkpLndpZHRoID0gaW1hZ2VEYXRhLndpZHRoXG4gICAgOyh0aGlzIGFzIGFueSkuaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodFxuICB9XG5cbiAgLy8gc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWcgYW5kIHRlc3RpbmdcbiAgY29weSgpOiBQaXhlbERhdGE8VD4ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmltYWdlRGF0YS5kYXRhXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEpXG4gICAgY29uc3QgQ3RvciA9IHRoaXMuaW1hZ2VEYXRhLmNvbnN0cnVjdG9yXG4gICAgY29uc3QgaXNDdG9yVmFsaWQgPSB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgbGV0IG5ld0ltYWdlRGF0YTogVFxuICAgIGlmIChpc0N0b3JWYWxpZCAmJiBDdG9yICE9PSBPYmplY3QpIHtcbiAgICAgIGNvbnN0IEltYWdlQ29uc3RydWN0b3IgPSBDdG9yIGFzIEltYWdlRGF0YUxpa2VDb25zdHJ1Y3RvcjxUPlxuICAgICAgbmV3SW1hZ2VEYXRhID0gbmV3IEltYWdlQ29uc3RydWN0b3IoXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgdGhpcy53aWR0aCxcbiAgICAgICAgdGhpcy5oZWlnaHQsXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0ltYWdlRGF0YSA9IHtcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICAgIGRhdGE6IGJ1ZmZlcixcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQaXhlbERhdGE8VD4obmV3SW1hZ2VEYXRhKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataAlphaMask(dst: IPixelData, src: IPixelData, alphaMask: AlphaMask, opts: PixelBlendMaskOptions = {}) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n\n // 1. Clipping (Matches main branch behavior)\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // 2. Index Setup\n const dw = dst.width;\n const sw = src.width;\n const mPitch = alphaMask.w;\n const maskData = alphaMask.data;\n\n // dx/dy is the displacement from requested start to clipped start.\n // This keeps the mask locked to the source content during cross-clipping.\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const src32 = src.data32;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite || false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = maskData[mIdx];\n const effM = invertMask ? 255 - mVal : mVal;\n\n // Early exit if mask is fully transparent\n if (effM === 0) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n\n // Early exit if source is fully transparent (unless overwriting)\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n\n // Calculate weight using linear logic (Easier for JIT than nested ternaries)\n let weight = globalAlpha;\n if (isOpaque) {\n weight = effM;\n } else if (effM !== 255) {\n weight = effM * globalAlpha + 128 >> 8;\n }\n\n // Zero-weight safety check\n if (weight === 0) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (weight < 255) {\n const a = srcAlpha * weight + 128 >> 8;\n // Final check: weight might have resulted in a transparent pixel\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQ29sb3IzMiwgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFBpeGVsQmxlbmRNYXNrT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGFBbHBoYU1hc2soXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgc3JjOiBJUGl4ZWxEYXRhLFxuICBhbHBoYU1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogUGl4ZWxCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHN4OiBzb3VyY2VYID0gMCxcbiAgICBzeTogc291cmNlWSA9IDAsXG4gICAgdzogd2lkdGggPSBzcmMud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gc3JjLmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgc3ggPSBzb3VyY2VYXG4gIGxldCBzeSA9IHNvdXJjZVlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIC8vIDEuIENsaXBwaW5nIChNYXRjaGVzIG1haW4gYnJhbmNoIGJlaGF2aW9yKVxuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeFxuICAgIHcgKz0gc3hcbiAgICBzeCA9IDBcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeVxuICAgIGggKz0gc3lcbiAgICBzeSA9IDBcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpXG4gIGggPSBNYXRoLm1pbihoLCBzcmMuaGVpZ2h0IC0gc3kpXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIDIuIEluZGV4IFNldHVwXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IGFscGhhTWFzay53XG4gIGNvbnN0IG1hc2tEYXRhID0gYWxwaGFNYXNrLmRhdGFcblxuICAvLyBkeC9keSBpcyB0aGUgZGlzcGxhY2VtZW50IGZyb20gcmVxdWVzdGVkIHN0YXJ0IHRvIGNsaXBwZWQgc3RhcnQuXG4gIC8vIFRoaXMga2VlcHMgdGhlIG1hc2sgbG9ja2VkIHRvIHRoZSBzb3VyY2UgY29udGVudCBkdXJpbmcgY3Jvc3MtY2xpcHBpbmcuXG4gIGNvbnN0IGR4ID0gKHggLSB0YXJnZXRYKSB8IDBcbiAgY29uc3QgZHkgPSAoeSAtIHRhcmdldFkpIHwgMFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBzcmMzMiA9IHNyYy5kYXRhMzJcblxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IHNJZHggPSAoc3kgKiBzdyArIHN4KSB8IDBcbiAgbGV0IG1JZHggPSAoKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpKSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNTdHJpZGUgPSAoc3cgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcblxuICBjb25zdCBpc09wYXF1ZSA9IGdsb2JhbEFscGhhID09PSAyNTVcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSBibGVuZEZuLmlzT3ZlcndyaXRlIHx8IGZhbHNlXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IG1hc2tEYXRhW21JZHhdXG4gICAgICBjb25zdCBlZmZNID0gaW52ZXJ0TWFzayA/IDI1NSAtIG1WYWwgOiBtVmFsXG5cbiAgICAgIC8vIEVhcmx5IGV4aXQgaWYgbWFzayBpcyBmdWxseSB0cmFuc3BhcmVudFxuICAgICAgaWYgKGVmZk0gPT09IDApIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIHNJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3JjQ29sID0gc3JjMzJbc0lkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3Qgc3JjQWxwaGEgPSBzcmNDb2wgPj4+IDI0XG5cbiAgICAgIC8vIEVhcmx5IGV4aXQgaWYgc291cmNlIGlzIGZ1bGx5IHRyYW5zcGFyZW50ICh1bmxlc3Mgb3ZlcndyaXRpbmcpXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB3ZWlnaHQgdXNpbmcgbGluZWFyIGxvZ2ljIChFYXNpZXIgZm9yIEpJVCB0aGFuIG5lc3RlZCB0ZXJuYXJpZXMpXG4gICAgICBsZXQgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcbiAgICAgIGlmIChpc09wYXF1ZSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZNXG4gICAgICB9IGVsc2UgaWYgKGVmZk0gIT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSAoZWZmTSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICB9XG5cbiAgICAgIC8vIFplcm8td2VpZ2h0IHNhZmV0eSBjaGVja1xuICAgICAgaWYgKHdlaWdodCA9PT0gMCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgZmluYWxDb2wgPSBzcmNDb2xcbiAgICAgIGlmICh3ZWlnaHQgPCAyNTUpIHtcbiAgICAgICAgY29uc3QgYSA9IChzcmNBbHBoYSAqIHdlaWdodCArIDEyOCkgPj4gOFxuICAgICAgICAvLyBGaW5hbCBjaGVjazogd2VpZ2h0IG1pZ2h0IGhhdmUgcmVzdWx0ZWQgaW4gYSB0cmFuc3BhcmVudCBwaXhlbFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBtSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgc0lkeCArPSBzU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataBinaryMask(dst: IPixelData, src: IPixelData, binaryMask: BinaryMask, opts: PixelBlendMaskOptions) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n\n // 1. Source Clipping\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n\n // 2. Destination Clipping\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // 3. Coordinate Displacement for Mask Sync\n // dx/dy represents how far the clipped start is from the requested start.\n // This is the stable way to align the mask across all clipping permutations.\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const src32 = src.data32;\n const dw = dst.width;\n const sw = src.width;\n const mPitch = binaryMask.w;\n const maskData = binaryMask.data;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const skipVal = invertMask ? 1 : 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite || false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n // Binary Mask Check (Earliest exit)\n if (maskData[mIdx] === skipVal) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n\n // Source Alpha Check\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (!isOpaque) {\n // Rounding-corrected global alpha application\n const a = srcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBJUGl4ZWxEYXRhLCBQaXhlbEJsZW5kTWFza09wdGlvbnMgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayhcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBzcmM6IElQaXhlbERhdGEsXG4gIGJpbmFyeU1hc2s6IEJpbmFyeU1hc2ssXG4gIG9wdHM6IFBpeGVsQmxlbmRNYXNrT3B0aW9ucyxcbikge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgc3g6IHNvdXJjZVggPSAwLFxuICAgIHN5OiBzb3VyY2VZID0gMCxcbiAgICB3OiB3aWR0aCA9IHNyYy53aWR0aCxcbiAgICBoOiBoZWlnaHQgPSBzcmMuaGVpZ2h0LFxuICAgIGFscGhhOiBnbG9iYWxBbHBoYSA9IDI1NSxcbiAgICBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm5cblxuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCBzeCA9IHNvdXJjZVhcbiAgbGV0IHN5ID0gc291cmNlWVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgLy8gMS4gU291cmNlIENsaXBwaW5nXG4gIGlmIChzeCA8IDApIHtcbiAgICB4IC09IHN4XG4gICAgdyArPSBzeFxuICAgIHN4ID0gMFxuICB9XG4gIGlmIChzeSA8IDApIHtcbiAgICB5IC09IHN5XG4gICAgaCArPSBzeVxuICAgIHN5ID0gMFxuICB9XG4gIHcgPSBNYXRoLm1pbih3LCBzcmMud2lkdGggLSBzeClcbiAgaCA9IE1hdGgubWluKGgsIHNyYy5oZWlnaHQgLSBzeSlcblxuICAvLyAyLiBEZXN0aW5hdGlvbiBDbGlwcGluZ1xuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIDMuIENvb3JkaW5hdGUgRGlzcGxhY2VtZW50IGZvciBNYXNrIFN5bmNcbiAgLy8gZHgvZHkgcmVwcmVzZW50cyBob3cgZmFyIHRoZSBjbGlwcGVkIHN0YXJ0IGlzIGZyb20gdGhlIHJlcXVlc3RlZCBzdGFydC5cbiAgLy8gVGhpcyBpcyB0aGUgc3RhYmxlIHdheSB0byBhbGlnbiB0aGUgbWFzayBhY3Jvc3MgYWxsIGNsaXBwaW5nIHBlcm11dGF0aW9ucy5cbiAgY29uc3QgZHggPSAoeCAtIHRhcmdldFgpIHwgMFxuICBjb25zdCBkeSA9ICh5IC0gdGFyZ2V0WSkgfCAwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IHNyYzMyID0gc3JjLmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBzdyA9IHNyYy53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBiaW5hcnlNYXNrLndcbiAgY29uc3QgbWFza0RhdGEgPSBiaW5hcnlNYXNrLmRhdGFcblxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IHNJZHggPSAoc3kgKiBzdyArIHN4KSB8IDBcbiAgbGV0IG1JZHggPSAoKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpKSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNTdHJpZGUgPSAoc3cgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcblxuICBjb25zdCBza2lwVmFsID0gaW52ZXJ0TWFzayA/IDEgOiAwXG4gIGNvbnN0IGlzT3BhcXVlID0gZ2xvYmFsQWxwaGEgPT09IDI1NVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IGJsZW5kRm4uaXNPdmVyd3JpdGUgfHwgZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICAvLyBCaW5hcnkgTWFzayBDaGVjayAoRWFybGllc3QgZXhpdClcbiAgICAgIGlmIChtYXNrRGF0YVttSWR4XSA9PT0gc2tpcFZhbCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IHNyY0NvbCA+Pj4gMjRcblxuICAgICAgLy8gU291cmNlIEFscGhhIENoZWNrXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbENvbCA9IHNyY0NvbFxuICAgICAgaWYgKCFpc09wYXF1ZSkge1xuICAgICAgICAvLyBSb3VuZGluZy1jb3JyZWN0ZWQgZ2xvYmFsIGFscGhhIGFwcGxpY2F0aW9uXG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBtSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgc0lkeCArPSBzU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { fillPixelData } from './fillPixelData';\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelData.\n */\nexport function clearPixelData(dst: IPixelData, rect?: Partial<BinaryMaskRect>): void {\n fillPixelData(dst, 0 as Color32, rect);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrUmVjdCwgQ29sb3IzMiwgSVBpeGVsRGF0YSB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGEgfSBmcm9tICcuL2ZpbGxQaXhlbERhdGEnXG5cbi8qKlxuICogQ2xlYXJzIGEgcmVnaW9uIG9mIHRoZSBQaXhlbERhdGEgdG8gdHJhbnNwYXJlbnQgKDB4MDAwMDAwMDApLlxuICogSW50ZXJuYWxseSB1c2VzIHRoZSBvcHRpbWl6ZWQgZmlsbFBpeGVsRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIHJlY3Q/OiBQYXJ0aWFsPEJpbmFyeU1hc2tSZWN0Pixcbik6IHZvaWQge1xuICBmaWxsUGl4ZWxEYXRhKGRzdCwgMCBhcyBDb2xvcjMyLCByZWN0KVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: IPixelData, rect: Rect): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData, x: number, y: number, w: number, h: number): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint32Array {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const srcW = source.width;\n const srcH = source.height;\n const srcData = source.data32;\n\n // Safety check for empty or invalid dimensions\n if (w <= 0 || h <= 0) {\n return new Uint32Array(0);\n }\n const dstData = new Uint32Array(w * h);\n\n // We map from Source (srcW, srcH) at (x,y)\n // To Dest (w, h) at (0,0)\n // Note: resolveBlitClipping usually takes (dstX, dstY, srcX, srcY...)\n // Here we are \"blitting\" FROM x,y TO 0,0.\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return dstData;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX;\n const dstStart = (dstY + row) * w + dstX;\n\n // Perform the high-speed 32-bit bulk copy\n const chunk = srcData.subarray(srcStart, srcStart + copyW);\n dstData.set(chunk, dstStart);\n }\n return dstData;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHBpeGVscyBmcm9tIFBpeGVsRGF0YS5cbiAqIFJldHVybnMgYSBuZXcgVWludDMyQXJyYXkgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHBpeGVscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlOiBJUGl4ZWxEYXRhLCByZWN0OiBSZWN0KTogVWludDMyQXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZTogSVBpeGVsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogVWludDMyQXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKFxuICBzb3VyY2U6IElQaXhlbERhdGEsXG4gIF94OiBSZWN0IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogVWludDMyQXJyYXkge1xuICBjb25zdCB7IHgsIHksIHcsIGggfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCdcbiAgICA/IF94XG4gICAgOiB7IHg6IF94LCB5OiBfeSEsIHc6IF93ISwgaDogX2ghIH1cblxuICBjb25zdCBzcmNXID0gc291cmNlLndpZHRoXG4gIGNvbnN0IHNyY0ggPSBzb3VyY2UuaGVpZ2h0XG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YTMyXG5cbiAgLy8gU2FmZXR5IGNoZWNrIGZvciBlbXB0eSBvciBpbnZhbGlkIGRpbWVuc2lvbnNcbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KDApXG4gIH1cblxuICBjb25zdCBkc3REYXRhID0gbmV3IFVpbnQzMkFycmF5KHcgKiBoKVxuXG4gIC8vIFdlIG1hcCBmcm9tIFNvdXJjZSAoc3JjVywgc3JjSCkgYXQgKHgseSlcbiAgLy8gVG8gRGVzdCAodywgaCkgYXQgKDAsMClcbiAgLy8gTm90ZTogcmVzb2x2ZUJsaXRDbGlwcGluZyB1c3VhbGx5IHRha2VzIChkc3RYLCBkc3RZLCBzcmNYLCBzcmNZLi4uKVxuICAvLyBIZXJlIHdlIGFyZSBcImJsaXR0aW5nXCIgRlJPTSB4LHkgVE8gMCwwLlxuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgICAwLFxuICAgIDAsXG4gICAgeCxcbiAgICB5LFxuICAgIHcsXG4gICAgaCxcbiAgICB3LFxuICAgIGgsXG4gICAgc3JjVyxcbiAgICBzcmNILFxuICAgIFNDUkFUQ0hfQkxJVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuIGRzdERhdGFcblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1hcbiAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICsgcm93KSAqIHcgKyBkc3RYXG5cbiAgICAvLyBQZXJmb3JtIHRoZSBoaWdoLXNwZWVkIDMyLWJpdCBidWxrIGNvcHlcbiAgICBjb25zdCBjaHVuayA9IHNyY0RhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgY29weVcpXG4gICAgZHN0RGF0YS5zZXQoY2h1bmssIGRzdFN0YXJ0KVxuICB9XG5cbiAgcmV0dXJuIGRzdERhdGFcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { extractPixelDataBuffer } from './extractPixelDataBuffer';\nimport { PixelData } from './PixelData';\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: IPixelData, rect: Rect): PixelData;\nexport function extractPixelData(source: IPixelData, x: number, y: number, w: number, h: number): PixelData;\nexport function extractPixelData(source: IPixelData, _x: Rect | number, _y?: number, _w?: number, _h?: number): PixelData {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const result = new PixelData(new ImageData(w, h));\n const buffer = extractPixelDataBuffer(source, x, y, w, h);\n result.data32.set(buffer);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlciB9IGZyb20gJy4vZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcidcbmltcG9ydCB7IFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxEYXRhJ1xuXG4vKipcbiAqIEhpZ2gtbGV2ZWwgZXh0cmFjdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgUGl4ZWxEYXRhIGluc3RhbmNlLlxuICogTGV2ZXJhZ2VzIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIgZm9yIG9wdGltaXplZCAzMi1iaXQgbWVtb3J5IG1vdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShzb3VyY2U6IElQaXhlbERhdGEsIHJlY3Q6IFJlY3QpOiBQaXhlbERhdGFcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhKHNvdXJjZTogSVBpeGVsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogUGl4ZWxEYXRhXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShcbiAgc291cmNlOiBJUGl4ZWxEYXRhLFxuICBfeDogUmVjdCB8IG51bWJlcixcbiAgX3k/OiBudW1iZXIsXG4gIF93PzogbnVtYmVyLFxuICBfaD86IG51bWJlcixcbik6IFBpeGVsRGF0YSB7XG4gIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gdHlwZW9mIF94ID09PSAnb2JqZWN0J1xuICAgID8gX3hcbiAgICA6IHsgeDogX3gsIHk6IF95ISwgdzogX3chLCBoOiBfaCEgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBQaXhlbERhdGEobmV3IEltYWdlRGF0YSh3LCBoKSlcblxuICBjb25zdCBidWZmZXIgPSBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZSwgeCwgeSwgdywgaClcbiAgcmVzdWx0LmRhdGEzMi5zZXQoYnVmZmVyKVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { IPixelData } from '../_types';\nexport class PixelBuffer32 implements IPixelData {\n readonly data32: Uint32Array;\n constructor(readonly width: number, readonly height: number, data32?: Uint32Array) {\n this.data32 = data32 ?? new Uint32Array(width * height);\n }\n set(width: number, height: number, data32?: Uint32Array): void {\n ;\n (this as any).data32 = data32 ?? new Uint32Array(width * height);\n (this as any).width = width;\n (this as any).height = height;\n }\n copy(): PixelBuffer32 {\n const newData32 = new Uint32Array(this.data32);\n return new PixelBuffer32(this.width, this.height, newData32);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxCdWZmZXIzMiBpbXBsZW1lbnRzIElQaXhlbERhdGEge1xuICByZWFkb25seSBkYXRhMzI6IFVpbnQzMkFycmF5XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgd2lkdGg6IG51bWJlcixcbiAgICByZWFkb25seSBoZWlnaHQ6IG51bWJlcixcbiAgICBkYXRhMzI/OiBVaW50MzJBcnJheSxcbiAgKSB7XG4gICAgdGhpcy5kYXRhMzIgPSBkYXRhMzIgPz8gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KVxuICB9XG5cbiAgc2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkYXRhMzI/OiBVaW50MzJBcnJheSk6IHZvaWQge1xuICAgIDsodGhpcyBhcyBhbnkpLmRhdGEzMiA9IGRhdGEzMiA/PyBuZXcgVWludDMyQXJyYXkod2lkdGggKiBoZWlnaHQpXG4gICAgOyh0aGlzIGFzIGFueSkud2lkdGggPSB3aWR0aFxuICAgIDsodGhpcyBhcyBhbnkpLmhlaWdodCA9IGhlaWdodFxuICB9XG5cbiAgY29weSgpOiBQaXhlbEJ1ZmZlcjMyIHtcbiAgICBjb25zdCBuZXdEYXRhMzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5kYXRhMzIpXG4gICAgcmV0dXJuIG5ldyBQaXhlbEJ1ZmZlcjMyKFxuICAgICAgdGhpcy53aWR0aCxcbiAgICAgIHRoaXMuaGVpZ2h0LFxuICAgICAgbmV3RGF0YTMyLFxuICAgIClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeAlphaMask } from '../Mask/AlphaMask';\n\n/**\n * Extracts the alpha channel from PixelData into a single-channel mask.\n * Returns a Uint8Array branded as AlphaMask.\n */\nexport function pixelDataToAlphaMask(pixelData: IPixelData): AlphaMask {\n const {\n data32,\n width,\n height\n } = pixelData;\n const len = data32.length;\n const mask = makeAlphaMask(width, height);\n const maskData = mask.data;\n for (let i = 0; i < len; i++) {\n const val = data32[i];\n\n // Extract the Alpha byte (top 8 bits in ABGR / Little-Endian)\n // Shift right by 24 moves the 4th byte to the 1st position\n maskData[i] = val >>> 24 & 0xff;\n }\n return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQWxwaGFNYXNrIH0gZnJvbSAnLi4vTWFzay9BbHBoYU1hc2snXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSBQaXhlbERhdGEgaW50byBhIHNpbmdsZS1jaGFubmVsIG1hc2suXG4gKiBSZXR1cm5zIGEgVWludDhBcnJheSBicmFuZGVkIGFzIEFscGhhTWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpeGVsRGF0YVRvQWxwaGFNYXNrKFxuICBwaXhlbERhdGE6IElQaXhlbERhdGEsXG4pOiBBbHBoYU1hc2sge1xuICBjb25zdCB7XG4gICAgZGF0YTMyLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfSA9IHBpeGVsRGF0YVxuICBjb25zdCBsZW4gPSBkYXRhMzIubGVuZ3RoXG4gIGNvbnN0IG1hc2sgPSBtYWtlQWxwaGFNYXNrKHdpZHRoLCBoZWlnaHQpXG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHZhbCA9IGRhdGEzMltpXVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgQWxwaGEgYnl0ZSAodG9wIDggYml0cyBpbiBBQkdSIC8gTGl0dGxlLUVuZGlhbilcbiAgICAvLyBTaGlmdCByaWdodCBieSAyNCBtb3ZlcyB0aGUgNHRoIGJ5dGUgdG8gdGhlIDFzdCBwb3NpdGlvblxuICAgIG1hc2tEYXRhW2ldID0gKHZhbCA+Pj4gMjQpICYgMHhmZlxuICB9XG5cbiAgcmV0dXJuIG1hc2tcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function reflectPixelDataHorizontal(pixelData: IPixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n const halfWidth = Math.floor(width / 2);\n for (let y = 0; y < height; y++) {\n const rowOffset = y * width;\n for (let x = 0; x < halfWidth; x++) {\n const leftIdx = rowOffset + x;\n const rightIdx = rowOffset + (width - 1 - x);\n const temp = data[leftIdx];\n data[leftIdx] = data[rightIdx];\n data[rightIdx] = temp;\n }\n }\n}\nexport function reflectPixelDataVertical(pixelData: IPixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n const halfHeight = Math.floor(height / 2);\n for (let y = 0; y < halfHeight; y++) {\n const topRowOffset = y * width;\n const bottomRowOffset = (height - 1 - y) * width;\n for (let x = 0; x < width; x++) {\n const topIdx = topRowOffset + x;\n const bottomIdx = bottomRowOffset + x;\n const temp = data[topIdx];\n data[topIdx] = data[bottomIdx];\n data[bottomIdx] = temp;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdFBpeGVsRGF0YUhvcml6b250YWwocGl4ZWxEYXRhOiBJUGl4ZWxEYXRhKTogdm9pZCB7XG4gIGNvbnN0IHdpZHRoID0gcGl4ZWxEYXRhLndpZHRoXG4gIGNvbnN0IGhlaWdodCA9IHBpeGVsRGF0YS5oZWlnaHRcbiAgY29uc3QgZGF0YSA9IHBpeGVsRGF0YS5kYXRhMzJcbiAgY29uc3QgaGFsZldpZHRoID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IHkgKiB3aWR0aFxuXG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBoYWxmV2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgbGVmdElkeCA9IHJvd09mZnNldCArIHhcbiAgICAgIGNvbnN0IHJpZ2h0SWR4ID0gcm93T2Zmc2V0ICsgKHdpZHRoIC0gMSAtIHgpXG4gICAgICBjb25zdCB0ZW1wID0gZGF0YVtsZWZ0SWR4XVxuXG4gICAgICBkYXRhW2xlZnRJZHhdID0gZGF0YVtyaWdodElkeF1cbiAgICAgIGRhdGFbcmlnaHRJZHhdID0gdGVtcFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdFBpeGVsRGF0YVZlcnRpY2FsKHBpeGVsRGF0YTogSVBpeGVsRGF0YSk6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aFxuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTMyXG4gIGNvbnN0IGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIDIpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoYWxmSGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCB0b3BSb3dPZmZzZXQgPSB5ICogd2lkdGhcbiAgICBjb25zdCBib3R0b21Sb3dPZmZzZXQgPSAoaGVpZ2h0IC0gMSAtIHkpICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgdG9wSWR4ID0gdG9wUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgYm90dG9tSWR4ID0gYm90dG9tUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbdG9wSWR4XVxuXG4gICAgICBkYXRhW3RvcElkeF0gPSBkYXRhW2JvdHRvbUlkeF1cbiAgICAgIGRhdGFbYm90dG9tSWR4XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { PixelData } from '../index';\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(pixelData: IPixelData, factor: number): PixelData {\n const {\n data,\n width,\n height\n } = resample32(pixelData.data32, pixelData.width, pixelData.height, factor);\n return new PixelData(new ImageData(new Uint8ClampedArray(data.buffer) as ImageDataArray, width, height));\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCBQaXhlbERhdGEgfSBmcm9tICcuLi9pbmRleCdcbmltcG9ydCB7IHJlc2FtcGxlMzIgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNhbXBsZTMyJ1xuXG4vKipcbiAqIFJlc2FtcGxlcyBQaXhlbERhdGEgYnkgYSBzcGVjaWZpYyBmYWN0b3IgdXNpbmcgbmVhcmVzdCBuZWlnaGJvci5cbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlUGl4ZWxEYXRhKFxuICBwaXhlbERhdGE6IElQaXhlbERhdGEsXG4gIGZhY3RvcjogbnVtYmVyLFxuKTogUGl4ZWxEYXRhIHtcbiAgY29uc3QgeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0gPSByZXNhbXBsZTMyKHBpeGVsRGF0YS5kYXRhMzIsIHBpeGVsRGF0YS53aWR0aCwgcGl4ZWxEYXRhLmhlaWdodCwgZmFjdG9yKVxuXG4gIHJldHVybiBuZXcgUGl4ZWxEYXRhKG5ldyBJbWFnZURhdGEoXG4gICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEuYnVmZmVyKSBhcyBJbWFnZURhdGFBcnJheSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICkpXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n if (width === height) {\n rotateSquareInPlace(pixelData);\n return;\n }\n const newWidth = height;\n const newHeight = width;\n const newData32 = new Uint32Array(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const oldIdx = y * width + x;\n const newX = height - 1 - y;\n const newY = x;\n const newIdx = newY * newWidth + newX;\n newData32[newIdx] = data[oldIdx];\n }\n }\n\n // To update a rectangular PixelData, we must create a new ImageData\n // since width/height are read-only properties of the native object.\n const newImageData = new ImageData(new Uint8ClampedArray(newData32.buffer), newWidth, newHeight);\n pixelData.set(newImageData);\n}\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.width;\n const data = pixelData.data32;\n for (let i = 0; i < n / 2; i++) {\n for (let j = i; j < n - i - 1; j++) {\n const top = i * n + j;\n const right = j * n + (n - 1 - i);\n const bottom = (n - 1 - i) * n + (n - 1 - j);\n const left = (n - 1 - j) * n + i;\n const temp = data[top];\n data[top] = data[left];\n data[left] = data[bottom];\n data[bottom] = data[right];\n data[right] = temp;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxEYXRhIH0gZnJvbSAnLi9QaXhlbERhdGEnXG5cbi8qKlxuICogUm90YXRlcyBwaXhlbCBkYXRhIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLlxuICogSWYgdGhlIGltYWdlIGlzIHNxdWFyZSwgaXQgcGVyZm9ybXMgdGhlIHJvdGF0aW9uIGluLXBsYWNlLlxuICogSWYgcmVjdGFuZ3VsYXIsIGl0IHJlcGxhY2VzIHRoZSBpbnRlcm5hbCBJbWFnZURhdGEgd2l0aCBhIG5ldyByb3RhdGVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVQaXhlbERhdGEocGl4ZWxEYXRhOiBQaXhlbERhdGEpOiB2b2lkIHtcbiAgY29uc3Qgd2lkdGggPSBwaXhlbERhdGEud2lkdGhcbiAgY29uc3QgaGVpZ2h0ID0gcGl4ZWxEYXRhLmhlaWdodFxuICBjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGEzMlxuXG4gIGlmICh3aWR0aCA9PT0gaGVpZ2h0KSB7XG4gICAgcm90YXRlU3F1YXJlSW5QbGFjZShwaXhlbERhdGEpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBuZXdXaWR0aCA9IGhlaWdodFxuICBjb25zdCBuZXdIZWlnaHQgPSB3aWR0aFxuICBjb25zdCBuZXdEYXRhMzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5sZW5ndGgpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3Qgb2xkSWR4ID0geSAqIHdpZHRoICsgeFxuICAgICAgY29uc3QgbmV3WCA9IGhlaWdodCAtIDEgLSB5XG4gICAgICBjb25zdCBuZXdZID0geFxuICAgICAgY29uc3QgbmV3SWR4ID0gbmV3WSAqIG5ld1dpZHRoICsgbmV3WFxuXG4gICAgICBuZXdEYXRhMzJbbmV3SWR4XSA9IGRhdGFbb2xkSWR4XVxuICAgIH1cbiAgfVxuXG4gIC8vIFRvIHVwZGF0ZSBhIHJlY3Rhbmd1bGFyIFBpeGVsRGF0YSwgd2UgbXVzdCBjcmVhdGUgYSBuZXcgSW1hZ2VEYXRhXG4gIC8vIHNpbmNlIHdpZHRoL2hlaWdodCBhcmUgcmVhZC1vbmx5IHByb3BlcnRpZXMgb2YgdGhlIG5hdGl2ZSBvYmplY3QuXG4gIGNvbnN0IG5ld0ltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoXG4gICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG5ld0RhdGEzMi5idWZmZXIpLFxuICAgIG5ld1dpZHRoLFxuICAgIG5ld0hlaWdodCxcbiAgKVxuXG4gIHBpeGVsRGF0YS5zZXQobmV3SW1hZ2VEYXRhKVxufVxuXG5mdW5jdGlvbiByb3RhdGVTcXVhcmVJblBsYWNlKHBpeGVsRGF0YTogUGl4ZWxEYXRhKTogdm9pZCB7XG4gIGNvbnN0IG4gPSBwaXhlbERhdGEud2lkdGhcbiAgY29uc3QgZGF0YSA9IHBpeGVsRGF0YS5kYXRhMzJcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLyAyOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IG4gLSBpIC0gMTsgaisrKSB7XG4gICAgICBjb25zdCB0b3AgPSBpICogbiArIGpcbiAgICAgIGNvbnN0IHJpZ2h0ID0gaiAqIG4gKyAobiAtIDEgLSBpKVxuICAgICAgY29uc3QgYm90dG9tID0gKG4gLSAxIC0gaSkgKiBuICsgKG4gLSAxIC0gailcbiAgICAgIGNvbnN0IGxlZnQgPSAobiAtIDEgLSBqKSAqIG4gKyBpXG5cbiAgICAgIGNvbnN0IHRlbXAgPSBkYXRhW3RvcF1cbiAgICAgIGRhdGFbdG9wXSA9IGRhdGFbbGVmdF1cbiAgICAgIGRhdGFbbGVmdF0gPSBkYXRhW2JvdHRvbV1cbiAgICAgIGRhdGFbYm90dG9tXSA9IGRhdGFbcmlnaHRdXG4gICAgICBkYXRhW3JpZ2h0XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of a {@link IPixelData} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target buffer.\n */\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, rect: Rect): void;\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, x: number, y: number, w: number, h: number): void;\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const dstW = target.width;\n const dstH = target.height;\n const dstData = target.data32;\n\n // treat the source buffer as a Source Image starting at 0,0 with size w,h\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * w + srcX;\n dstData.set(data.subarray(srcStart, srcStart + copyW), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfQkxJVCA9IG1ha2VDbGlwcGVkQmxpdCgpXG5cbi8qKlxuICogQ29waWVzIGEgcGl4ZWwgYnVmZmVyIGludG8gYSBzcGVjaWZpYyByZWdpb24gb2YgYSB7QGxpbmsgSVBpeGVsRGF0YX0gb2JqZWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBkaXJlY3QgbWVtb3J5IGNvcHkgZnJvbSBhIHtAbGluayBVaW50MzJBcnJheX1cbiAqIGludG8gdGhlIHRhcmdldCBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgcmVjdDogUmVjdCxcbik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHc6IG51bWJlcixcbiAgaDogbnVtYmVyLFxuKTogdm9pZFxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGl4ZWxEYXRhQnVmZmVyKFxuICB0YXJnZXQ6IElQaXhlbERhdGEsXG4gIGRhdGE6IFVpbnQzMkFycmF5LFxuICBfeDogUmVjdCB8IG51bWJlcixcbiAgX3k/OiBudW1iZXIsXG4gIF93PzogbnVtYmVyLFxuICBfaD86IG51bWJlcixcbik6IHZvaWQge1xuICBjb25zdCB7IHgsIHksIHcsIGggfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCdcbiAgICA/IF94XG4gICAgOiB7XG4gICAgICB4OiBfeCxcbiAgICAgIHk6IF95ISxcbiAgICAgIHc6IF93ISxcbiAgICAgIGg6IF9oISxcbiAgICB9XG5cbiAgY29uc3QgZHN0VyA9IHRhcmdldC53aWR0aFxuICBjb25zdCBkc3RIID0gdGFyZ2V0LmhlaWdodFxuICBjb25zdCBkc3REYXRhID0gdGFyZ2V0LmRhdGEzMlxuXG4gIC8vIHRyZWF0IHRoZSBzb3VyY2UgYnVmZmVyIGFzIGEgU291cmNlIEltYWdlIHN0YXJ0aW5nIGF0IDAsMCB3aXRoIHNpemUgdyxoXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsXG4gICAgeSxcbiAgICAwLFxuICAgIDAsXG4gICAgdyxcbiAgICBoLFxuICAgIGRzdFcsXG4gICAgZHN0SCxcbiAgICB3LFxuICAgIGgsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFhcbiAgICBjb25zdCBzcmNTdGFydCA9IChzcmNZICsgcm93KSAqIHcgKyBzcmNYXG5cbiAgICBkc3REYXRhLnNldChkYXRhLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIGNvcHlXKSwgZHN0U3RhcnQpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ=="],"mappings":"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","names":["MaskType","get","applyAlphaMaskToPixelData","defaults","applyBinaryMaskToPixelData","defaults","applyCircleBrushToPixelData","getCircleBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataAlphaMask","getCircleBrushOrPencilBounds","getCircleBrushOrPencilStrokeBounds","defaults","forEachLinePoint","blendColorPixelDataBinaryMask","getCircleBrushOrPencilStrokeBounds","getCircleBrushOrPencilBounds","defaults","applyRectBrushToPixelData","getRectBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataAlphaMask","getRectBrushOrPencilBounds","getRectBrushOrPencilStrokeBounds","defaults","applyRectBrushToPixelData","getRectBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataBinaryMask","getRectBrushOrPencilBounds","getRectBrushOrPencilStrokeBounds","defaults","blendColorPixelData","defaults","blendPixelData","defaults","fillPixelData","defaults","fillPixelData","SCRATCH_RECT","defaults","invertPixelData","defaults","applyCircleBrushToPixelData","getCircleBrushOrPencilBounds","SCRATCH_RECT","defaults","fillPixelDataBinaryMask","SCRATCH_BLIT","SCRATCH_BLIT","r","g","b","a","SCRATCH_BLIT","SCRATCH_BLIT"]}
|