pixel-data-js 0.25.0 → 0.25.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 +221 -165
- package/dist/index.dev.cjs.map +1 -1
- package/dist/index.dev.js +215 -161
- package/dist/index.dev.js.map +1 -1
- package/dist/index.prod.cjs +221 -165
- package/dist/index.prod.cjs.map +1 -1
- package/dist/index.prod.d.ts +74 -43
- package/dist/index.prod.js +216 -162
- package/dist/index.prod.js.map +1 -1
- package/package.json +1 -1
- package/src/History/PixelMutator/mutatorBlendPaintMask.ts +60 -0
- package/src/index.ts +2 -0
package/dist/index.dev.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/_types.ts","../src/color.ts","../src/Internal/resolveClipping.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMaskBuffer.ts","../src/Rect/trimMaskRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/Algorithm/forEachLinePoint.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/ReusableCanvas.ts","../src/Canvas/CanvasFrameRenderer.ts","../src/Canvas/PixelCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/PixelPatchTiles.ts","../src/History/HistoryAction.ts","../src/History/HistoryManager.ts","../src/History/PixelAccumulator.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/PixelData/blendPixel.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/blendPixelDataAlphaMask.ts","../src/History/PixelMutator/mutatorBlendPixelDataAlphaMask.ts","../src/PixelData/blendPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorBlendPixelDataBinaryMask.ts","../src/PixelData/fillPixelDataFast.ts","../src/History/PixelMutator/mutatorClear.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorFill.ts","../src/PixelData/fillPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorFillBinaryMask.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/ImageData/resizeImageData.ts","../src/Internal/helpers.ts","../src/Rect/trimRectBounds.ts","../src/Paint/PaintBuffer.ts","../src/PixelTile/PixelTile.ts","../src/PixelTile/PixelTilePool.ts","../src/History/PixelWriter.ts","../src/PixelData/applyAlphaMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyAlphaMask.ts","../src/PixelData/applyBinaryMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyBinaryMask.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/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/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/Rect/getRectsBounds.ts","../src/MaskRect/merge2BinaryMaskRects.ts","../src/MaskRect/mergeBinaryMaskRects.ts","../src/MaskRect/subtractBinaryMaskRects.ts","../src/PixelData/PixelData.ts","../src/PixelData/blendColorPixelDataAlphaMask.ts","../src/PixelData/blendColorPixelDataBinaryMask.ts","../src/PixelData/blendPixelDataPaintBuffer.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","../src/PixelData/writePaintBufferToPixelData.ts","../src/Paint/makeCirclePaintAlphaMask.ts","../src/Paint/makeCirclePaintBinaryMask.ts","../src/Paint/makePaintMask.ts","../src/Paint/makeRectFalloffPaintAlphaMask.ts","../src/Paint/PaintBufferCanvasRenderer.ts"],"sourcesContent":["// @sort-all\nexport * from './_types';\nexport * from './color';\nexport * from './Algorithm/floodFillSelection';\nexport * from './Algorithm/forEachLinePoint';\nexport * from './BlendModes/blend-modes-fast';\nexport * from './BlendModes/blend-modes-perfect';\nexport * from './BlendModes/blend-modes';\nexport * from './BlendModes/BlendModeRegistry';\nexport * from './BlendModes/toBlendModeIndexAndName';\nexport * from './Canvas/_constants';\nexport * from './Canvas/CanvasFrameRenderer';\nexport * from './Canvas/PixelCanvas';\nexport * from './Canvas/ReusableCanvas';\nexport * from './Clipboard/getImageDataFromClipboard';\nexport * from './Clipboard/writeImageDataToClipboard';\nexport * from './Clipboard/writeImgBlobToClipboard';\nexport * from './History/HistoryAction';\nexport * from './History/HistoryManager';\nexport * from './History/PixelAccumulator';\nexport * from './History/PixelEngineConfig';\nexport * from './History/PixelMutator';\nexport * from './History/PixelPatchTiles';\nexport * from './History/PixelWriter';\nexport * from './History/PixelMutator/mutatorApplyAlphaMask';\nexport * from './History/PixelMutator/mutatorApplyBinaryMask';\nexport * from './History/PixelMutator/mutatorBlendColor';\nexport * from './History/PixelMutator/mutatorBlendPixel';\nexport * from './History/PixelMutator/mutatorBlendPixelData';\nexport * from './History/PixelMutator/mutatorBlendPixelDataAlphaMask';\nexport * from './History/PixelMutator/mutatorBlendPixelDataBinaryMask';\nexport * from './History/PixelMutator/mutatorClear';\nexport * from './History/PixelMutator/mutatorFill';\nexport * from './History/PixelMutator/mutatorFillBinaryMask';\nexport * from './History/PixelMutator/mutatorInvert';\nexport * from './ImageData/copyImageData';\nexport * from './ImageData/extractImageDataBuffer';\nexport * from './ImageData/ImageDataLike';\nexport * from './ImageData/imageDataToAlphaMaskBuffer';\nexport * from './ImageData/imageDataToDataUrl';\nexport * from './ImageData/imageDataToImgBlob';\nexport * from './ImageData/imageDataToUInt32Array';\nexport * from './ImageData/imgBlobToImageData';\nexport * from './ImageData/invertImageData';\nexport * from './ImageData/resampleImageData';\nexport * from './ImageData/resizeImageData';\nexport * from './ImageData/ReusableImageData';\nexport * from './ImageData/serialization';\nexport * from './ImageData/uInt32ArrayToImageData';\nexport * from './ImageData/writeImageData';\nexport * from './ImageData/writeImageDataBuffer';\nexport * from './IndexedImage/getIndexedImageColorCounts';\nexport * from './IndexedImage/IndexedImage';\nexport * from './IndexedImage/indexedImageToAverageColor';\nexport * from './IndexedImage/indexedImageToImageData';\nexport * from './IndexedImage/resampleIndexedImage';\nexport * from './Input/fileInputChangeToImageData';\nexport * from './Input/fileToImageData';\nexport * from './Input/getSupportedRasterFormats';\nexport * from './Mask/AlphaMask';\nexport * from './Mask/BinaryMask';\nexport * from './Mask/applyBinaryMaskToAlphaMask';\nexport * from './Mask/copyMask';\nexport * from './Mask/extractMask';\nexport * from './Mask/extractMaskBuffer';\nexport * from './Mask/invertMask';\nexport * from './Mask/mergeAlphaMasks';\nexport * from './Mask/mergeBinaryMasks';\nexport * from './Mask/setMaskData';\nexport * from './MaskRect/merge2BinaryMaskRects';\nexport * from './MaskRect/mergeBinaryMaskRects';\nexport * from './MaskRect/subtractBinaryMaskRects';\nexport * from './PixelData/applyAlphaMaskToPixelData';\nexport * from './PixelData/applyBinaryMaskToPixelData';\nexport * from './PixelData/PixelData';\nexport * from './PixelData/blendColorPixelData';\nexport * from './PixelData/blendColorPixelDataAlphaMask';\nexport * from './PixelData/blendColorPixelDataBinaryMask';\nexport * from './PixelData/blendPixelData';\nexport * from './PixelData/blendPixelDataAlphaMask';\nexport * from './PixelData/blendPixelDataBinaryMask';\nexport * from './PixelData/blendPixel';\nexport * from './PixelData/blendPixelDataPaintBuffer';\nexport * from './PixelData/clearPixelData';\nexport * from './PixelData/extractPixelData';\nexport * from './PixelData/extractPixelDataBuffer';\nexport * from './PixelData/fillPixelData';\nexport * from './PixelData/fillPixelDataBinaryMask';\nexport * from './PixelData/fillPixelDataFast';\nexport * from './PixelData/invertPixelData';\nexport * from './PixelData/PixelBuffer32';\nexport * from './PixelData/pixelDataToAlphaMask';\nexport * from './PixelData/reflectPixelData';\nexport * from './PixelData/resamplePixelData';\nexport * from './PixelData/rotatePixelData';\nexport * from './PixelData/writePaintBufferToPixelData';\nexport * from './PixelData/writePixelDataBuffer';\nexport * from './Rect/getRectsBounds';\nexport * from './Rect/trimMaskRectBounds';\nexport * from './Rect/trimRectBounds';\nexport * from './Paint/makeCirclePaintAlphaMask';\nexport * from './Paint/makeCirclePaintBinaryMask';\nexport * from './Paint/makePaintMask';\nexport * from './Paint/makeRectFalloffPaintAlphaMask';\nexport * from './Paint/PaintBuffer';\nexport * from './Paint/PaintBufferCanvasRenderer';\nexport * from './PixelTile/PixelTile';\nexport * from './PixelTile/PixelTilePool';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHNvcnQtYWxsXG5leHBvcnQgKiBmcm9tICcuL190eXBlcydcbmV4cG9ydCAqIGZyb20gJy4vY29sb3InXG5cbmV4cG9ydCAqIGZyb20gJy4vQWxnb3JpdGhtL2Zsb29kRmlsbFNlbGVjdGlvbidcbmV4cG9ydCAqIGZyb20gJy4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnXG5cbmV4cG9ydCAqIGZyb20gJy4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1mYXN0J1xuZXhwb3J0ICogZnJvbSAnLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMnXG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvQmxlbmRNb2RlUmVnaXN0cnknXG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvdG9CbGVuZE1vZGVJbmRleEFuZE5hbWUnXG5cbmV4cG9ydCAqIGZyb20gJy4vQ2FudmFzL19jb25zdGFudHMnXG5leHBvcnQgKiBmcm9tICcuL0NhbnZhcy9DYW52YXNGcmFtZVJlbmRlcmVyJ1xuZXhwb3J0ICogZnJvbSAnLi9DYW52YXMvUGl4ZWxDYW52YXMnXG5leHBvcnQgKiBmcm9tICcuL0NhbnZhcy9SZXVzYWJsZUNhbnZhcydcblxuZXhwb3J0ICogZnJvbSAnLi9DbGlwYm9hcmQvZ2V0SW1hZ2VEYXRhRnJvbUNsaXBib2FyZCdcbmV4cG9ydCAqIGZyb20gJy4vQ2xpcGJvYXJkL3dyaXRlSW1hZ2VEYXRhVG9DbGlwYm9hcmQnXG5leHBvcnQgKiBmcm9tICcuL0NsaXBib2FyZC93cml0ZUltZ0Jsb2JUb0NsaXBib2FyZCdcblxuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L0hpc3RvcnlBY3Rpb24nXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvSGlzdG9yeU1hbmFnZXInXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxBY2N1bXVsYXRvcidcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbEVuZ2luZUNvbmZpZydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3InXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxQYXRjaFRpbGVzJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsV3JpdGVyJ1xuXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUFscGhhTWFzaydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckFwcGx5QmluYXJ5TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3InXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZFBpeGVsJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGEnXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZFBpeGVsRGF0YUFscGhhTWFzaydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckNsZWFyJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbCdcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckZpbGxCaW5hcnlNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9ySW52ZXJ0J1xuXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9jb3B5SW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcidcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL0ltYWdlRGF0YUxpa2UnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbWFnZURhdGFUb0FscGhhTWFza0J1ZmZlcidcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvRGF0YVVybCdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvSW1nQmxvYidcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvVUludDMyQXJyYXknXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbWdCbG9iVG9JbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbnZlcnRJbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9yZXNhbXBsZUltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3Jlc2l6ZUltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL1JldXNhYmxlSW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvc2VyaWFsaXphdGlvbidcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3VJbnQzMkFycmF5VG9JbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS93cml0ZUltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3dyaXRlSW1hZ2VEYXRhQnVmZmVyJ1xuXG5leHBvcnQgKiBmcm9tICcuL0luZGV4ZWRJbWFnZS9nZXRJbmRleGVkSW1hZ2VDb2xvckNvdW50cydcbmV4cG9ydCAqIGZyb20gJy4vSW5kZXhlZEltYWdlL0luZGV4ZWRJbWFnZSdcbmV4cG9ydCAqIGZyb20gJy4vSW5kZXhlZEltYWdlL2luZGV4ZWRJbWFnZVRvQXZlcmFnZUNvbG9yJ1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvaW5kZXhlZEltYWdlVG9JbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0luZGV4ZWRJbWFnZS9yZXNhbXBsZUluZGV4ZWRJbWFnZSdcblxuZXhwb3J0ICogZnJvbSAnLi9JbnB1dC9maWxlSW5wdXRDaGFuZ2VUb0ltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQvZmlsZVRvSW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dC9nZXRTdXBwb3J0ZWRSYXN0ZXJGb3JtYXRzJ1xuXG5leHBvcnQgKiBmcm9tICcuL01hc2svQWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL0JpbmFyeU1hc2snXG5cbmV4cG9ydCAqIGZyb20gJy4vTWFzay9hcHBseUJpbmFyeU1hc2tUb0FscGhhTWFzaydcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9jb3B5TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9leHRyYWN0TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9leHRyYWN0TWFza0J1ZmZlcidcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9pbnZlcnRNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL21lcmdlQWxwaGFNYXNrcydcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9tZXJnZUJpbmFyeU1hc2tzJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL3NldE1hc2tEYXRhJ1xuXG5leHBvcnQgKiBmcm9tICcuL01hc2tSZWN0L21lcmdlMkJpbmFyeU1hc2tSZWN0cydcbmV4cG9ydCAqIGZyb20gJy4vTWFza1JlY3QvbWVyZ2VCaW5hcnlNYXNrUmVjdHMnXG5leHBvcnQgKiBmcm9tICcuL01hc2tSZWN0L3N1YnRyYWN0QmluYXJ5TWFza1JlY3RzJ1xuXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEnXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9QaXhlbERhdGEnXG5cbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrJ1xuXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFQYWludEJ1ZmZlcidcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2NsZWFyUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvZXh0cmFjdFBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2V4dHJhY3RQaXhlbERhdGFCdWZmZXInXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2snXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhRmFzdCdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2ludmVydFBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL1BpeGVsQnVmZmVyMzInXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9waXhlbERhdGFUb0FscGhhTWFzaydcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3JlZmxlY3RQaXhlbERhdGEnXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9yZXNhbXBsZVBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3JvdGF0ZVBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3dyaXRlUGFpbnRCdWZmZXJUb1BpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3dyaXRlUGl4ZWxEYXRhQnVmZmVyJ1xuXG5leHBvcnQgKiBmcm9tICcuL1JlY3QvZ2V0UmVjdHNCb3VuZHMnXG5leHBvcnQgKiBmcm9tICcuL1JlY3QvdHJpbU1hc2tSZWN0Qm91bmRzJ1xuZXhwb3J0ICogZnJvbSAnLi9SZWN0L3RyaW1SZWN0Qm91bmRzJ1xuXG5leHBvcnQgKiBmcm9tICcuL1BhaW50L21ha2VDaXJjbGVQYWludEFscGhhTWFzaydcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvbWFrZUNpcmNsZVBhaW50QmluYXJ5TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvbWFrZVBhaW50TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvbWFrZVJlY3RGYWxsb2ZmUGFpbnRBbHBoYU1hc2snXG5leHBvcnQgKiBmcm9tICcuL1BhaW50L1BhaW50QnVmZmVyJ1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9QYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyJ1xuXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsVGlsZS9QaXhlbFRpbGUnXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsVGlsZS9QaXhlbFRpbGVQb29sJ1xuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/** 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 BasePaintMask {\n readonly centerOffsetX: number;\n readonly centerOffsetY: number;\n}\nexport interface PaintAlphaMask extends BasePaintMask, AlphaMask {}\nexport interface PaintBinaryMask extends BasePaintMask, BinaryMask {}\nexport type PaintMask = PaintAlphaMask | PaintBinaryMask;\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 MaskRect<T extends MaskType> = Rect & {\n type: T;\n data: Uint8Array;\n};\nexport type BinaryMaskRect = MaskRect<MaskType.BINARY>;\nexport type AlphaMaskRect = MaskRect<MaskType.ALPHA>;\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 HistoryMutator<T extends {}, D extends {}> = (writer: PixelWriter<any>, deps?: Partial<D>) => T;\nexport interface IPixelData32 {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n}\nexport interface IPixelData<T extends ImageDataLike = ImageData> extends IPixelData32 {\n readonly imageData: T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxXcml0ZXIsIHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi9pbmRleCdcblxuLyoqIEFMTCB2YWx1ZXMgYXJlIDAtMjU1IChpbmNsdWRpbmcgYWxwaGEgd2hpY2ggaW4gQ1NTIGlzIDAtMSkgKi9cbmV4cG9ydCB0eXBlIFJHQkEgPSB7IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciB9XG5cbi8qKiBSZXByZXNlbnRzIGEgMzItYml0IGNvbG9yIGluIDB4QUFCQkdHUlIgKExpdHRsZSBlbmRpYW4pICovXG5leHBvcnQgdHlwZSBDb2xvcjMyID0gbnVtYmVyICYgeyByZWFkb25seSBfX2JyYW5kQ29sb3IzMjogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIGNvbWJpbmUgYSBzb3VyY2UgY29sb3Igd2l0aCBhIGRlc3RpbmF0aW9uIGNvbG9yLlxuICogQHBhcmFtIHNyYyAtIFRoZSBpbmNvbWluZyBjb2xvciAoc291cmNlKS5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZXhpc3RpbmcgY29sb3IgaW4gdGhlIGJ1ZmZlciAoZGVzdGluYXRpb24pLlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyAzMi1iaXQgY29sb3IgdG8gYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyLlxuICovXG5leHBvcnQgdHlwZSBCbGVuZENvbG9yMzIgPSB7XG4gIChzcmM6IENvbG9yMzIsIGRzdDogQ29sb3IzMik6IENvbG9yMzIsXG4gIGlzT3ZlcndyaXRlPzogdHJ1ZVxufVxuXG5leHBvcnQgdHlwZSBJbWFnZURhdGFMaWtlID0ge1xuICB3aWR0aDogbnVtYmVyXG4gIGhlaWdodDogbnVtYmVyXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyTGlrZT5cbn1cblxuZXhwb3J0IHR5cGUgSW1hZ2VEYXRhTGlrZUNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBJbWFnZURhdGFMaWtlID0gSW1hZ2VEYXRhTGlrZT4gPSB7XG4gIG5ldyhcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBUXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRJbWFnZURhdGEgPSB7XG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbiAgZGF0YTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEJhc2U2NEVuY29kZWRVSW50OEFycmF5ID0gc3RyaW5nICYgeyByZWFkb25seSBfX2JyYW5kQmFzZTY0VUludDhBcnJheTogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKiBSZWN0YW5nbGUgZGVmaW5pdGlvbiAqL1xuZXhwb3J0IHR5cGUgUmVjdCA9IHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxuICB3OiBudW1iZXJcbiAgaDogbnVtYmVyXG59XG5cbi8qKlxuICogRGVmaW5lcyBob3cgbWFzayB2YWx1ZXMgc2hvdWxkIGJlIGludGVycHJldGVkIGR1cmluZyBhIGRyYXcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBNYXNrVHlwZSB7XG4gIC8qKlxuICAgKiBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYWxwaGEgd2VpZ2h0cy5cbiAgICogMCBpcyBza2lwcGVkLCB2YWx1ZXMgPiAwIGFyZSBwcm9jZXNzZWQuXG4gICAqL1xuICBBTFBIQSxcbiAgLyoqXG4gICAqICBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgb24vb2ZmLlxuICAgKiAwIGlzIGZ1bGx5IHRyYW5zcGFyZW50IChza2lwcGVkKSwgYW55IG90aGVyIHZhbHVlIGlzIGZ1bGx5IG9wYXF1ZS5cbiAgICovXG4gIEJJTkFSWVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hc2sge1xuICByZWFkb25seSB0eXBlOiBNYXNrVHlwZVxuICByZWFkb25seSBkYXRhOiBVaW50OEFycmF5XG4gIHJlYWRvbmx5IHc6IG51bWJlclxuICByZWFkb25seSBoOiBudW1iZXJcbn1cblxuLyoqIFN0cmljdGx5IDAgb3IgMSAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5hcnlNYXNrIGV4dGVuZHMgTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlLkJJTkFSWVxufVxuXG4vKiogU3RyaWN0bHkgMC0yNTUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxwaGFNYXNrIGV4dGVuZHMgTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlLkFMUEhBXG59XG5cbmludGVyZmFjZSBCYXNlUGFpbnRNYXNrIHtcbiAgcmVhZG9ubHkgY2VudGVyT2Zmc2V0WDogbnVtYmVyXG4gIHJlYWRvbmx5IGNlbnRlck9mZnNldFk6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhaW50QWxwaGFNYXNrIGV4dGVuZHMgQmFzZVBhaW50TWFzaywgQWxwaGFNYXNrIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWludEJpbmFyeU1hc2sgZXh0ZW5kcyBCYXNlUGFpbnRNYXNrLCBCaW5hcnlNYXNrIHtcbn1cblxuZXhwb3J0IHR5cGUgUGFpbnRNYXNrID0gUGFpbnRBbHBoYU1hc2sgfCBQYWludEJpbmFyeU1hc2tcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwaXhlbCBtYW5pcHVsYXRpb24gb3BlcmF0aW9ucy5cbiAqIERlc2lnbmVkIHRvIGJlIHVzZWQgYnkgc3ByZWFkaW5nIGEgUmVjdCBvYmplY3QgKHt4LCB5LCB3LCBofSkgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxSZWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzdGFydGluZyBYIGNvb3JkaW5hdGUgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgeD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgc3RhcnRpbmcgWSBjb29yZGluYXRlIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHk/OiBudW1iZXJcblxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgU291cmNlIHdpZHRoLlxuICAgKi9cbiAgdz86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgU291cmNlIGhlaWdodC5cbiAgICovXG4gIGg/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXNrT2Zmc2V0IHtcbiAgLyoqXG4gICAqIFggb2Zmc2V0IGludG8gdGhlIG1hc2sgYnVmZmVyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBteD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBZIG9mZnNldCBpbnRvIHRoZSBtYXNrIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgbXk/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZlcnRNYXNrIHtcblxuICAvKipcbiAgICogSWYgdHJ1ZSB0aGUgaW52ZXJzZSBvZiB0aGUgbWFzayB3aWxsIGJlIGFwcGxpZWRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGludmVydE1hc2s/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBBbHBoYSB7XG4gIC8qKlxuICAgKiBPdmVyYWxsIGxheWVyIG9wYWNpdHkgMC0yNTUuXG4gICAqIEBkZWZhdWx0IDI1NVxuICAgKi9cbiAgYWxwaGE/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXJnZUFscGhhTWFza3NPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgTWFza09mZnNldCwgSW52ZXJ0TWFzayB7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXhlbE11dGF0ZU9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIE1hc2tPZmZzZXQsIEludmVydE1hc2sge1xuICAvKiogQW4gb3B0aW9uYWwgbWFzayB0byByZXN0cmljdCB3aGVyZSBwaXhlbHMgYXJlIG11dGF0ZWQuICovXG4gIG1hc2s/OiBCaW5hcnlNYXNrIHwgbnVsbFxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGJsaXR0aW5nIChjb3B5aW5nL2JsZW5kaW5nKSBvbmUgaW1hZ2UgaW50byBhbm90aGVyLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVBpeGVsQmxlbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcmVjdGFuZ2xlIHgtY29vcmRpbmF0ZVxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBzeD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHJlY3RhbmdsZSB5LWNvb3JkaW5hdGVcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgc3k/OiBudW1iZXJcblxuICAvKipcbiAgICogVGhlIGJsZW5kaW5nIGFsZ29yaXRobSB0byB1c2UgZm9yIGJsZW5kaW5nIHBpeGVscy5cbiAgICogQGRlZmF1bHQge0BsaW5rIHNvdXJjZU92ZXJQZXJmZWN0fVxuICAgKi9cbiAgYmxlbmRGbj86IEJsZW5kQ29sb3IzMlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsQmxlbmRPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgQmFzZVBpeGVsQmxlbmRPcHRpb25zIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXhlbEJsZW5kTWFza09wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrLCBCYXNlUGl4ZWxCbGVuZE9wdGlvbnMge1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGNvbG9yIGJsZW5kaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yQmxlbmRPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSB7XG4gIC8qKlxuICAgKiBUaGUgYmxlbmRpbmcgYWxnb3JpdGhtIHRvIHVzZSBmb3IgYmxlbmRpbmcgcGl4ZWxzLlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgc291cmNlT3ZlclBlcmZlY3R9XG4gICAqL1xuICBibGVuZEZuPzogQmxlbmRDb2xvcjMyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JCbGVuZE1hc2tPcHRpb25zIGV4dGVuZHMgQ29sb3JCbGVuZE9wdGlvbnMsIE1hc2tPZmZzZXQsIEludmVydE1hc2sge1xufVxuXG5leHBvcnQgdHlwZSBNYXNrUmVjdDxUIGV4dGVuZHMgTWFza1R5cGU+ID0gUmVjdCAmIHtcbiAgdHlwZTogVFxuICBkYXRhOiBVaW50OEFycmF5XG59XG5cbmV4cG9ydCB0eXBlIEJpbmFyeU1hc2tSZWN0ID0gTWFza1JlY3Q8TWFza1R5cGUuQklOQVJZPlxuXG5leHBvcnQgdHlwZSBBbHBoYU1hc2tSZWN0ID0gTWFza1JlY3Q8TWFza1R5cGUuQUxQSEE+XG5cbmV4cG9ydCB0eXBlIE51bGxhYmxlQmluYXJ5TWFza1JlY3QgPSBSZWN0ICYgKHtcbiAgdHlwZTogTWFza1R5cGUuQklOQVJZXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbn0gfCB7XG4gIHR5cGU/OiBudWxsXG4gIGRhdGE/OiBudWxsXG59KVxuXG5leHBvcnQgdHlwZSBOdWxsYWJsZU1hc2tSZWN0ID0gUmVjdCAmICh7XG4gIHR5cGU6IE1hc2tUeXBlXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbn0gfCB7XG4gIHR5cGU/OiBudWxsXG4gIGRhdGE/OiBudWxsXG59KVxuXG5leHBvcnQgdHlwZSBIaXN0b3J5TXV0YXRvcjxUIGV4dGVuZHMge30sIEQgZXh0ZW5kcyB7fT4gPSAod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzPzogUGFydGlhbDxEPikgPT4gVFxuXG5leHBvcnQgaW50ZXJmYWNlIElQaXhlbERhdGEzMiB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXlcbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlclxuICByZWFkb25seSBoZWlnaHQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQaXhlbERhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgPSBJbWFnZURhdGE+IGV4dGVuZHMgSVBpeGVsRGF0YTMyIHtcbiAgcmVhZG9ubHkgaW1hZ2VEYXRhOiBUXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 trimMaskRectBounds<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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZU1hc2tSZWN0LCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hc2tCdWZmZXIgfSBmcm9tICcuLi9NYXNrL2V4dHJhY3RNYXNrQnVmZmVyJ1xuXG4vKipcbiAqIEludGVyc2VjdHMgYSB0YXJnZXQgcmVjdGFuZ2xlIHdpdGggYSBib3VuZGFyeSwgdHJpbW1pbmcgZGltZW5zaW9ucyBhbmQgbWFza3MgaW4tcGxhY2UuXG4gKiBUaGlzIHV0aWxpdHkgY2FsY3VsYXRlcyB0aGUgYXhpcy1hbGlnbmVkIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSBgdGFyZ2V0YCBhbmQgYGJvdW5kc2AuXG4gKiBJZiB0aGUgYHRhcmdldGAgaW5jbHVkZXMgYSBgbWFza2AgKGFzIGluIGEge0BsaW5rIE51bGxhYmxlTWFza1JlY3R9KSwgdGhlIG1hc2sgaXMgcGh5c2ljYWxseVxuICogY3JvcHBlZCBhbmQgcmUtYWxpZ25lZCB1c2luZyBgZXh0cmFjdE1hc2tCdWZmZXJgIHRvIG1hdGNoIHRoZSBuZXcgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgcmVjdGFuZ2xlIG9yIHNlbGVjdGlvbiBvYmplY3QgdG8gYmUgdHJpbW1lZC4gKipOb3RlOioqIFRoaXMgb2JqZWN0IGlzIG11dGF0ZWQgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYm91bmRzIC0gVGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBkZWZpbmluZyB0aGUgbWF4aW11bSBhbGxvd2FibGUgYXJlYSAoZS5nLiwgY2FudmFzIGRpbWVuc2lvbnMpLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlbGVjdGlvbiA9IHsgeDogLTEwLCB5OiAtMTAsIHc6IDUwLCBoOiA1MCwgbWFzazogbmV3IFVpbnQ4QXJyYXkoMjUwMCkgfTtcbiAqIGNvbnN0IGNhbnZhcyA9IHsgeDogMCwgeTogMCwgdzogMTAwLCBoOiAxMDAgfTtcbiAqIC8vIFNlbGVjdGlvbiB3aWxsIGJlIG1vdmVkIHRvICgwLDApIGFuZCByZXNpemVkIHRvIDQweDQwLlxuICogLy8gVGhlIG1hc2sgaXMgY3JvcHBlZCBieSAxMCBweCBvbiB0aGUgdG9wIGFuZCBsZWZ0LlxuICogdHJpbVJlY3RCb3VuZHMoc2VsZWN0aW9uLCBjYW52YXMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbU1hc2tSZWN0Qm91bmRzPFQgZXh0ZW5kcyBOdWxsYWJsZU1hc2tSZWN0PihcbiAgdGFyZ2V0OiBULFxuICBib3VuZHM6IFJlY3QsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxYID0gdGFyZ2V0LnhcbiAgY29uc3Qgb3JpZ2luYWxZID0gdGFyZ2V0LnlcbiAgY29uc3Qgb3JpZ2luYWxXID0gdGFyZ2V0LndcblxuICBjb25zdCBpbnRlcnNlY3RlZFggPSBNYXRoLm1heCh0YXJnZXQueCwgYm91bmRzLngpXG4gIGNvbnN0IGludGVyc2VjdGVkWSA9IE1hdGgubWF4KHRhcmdldC55LCBib3VuZHMueSlcblxuICBjb25zdCBpbnRlcnNlY3RlZE1heFggPSBNYXRoLm1pbihcbiAgICB0YXJnZXQueCArIHRhcmdldC53LFxuICAgIGJvdW5kcy54ICsgYm91bmRzLncsXG4gIClcbiAgY29uc3QgaW50ZXJzZWN0ZWRNYXhZID0gTWF0aC5taW4oXG4gICAgdGFyZ2V0LnkgKyB0YXJnZXQuaCxcbiAgICBib3VuZHMueSArIGJvdW5kcy5oLFxuICApXG5cbiAgLy8gSW50ZXJzZWN0aW9uIGNoZWNrXG4gIGlmIChpbnRlcnNlY3RlZE1heFggPD0gaW50ZXJzZWN0ZWRYIHx8IGludGVyc2VjdGVkTWF4WSA8PSBpbnRlcnNlY3RlZFkpIHtcbiAgICB0YXJnZXQudyA9IDBcbiAgICB0YXJnZXQuaCA9IDBcblxuICAgIGlmICgnZGF0YScgaW4gdGFyZ2V0ICYmIHRhcmdldC5kYXRhKSB7XG4gICAgICB0YXJnZXQuZGF0YSA9IG5ldyBVaW50OEFycmF5KDApXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBpbnRlcnNlY3RlZFcgPSBpbnRlcnNlY3RlZE1heFggLSBpbnRlcnNlY3RlZFhcbiAgY29uc3QgaW50ZXJzZWN0ZWRIID0gaW50ZXJzZWN0ZWRNYXhZIC0gaW50ZXJzZWN0ZWRZXG4gIGNvbnN0IG9mZnNldFggPSBpbnRlcnNlY3RlZFggLSBvcmlnaW5hbFhcbiAgY29uc3Qgb2Zmc2V0WSA9IGludGVyc2VjdGVkWSAtIG9yaWdpbmFsWVxuXG4gIHRhcmdldC54ID0gaW50ZXJzZWN0ZWRYXG4gIHRhcmdldC55ID0gaW50ZXJzZWN0ZWRZXG4gIHRhcmdldC53ID0gaW50ZXJzZWN0ZWRXXG4gIHRhcmdldC5oID0gaW50ZXJzZWN0ZWRIXG5cbiAgaWYgKCdkYXRhJyBpbiB0YXJnZXQgJiYgdGFyZ2V0LmRhdGEpIHtcbiAgICBjb25zdCBjdXJyZW50TWFza0J1ZmZlciA9IGV4dHJhY3RNYXNrQnVmZmVyKFxuICAgICAgdGFyZ2V0LmRhdGEsXG4gICAgICBvcmlnaW5hbFcsXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGludGVyc2VjdGVkVyxcbiAgICAgIGludGVyc2VjdGVkSCxcbiAgICApXG5cbiAgICBsZXQgbWluWCA9IGludGVyc2VjdGVkV1xuICAgIGxldCBtYXhYID0gLTFcbiAgICBsZXQgbWluWSA9IGludGVyc2VjdGVkSFxuICAgIGxldCBtYXhZID0gLTFcblxuICAgIC8vIFNjYW4gZm9yIGNvbnRlbnRcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGludGVyc2VjdGVkSDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGludGVyc2VjdGVkVzsgeCsrKSB7XG4gICAgICAgIGlmIChjdXJyZW50TWFza0J1ZmZlclt5ICogaW50ZXJzZWN0ZWRXICsgeF0gIT09IDApIHtcbiAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4XG4gICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geFxuICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHlcbiAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBubyBjb250ZW50IGlzIGZvdW5kIChhbGwgemVyb3MpXG4gICAgaWYgKG1heFggPT09IC0xKSB7XG4gICAgICB0YXJnZXQudyA9IDBcbiAgICAgIHRhcmdldC5oID0gMFxuICAgICAgdGFyZ2V0LmRhdGEgPSBuZXcgVWludDhBcnJheSgwKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFcgPSBtYXhYIC0gbWluWCArIDFcbiAgICBjb25zdCBmaW5hbEggPSBtYXhZIC0gbWluWSArIDFcblxuICAgIC8vIE9ubHkgc2hpZnQgYW5kIGNyb3AgaWYgdGhlIGNvbnRlbnQgaXMgc21hbGxlciB0aGFuIHRoZSBpbnRlcnNlY3Rpb25cbiAgICBpZiAoZmluYWxXICE9PSBpbnRlcnNlY3RlZFcgfHwgZmluYWxIICE9PSBpbnRlcnNlY3RlZEgpIHtcbiAgICAgIGNvbnN0IG5ld01hc2tCdWZmZXIgPSBleHRyYWN0TWFza0J1ZmZlcihcbiAgICAgICAgY3VycmVudE1hc2tCdWZmZXIsXG4gICAgICAgIGludGVyc2VjdGVkVyxcbiAgICAgICAgbWluWCxcbiAgICAgICAgbWluWSxcbiAgICAgICAgZmluYWxXLFxuICAgICAgICBmaW5hbEgsXG4gICAgICApXG5cbiAgICAgIHRhcmdldC54ICs9IG1pblhcbiAgICAgIHRhcmdldC55ICs9IG1pbllcbiAgICAgIHRhcmdldC53ID0gZmluYWxXXG4gICAgICB0YXJnZXQuaCA9IGZpbmFsSFxuICAgICAgdGFyZ2V0LmRhdGEgPSBuZXdNYXNrQnVmZmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC53ID0gZmluYWxXXG4gICAgICB0YXJnZXQuaCA9IGZpbmFsSFxuICAgICAgdGFyZ2V0LmRhdGEgPSBjdXJyZW50TWFza0J1ZmZlclxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type Color32, MaskType } from '../_types';\nimport { colorDistance } from '../color';\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer';\nimport { trimMaskRectBounds } from '../Rect/trimMaskRectBounds';\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 trimMaskRectBounds(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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBCaW5hcnlNYXNrUmVjdCwgdHlwZSBDb2xvcjMyLCB0eXBlIEltYWdlRGF0YUxpa2UsIE1hc2tUeXBlLCB0eXBlIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBjb2xvckRpc3RhbmNlIH0gZnJvbSAnLi4vY29sb3InXG5pbXBvcnQgeyBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2V4dHJhY3RJbWFnZURhdGFCdWZmZXInXG5pbXBvcnQgdHlwZSB7IFBpeGVsRGF0YSB9IGZyb20gJy4uL1BpeGVsRGF0YS9QaXhlbERhdGEnXG5pbXBvcnQgeyB0cmltTWFza1JlY3RCb3VuZHMgfSBmcm9tICcuLi9SZWN0L3RyaW1NYXNrUmVjdEJvdW5kcydcblxuZXhwb3J0IHR5cGUgRmxvb2RGaWxsSW1hZ2VEYXRhT3B0aW9ucyA9IHtcbiAgY29udGlndW91cz86IGJvb2xlYW5cbiAgdG9sZXJhbmNlPzogbnVtYmVyXG4gIGJvdW5kcz86IFJlY3Rcbn1cblxuZXhwb3J0IHR5cGUgRmxvb2RGaWxsUmVzdWx0ID0ge1xuICBzdGFydFg6IG51bWJlclxuICBzdGFydFk6IG51bWJlclxuICBzZWxlY3Rpb25SZWN0OiBCaW5hcnlNYXNrUmVjdFxuICBwaXhlbHM6IFVpbnQ4Q2xhbXBlZEFycmF5XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBjb2xvci1iYXNlZCBmbG9vZCBmaWxsIHNlbGVjdGlvbiBvbiB7QGxpbmsgSW1hZ2VEYXRhfSBvciB7QGxpbmsgUGl4ZWxEYXRhfS5cbiAqIFRoaXMgdXRpbGl0eSBpZGVudGlmaWVzIHBpeGVscyBzdGFydGluZyBmcm9tIGEgc3BlY2lmaWMgY29vcmRpbmF0ZSB0aGF0IGZhbGwgd2l0aGluIGFcbiAqIGNvbG9yIHRvbGVyYW5jZS4gSXQgY2FuIG9wZXJhdGUgaW4gXCJjb250aWd1b3VzXCIgbW9kZSAoY2xhc3NpYyBidWNrZXQgZmlsbCkgb3JcbiAqIFwibm9uLWNvbnRpZ3VvdXNcIiBtb2RlIChzZWxlY3RzIGFsbCBtYXRjaGluZyBwaXhlbHMgaW4gdGhlIGJ1ZmZlcikuXG4gKlxuICogQHBhcmFtIGltZyAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byBwcm9jZXNzLlxuICogQHBhcmFtIHN0YXJ0WCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gc3RhcnRZIC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBmaWxsIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvcHRpb25zLmNvbnRpZ3VvdXMgLSBJZiB0cnVlLCBvbmx5IGNvbm5lY3RlZCBwaXhlbHMgYXJlXG4gKiBzZWxlY3RlZC4gSWYgZmFsc2UsIGFsbCBwaXhlbHMgd2l0aGluIHRvbGVyYW5jZSBhcmUgc2VsZWN0ZWQgcmVnYXJkbGVzcyBvZiBwb3NpdGlvbi5cbiAqIEBwYXJhbSBvcHRpb25zLnRvbGVyYW5jZSAtIFRoZSBtYXhpbXVtIGFsbG93ZWQgZGlmZmVyZW5jZSBpbiBjb2xvclxuICogZGlzdGFuY2UgKDAtMjU1KSBmb3IgYSBwaXhlbCB0byBiZSBpbmNsdWRlZC5cbiAqIEBwYXJhbSBvcHRpb25zLmJvdW5kcyAtIE9wdGlvbmFsIGJvdW5kaW5nIGJveCB0byByZXN0cmljdCB0aGUgc2VhcmNoIGFyZWEuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgRmxvb2RGaWxsUmVzdWx0fSBjb250YWluaW5nIHRoZSBtYXNrIGFuZCBib3VuZHMgb2YgdGhlIHNlbGVjdGlvbixcbiAqIG9yIGBudWxsYCBpZiB0aGUgc3RhcnRpbmcgY29vcmRpbmF0ZXMgYXJlIG91dCBvZiBib3VuZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGZsb29kRmlsbEltYWdlRGF0YVNlbGVjdGlvbihcbiAqIGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMTAwLCAxMDApLFxuICogNTAsXG4gKiA1MCxcbiAqIHtcbiAqIHRvbGVyYW5jZTogMjAsXG4gKiBjb250aWd1b3VzOiB0cnVlXG4gKiB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG9vZEZpbGxTZWxlY3Rpb24oXG4gIGltZzogSW1hZ2VEYXRhTGlrZSB8IFBpeGVsRGF0YSxcbiAgc3RhcnRYOiBudW1iZXIsXG4gIHN0YXJ0WTogbnVtYmVyLFxuICB7XG4gICAgY29udGlndW91cyA9IHRydWUsXG4gICAgdG9sZXJhbmNlID0gMCxcbiAgICBib3VuZHMsXG4gIH06IEZsb29kRmlsbEltYWdlRGF0YU9wdGlvbnMgPSB7fSxcbik6IEZsb29kRmlsbFJlc3VsdCB8IG51bGwge1xuXG4gIGxldCBpbWFnZURhdGE6IEltYWdlRGF0YUxpa2VcbiAgbGV0IGRhdGEzMjogVWludDMyQXJyYXlcbiAgaWYgKCdkYXRhMzInIGluIGltZykge1xuICAgIGRhdGEzMiA9IGltZy5kYXRhMzJcbiAgICBpbWFnZURhdGEgPSBpbWcuaW1hZ2VEYXRhXG4gIH0gZWxzZSB7XG4gICAgZGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KFxuICAgICAgaW1nLmRhdGEuYnVmZmVyLFxuICAgICAgaW1nLmRhdGEuYnl0ZU9mZnNldCxcbiAgICAgIGltZy5kYXRhLmJ5dGVMZW5ndGggPj4gMixcbiAgICApXG4gICAgaW1hZ2VEYXRhID0gaW1nXG4gIH1cbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfSA9IGltZ1xuXG4gIGNvbnN0IGxpbWl0ID0gYm91bmRzIHx8IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogd2lkdGgsXG4gICAgaDogaGVpZ2h0LFxuICB9XG5cbiAgY29uc3QgeE1pbiA9IE1hdGgubWF4KDAsIGxpbWl0LngpXG4gIGNvbnN0IHhNYXggPSBNYXRoLm1pbih3aWR0aCAtIDEsIGxpbWl0LnggKyBsaW1pdC53IC0gMSlcbiAgY29uc3QgeU1pbiA9IE1hdGgubWF4KDAsIGxpbWl0LnkpXG4gIGNvbnN0IHlNYXggPSBNYXRoLm1pbihoZWlnaHQgLSAxLCBsaW1pdC55ICsgbGltaXQuaCAtIDEpXG5cbiAgaWYgKHN0YXJ0WCA8IHhNaW4gfHwgc3RhcnRYID4geE1heCB8fCBzdGFydFkgPCB5TWluIHx8IHN0YXJ0WSA+IHlNYXgpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgYmFzZUNvbG9yID0gZGF0YTMyW3N0YXJ0WSAqIHdpZHRoICsgc3RhcnRYXSBhcyBDb2xvcjMyXG5cbiAgbGV0IG1hdGNoQ291bnQgPSAwXG4gIGNvbnN0IG1hdGNoWCA9IG5ldyBVaW50MTZBcnJheSh3aWR0aCAqIGhlaWdodClcbiAgY29uc3QgbWF0Y2hZID0gbmV3IFVpbnQxNkFycmF5KHdpZHRoICogaGVpZ2h0KVxuXG4gIGxldCBtaW5YID0gc3RhcnRYXG4gIGxldCBtYXhYID0gc3RhcnRYXG4gIGxldCBtaW5ZID0gc3RhcnRZXG4gIGxldCBtYXhZID0gc3RhcnRZXG5cbiAgaWYgKGNvbnRpZ3VvdXMpIHtcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgVWludDMyQXJyYXkod2lkdGggKiBoZWlnaHQpXG4gICAgbGV0IHN0YWNrUHRyID0gMFxuXG4gICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoc3RhcnRZIDw8IDE2KSB8IHN0YXJ0WFxuICAgIHZpc2l0ZWRbc3RhcnRZICogd2lkdGggKyBzdGFydFhdID0gMVxuXG4gICAgd2hpbGUgKHN0YWNrUHRyID4gMCkge1xuICAgICAgY29uc3QgdmFsID0gc3RhY2tbLS1zdGFja1B0cl1cbiAgICAgIGNvbnN0IHggPSB2YWwgJiAweEZGRkZcbiAgICAgIGNvbnN0IHkgPSB2YWwgPj4+IDE2XG5cbiAgICAgIG1hdGNoWFttYXRjaENvdW50XSA9IHhcbiAgICAgIG1hdGNoWVttYXRjaENvdW50XSA9IHlcbiAgICAgIG1hdGNoQ291bnQrK1xuXG4gICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4XG4gICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4XG4gICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5XG4gICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5XG5cbiAgICAgIC8vIFJpZ2h0XG4gICAgICBpZiAoeCArIDEgPD0geE1heCkge1xuICAgICAgICBjb25zdCBpZHggPSB5ICogd2lkdGggKyAoeCArIDEpXG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxXG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoeSA8PCAxNikgfCAoeCArIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIExlZnRcbiAgICAgIGlmICh4IC0gMSA+PSB4TWluKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiB3aWR0aCArICh4IC0gMSlcbiAgICAgICAgaWYgKCF2aXNpdGVkW2lkeF0gJiYgY29sb3JEaXN0YW5jZShkYXRhMzJbaWR4XSBhcyBDb2xvcjMyLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHZpc2l0ZWRbaWR4XSA9IDFcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9ICh5IDw8IDE2KSB8ICh4IC0gMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG93blxuICAgICAgaWYgKHkgKyAxIDw9IHlNYXgpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gKHkgKyAxKSAqIHdpZHRoICsgeFxuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMVxuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0gKCh5ICsgMSkgPDwgMTYpIHwgeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBVcFxuICAgICAgaWYgKHkgLSAxID49IHlNaW4pIHtcbiAgICAgICAgY29uc3QgaWR4ID0gKHkgLSAxKSAqIHdpZHRoICsgeFxuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMVxuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0gKCh5IC0gMSkgPDwgMTYpIHwgeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IHkgPSB5TWluOyB5IDw9IHlNYXg7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPD0geE1heDsgeCsrKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gZGF0YTMyW3kgKiB3aWR0aCArIHhdIGFzIENvbG9yMzJcbiAgICAgICAgaWYgKGNvbG9yRGlzdGFuY2UoY29sb3IsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgbWF0Y2hYW21hdGNoQ291bnRdID0geFxuICAgICAgICAgIG1hdGNoWVttYXRjaENvdW50XSA9IHlcbiAgICAgICAgICBtYXRjaENvdW50KytcblxuICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHhcbiAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4XG4gICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geVxuICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCB3ID0gbWF4WCAtIG1pblggKyAxXG4gIGNvbnN0IGggPSBtYXhZIC0gbWluWSArIDFcbiAgY29uc3Qgc2VsZWN0aW9uUmVjdDogQmluYXJ5TWFza1JlY3QgPSB7XG4gICAgeDogbWluWCxcbiAgICB5OiBtaW5ZLFxuICAgIHcsXG4gICAgaCxcbiAgICBkYXRhOiBuZXcgVWludDhBcnJheSh3ICogaCksXG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICB9XG5cbiAgY29uc3Qgc3cgPSBzZWxlY3Rpb25SZWN0LndcbiAgY29uc3Qgc2ggPSBzZWxlY3Rpb25SZWN0LmhcbiAgY29uc3QgZmluYWxNYXNrID0gc2VsZWN0aW9uUmVjdC5kYXRhXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaENvdW50OyBpKyspIHtcbiAgICBjb25zdCBteCA9IG1hdGNoWFtpXSAtIHNlbGVjdGlvblJlY3QueFxuICAgIGNvbnN0IG15ID0gbWF0Y2hZW2ldIC0gc2VsZWN0aW9uUmVjdC55XG5cbiAgICBpZiAobXggPj0gMCAmJiBteCA8IHN3ICYmIG15ID49IDAgJiYgbXkgPCBzaCkge1xuICAgICAgZmluYWxNYXNrW215ICogc3cgKyBteF0gPSAxXG4gICAgfVxuICB9XG5cbiAgdHJpbU1hc2tSZWN0Qm91bmRzKFxuICAgIHNlbGVjdGlvblJlY3QsXG4gICAgeyB4OiAwLCB5OiAwLCB3OiB3aWR0aCwgaDogaGVpZ2h0IH0sXG4gIClcblxuICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKFxuICAgIGltYWdlRGF0YSxcbiAgICBzZWxlY3Rpb25SZWN0LngsXG4gICAgc2VsZWN0aW9uUmVjdC55LFxuICAgIHNlbGVjdGlvblJlY3QudyxcbiAgICBzZWxlY3Rpb25SZWN0LmgsXG4gIClcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0WCxcbiAgICBzdGFydFksXG4gICAgc2VsZWN0aW9uUmVjdCxcbiAgICBwaXhlbHM6IGV4dHJhY3RlZCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 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 CanvasContext<T> = T extends HTMLCanvasElement ? CanvasRenderingContext2D : OffscreenCanvasRenderingContext2D;\nexport type ReusableCanvas<T extends HTMLCanvasElement | OffscreenCanvas> = {\n readonly canvas: T;\n readonly ctx: CanvasContext<T>;\n};\n\n/**\n * Creates a reusable HTMLCanvasElement 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 return makeReusableCanvasMeta<HTMLCanvasElement>((w, h) => {\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n return canvas;\n });\n}\n\n/**\n * Creates a reusable OffscreenCanvas and context.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link OffscreenCanvasRenderingContext2D} context cannot be initialized.\n */\nexport function makeReusableOffscreenCanvas() {\n return makeReusableCanvasMeta<OffscreenCanvas>((w, h) => new OffscreenCanvas(w, h));\n}\nfunction makeReusableCanvasMeta<T extends HTMLCanvasElement | OffscreenCanvas>(factory: (w: number, h: number) => T) {\n let canvas: T | null = null;\n let ctx: CanvasContext<T> | null = null;\n const result: ReusableCanvas<T> = {\n canvas: null as any,\n ctx: null as any\n };\n function get(width: number, height: number): ReusableCanvas<T> {\n if (canvas === null) {\n canvas = factory(width, height);\n ctx = canvas.getContext('2d') as CanvasContext<T> | null;\n if (!ctx) {\n throw new Error(CANVAS_CTX_FAILED);\n }\n\n // Initialize the fresh context state\n ctx.imageSmoothingEnabled = false;\n (result as any).canvas = canvas;\n (result as any).ctx = ctx;\n\n // Early return to skip resize/clear checks for brand new canvases\n return result;\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 // Always reset transform before clearing to ensure the whole buffer is wiped\n ctx!.setTransform(1, 0, 0, 1, 0, 0);\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height);\n }\n return result;\n }\n get.reset = () => {\n canvas = null;\n ctx = null;\n (result as any).canvas = null;\n (result as any).ctx = null;\n };\n return get;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuL19jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIENhbnZhc0NvbnRleHQ8VD4gPSBUIGV4dGVuZHMgSFRNTENhbnZhc0VsZW1lbnRcbiAgPyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgOiBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcblxuZXhwb3J0IHR5cGUgUmV1c2FibGVDYW52YXM8VCBleHRlbmRzIEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzPiA9IHtcbiAgcmVhZG9ubHkgY2FudmFzOiBUXG4gIHJlYWRvbmx5IGN0eDogQ2FudmFzQ29udGV4dDxUPlxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXVzYWJsZSBIVE1MQ2FudmFzRWxlbWVudCBhbmQgY29udGV4dCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgRE9NLlxuICogRW5zdXJlcyBpdCBpcyBhbHdheXMgc2V0IHRvIGBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlYFxuICogQHNlZSBtYWtlUGl4ZWxDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXVzYWJsZUNhbnZhcygpIHtcbiAgcmV0dXJuIG1ha2VSZXVzYWJsZUNhbnZhc01ldGE8SFRNTENhbnZhc0VsZW1lbnQ+KCh3LCBoKSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcblxuICAgIGNhbnZhcy53aWR0aCA9IHdcbiAgICBjYW52YXMuaGVpZ2h0ID0gaFxuXG4gICAgcmV0dXJuIGNhbnZhc1xuICB9KVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXVzYWJsZSBPZmZzY3JlZW5DYW52YXMgYW5kIGNvbnRleHQuXG4gKiBFbnN1cmVzIGl0IGlzIGFsd2F5cyBzZXQgdG8gYGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2VgXG4gKiBAc2VlIG1ha2VQaXhlbENhbnZhc1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXVzYWJsZU9mZnNjcmVlbkNhbnZhcygpIHtcbiAgcmV0dXJuIG1ha2VSZXVzYWJsZUNhbnZhc01ldGE8T2Zmc2NyZWVuQ2FudmFzPigodywgaCkgPT4gbmV3IE9mZnNjcmVlbkNhbnZhcyh3LCBoKSlcbn1cblxuZnVuY3Rpb24gbWFrZVJldXNhYmxlQ2FudmFzTWV0YTxUIGV4dGVuZHMgSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM+KFxuICBmYWN0b3J5OiAodzogbnVtYmVyLCBoOiBudW1iZXIpID0+IFQsXG4pIHtcbiAgbGV0IGNhbnZhczogVCB8IG51bGwgPSBudWxsXG4gIGxldCBjdHg6IENhbnZhc0NvbnRleHQ8VD4gfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0IHJlc3VsdDogUmV1c2FibGVDYW52YXM8VD4gPSB7XG4gICAgY2FudmFzOiBudWxsIGFzIGFueSxcbiAgICBjdHg6IG51bGwgYXMgYW55LFxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUmV1c2FibGVDYW52YXM8VD4ge1xuICAgIGlmIChjYW52YXMgPT09IG51bGwpIHtcbiAgICAgIGNhbnZhcyA9IGZhY3Rvcnkod2lkdGgsIGhlaWdodClcbiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzIENhbnZhc0NvbnRleHQ8VD4gfCBudWxsXG5cbiAgICAgIGlmICghY3R4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRClcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJlc2ggY29udGV4dCBzdGF0ZVxuICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG5cbiAgICAgIDsocmVzdWx0IGFzIGFueSkuY2FudmFzID0gY2FudmFzXG4gICAgICA7KHJlc3VsdCBhcyBhbnkpLmN0eCA9IGN0eFxuXG4gICAgICAvLyBFYXJseSByZXR1cm4gdG8gc2tpcCByZXNpemUvY2xlYXIgY2hlY2tzIGZvciBicmFuZCBuZXcgY2FudmFzZXNcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgaWYgbmVlZGVkIChyZXNpemluZyBhdXRvLWNsZWFycylcbiAgICBpZiAoY2FudmFzLndpZHRoICE9PSB3aWR0aCB8fCBjYW52YXMuaGVpZ2h0ICE9PSBoZWlnaHQpIHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgICBjdHghLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFsd2F5cyByZXNldCB0cmFuc2Zvcm0gYmVmb3JlIGNsZWFyaW5nIHRvIGVuc3VyZSB0aGUgd2hvbGUgYnVmZmVyIGlzIHdpcGVkXG4gICAgICBjdHghLnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgICAgLy8gU2FtZSBzaXplIOKGkiBtYW51YWxseSBjbGVhclxuICAgICAgY3R4IS5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBnZXQucmVzZXQgPSAoKSA9PiB7XG4gICAgY2FudmFzID0gbnVsbFxuICAgIGN0eCA9IG51bGxcblxuICAgIDsocmVzdWx0IGFzIGFueSkuY2FudmFzID0gbnVsbFxuICAgIDsocmVzdWx0IGFzIGFueSkuY3R4ID0gbnVsbFxuICB9XG5cbiAgcmV0dXJuIGdldFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeReusableCanvas } from './ReusableCanvas';\nexport type DrawPixelLayer = (ctx: CanvasRenderingContext2D) => void;\nexport type DrawScreenLayer = (ctx: CanvasRenderingContext2D, scale: number) => void;\nexport type CanvasFrameRenderer = ReturnType<typeof makeCanvasFrameRenderer>;\nconst defaults = {\n makeReusableCanvas\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport function makeCanvasFrameRenderer(deps: Deps = defaults) {\n const {\n makeReusableCanvas = defaults.makeReusableCanvas\n } = deps;\n const bufferCanvas = makeReusableCanvas();\n return function renderCanvasFrame(pixelCanvas: PixelCanvas, scale: number, getImageData: () => ImageData | undefined | null, drawPixelLayer?: DrawPixelLayer, drawScreenLayer?: DrawScreenLayer) {\n const {\n canvas,\n ctx\n } = pixelCanvas;\n\n // 1. Clear pixel buffer (unscaled)\n const {\n ctx: pxCtx,\n canvas: pxCanvas\n } = bufferCanvas(canvas.width, canvas.height);\n\n // 2. Draw pixel data into pixel buffer\n const img = getImageData();\n if (img) {\n pxCtx.putImageData(img, 0, 0);\n }\n\n // draw transient pixel data\n drawPixelLayer?.(pxCtx);\n\n // clear target canvas\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Draw pixel buffer scaled onto screen\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n ctx.drawImage(pxCanvas, 0, 0);\n\n // Draw overlays in screen space\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n drawScreenLayer?.(ctx, scale);\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQaXhlbENhbnZhcyB9IGZyb20gJy4vUGl4ZWxDYW52YXMnXG5pbXBvcnQgeyBtYWtlUmV1c2FibGVDYW52YXMgfSBmcm9tICcuL1JldXNhYmxlQ2FudmFzJ1xuXG5leHBvcnQgdHlwZSBEcmF3UGl4ZWxMYXllciA9IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkgPT4gdm9pZFxuZXhwb3J0IHR5cGUgRHJhd1NjcmVlbkxheWVyID0gKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBzY2FsZTogbnVtYmVyKSA9PiB2b2lkXG5leHBvcnQgdHlwZSBDYW52YXNGcmFtZVJlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUNhbnZhc0ZyYW1lUmVuZGVyZXI+XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBtYWtlUmV1c2FibGVDYW52YXMsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNhbnZhc0ZyYW1lUmVuZGVyZXIoZGVwczogRGVwcyA9IGRlZmF1bHRzKSB7XG4gIGNvbnN0IHtcbiAgICBtYWtlUmV1c2FibGVDYW52YXMgPSBkZWZhdWx0cy5tYWtlUmV1c2FibGVDYW52YXMsXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYnVmZmVyQ2FudmFzID0gbWFrZVJldXNhYmxlQ2FudmFzKClcblxuICByZXR1cm4gZnVuY3Rpb24gcmVuZGVyQ2FudmFzRnJhbWUoXG4gICAgcGl4ZWxDYW52YXM6IFBpeGVsQ2FudmFzLFxuICAgIHNjYWxlOiBudW1iZXIsXG4gICAgZ2V0SW1hZ2VEYXRhOiAoKSA9PiBJbWFnZURhdGEgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIGRyYXdQaXhlbExheWVyPzogRHJhd1BpeGVsTGF5ZXIsXG4gICAgZHJhd1NjcmVlbkxheWVyPzogRHJhd1NjcmVlbkxheWVyLFxuICApIHtcbiAgICBjb25zdCB7IGNhbnZhcywgY3R4IH0gPSBwaXhlbENhbnZhc1xuXG4gICAgLy8gMS4gQ2xlYXIgcGl4ZWwgYnVmZmVyICh1bnNjYWxlZClcbiAgICBjb25zdCB7IGN0eDogcHhDdHgsIGNhbnZhczogcHhDYW52YXMgfSA9IGJ1ZmZlckNhbnZhcyhjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpXG5cbiAgICAvLyAyLiBEcmF3IHBpeGVsIGRhdGEgaW50byBwaXhlbCBidWZmZXJcbiAgICBjb25zdCBpbWcgPSBnZXRJbWFnZURhdGEoKVxuICAgIGlmIChpbWcpIHtcbiAgICAgIHB4Q3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApXG4gICAgfVxuXG4gICAgLy8gZHJhdyB0cmFuc2llbnQgcGl4ZWwgZGF0YVxuICAgIGRyYXdQaXhlbExheWVyPy4ocHhDdHgpXG5cbiAgICAvLyBjbGVhciB0YXJnZXQgY2FudmFzXG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KVxuXG4gICAgLy8gRHJhdyBwaXhlbCBidWZmZXIgc2NhbGVkIG9udG8gc2NyZWVuXG4gICAgY3R4LnNldFRyYW5zZm9ybShzY2FsZSwgMCwgMCwgc2NhbGUsIDAsIDApXG4gICAgY3R4LmRyYXdJbWFnZShweENhbnZhcywgMCwgMClcblxuICAgIC8vIERyYXcgb3ZlcmxheXMgaW4gc2NyZWVuIHNwYWNlXG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIGRyYXdTY3JlZW5MYXllcj8uKGN0eCwgc2NhbGUpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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==","/**\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 type PixelPatchTiles = {\n beforeTiles: PixelTile[];\n afterTiles: PixelTile[];\n};\nexport function applyPatchTiles(target: IPixelData32, tiles: PixelTile[], tileSize: number) {\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) continue;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBQaXhlbFRpbGUgfSBmcm9tICcuLi9QaXhlbFRpbGUvUGl4ZWxUaWxlJ1xuXG5leHBvcnQgdHlwZSBQaXhlbFBhdGNoVGlsZXMgPSB7XG4gIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXVxuICBhZnRlclRpbGVzOiBQaXhlbFRpbGVbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXRjaFRpbGVzKHRhcmdldDogSVBpeGVsRGF0YTMyLCB0aWxlczogUGl4ZWxUaWxlW10sIHRpbGVTaXplOiBudW1iZXIpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRpbGUgPSB0aWxlc1tpXVxuXG4gICAgaWYgKCF0aWxlKSBjb250aW51ZVxuXG4gICAgY29uc3QgZHN0ID0gdGFyZ2V0LmRhdGEzMlxuICAgIGNvbnN0IHNyYyA9IHRpbGUuZGF0YTMyXG4gICAgY29uc3QgZHN0V2lkdGggPSB0YXJnZXQud2lkdGhcbiAgICBjb25zdCBkc3RIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0XG4gICAgY29uc3Qgc3RhcnRYID0gdGlsZS50eCAqIHRpbGVTaXplXG4gICAgY29uc3Qgc3RhcnRZID0gdGlsZS50eSAqIHRpbGVTaXplXG5cbiAgICAvLyBDYWxjdWxhdGUgY2xhbXBpbmcgdG8gcHJldmVudCB3cmFwcGluZyBhcnRpZmFjdHMgb24gaW1hZ2UgZWRnZXNcbiAgICBjb25zdCBjb3B5V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aWxlU2l6ZSwgZHN0V2lkdGggLSBzdGFydFgpKVxuXG4gICAgaWYgKGNvcHlXaWR0aCA8PSAwKSBjb250aW51ZVxuXG4gICAgZm9yIChsZXQgbHkgPSAwOyBseSA8IHRpbGVTaXplOyBseSsrKSB7XG4gICAgICBjb25zdCBnbG9iYWxZID0gc3RhcnRZICsgbHlcblxuICAgICAgLy8gU3RvcCBpZiB3ZSBnbyBiZWxvdyB0aGUgaW1hZ2VcbiAgICAgIGlmIChnbG9iYWxZID49IGRzdEhlaWdodCkgYnJlYWtcblxuICAgICAgY29uc3QgZHN0SW5kZXggPSBnbG9iYWxZICogZHN0V2lkdGggKyBzdGFydFhcbiAgICAgIGNvbnN0IHNyY0luZGV4ID0gbHkgKiB0aWxlU2l6ZVxuICAgICAgY29uc3Qgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpXG5cbiAgICAgIGRzdC5zZXQocm93RGF0YSwgZHN0SW5kZXgpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { applyPatchTiles } from './PixelPatchTiles';\nexport interface HistoryAction {\n undo: () => void;\n redo: () => void;\n dispose?: () => void;\n}\nexport type HistoryActionFactory = typeof makeHistoryAction;\nexport function makeHistoryAction(writer: PixelWriter<any>, patch: PixelPatchTiles, after?: () => void, afterUndo?: () => void, afterRedo?: () => void, applyPatchTilesFn = applyPatchTiles): HistoryAction {\n const target = writer.config.target;\n const tileSize = writer.config.tileSize;\n const accumulator = writer.accumulator;\n return {\n undo: () => {\n applyPatchTilesFn(target, patch.beforeTiles, tileSize);\n afterUndo?.();\n after?.();\n },\n redo: () => {\n applyPatchTilesFn(target, patch.afterTiles, tileSize);\n afterRedo?.();\n after?.();\n },\n dispose: () => accumulator.recyclePatch(patch)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBwbHlQYXRjaFRpbGVzLCB0eXBlIFBpeGVsUGF0Y2hUaWxlcyB9IGZyb20gJy4vUGl4ZWxQYXRjaFRpbGVzJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4vUGl4ZWxXcml0ZXInXG5cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yeUFjdGlvbiB7XG4gIHVuZG86ICgpID0+IHZvaWRcbiAgcmVkbzogKCkgPT4gdm9pZFxuICBkaXNwb3NlPzogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgdHlwZSBIaXN0b3J5QWN0aW9uRmFjdG9yeSA9IHR5cGVvZiBtYWtlSGlzdG9yeUFjdGlvblxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUhpc3RvcnlBY3Rpb24oXG4gIHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PixcbiAgcGF0Y2g6IFBpeGVsUGF0Y2hUaWxlcyxcbiAgYWZ0ZXI/OiAoKSA9PiB2b2lkLFxuICBhZnRlclVuZG8/OiAoKSA9PiB2b2lkLFxuICBhZnRlclJlZG8/OiAoKSA9PiB2b2lkLFxuICBhcHBseVBhdGNoVGlsZXNGbiA9IGFwcGx5UGF0Y2hUaWxlcyxcbik6IEhpc3RvcnlBY3Rpb24ge1xuXG4gIGNvbnN0IHRhcmdldCA9IHdyaXRlci5jb25maWcudGFyZ2V0XG4gIGNvbnN0IHRpbGVTaXplID0gd3JpdGVyLmNvbmZpZy50aWxlU2l6ZVxuICBjb25zdCBhY2N1bXVsYXRvciA9IHdyaXRlci5hY2N1bXVsYXRvclxuXG4gIHJldHVybiB7XG4gICAgdW5kbzogKCkgPT4ge1xuICAgICAgYXBwbHlQYXRjaFRpbGVzRm4odGFyZ2V0LCBwYXRjaC5iZWZvcmVUaWxlcywgdGlsZVNpemUpXG4gICAgICBhZnRlclVuZG8/LigpXG4gICAgICBhZnRlcj8uKClcbiAgICB9LFxuICAgIHJlZG86ICgpID0+IHtcbiAgICAgIGFwcGx5UGF0Y2hUaWxlc0ZuKHRhcmdldCwgcGF0Y2guYWZ0ZXJUaWxlcywgdGlsZVNpemUpXG4gICAgICBhZnRlclJlZG8/LigpXG4gICAgICBhZnRlcj8uKClcbiAgICB9LFxuICAgIGRpc3Bvc2U6ICgpID0+IGFjY3VtdWxhdG9yLnJlY3ljbGVQYXRjaChwYXRjaCksXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export class HistoryManager {\n readonly undoStack: HistoryAction[];\n readonly redoStack: HistoryAction[];\n readonly 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5QWN0aW9uIH0gZnJvbSAnLi9IaXN0b3J5QWN0aW9uJ1xuXG5leHBvcnQgY2xhc3MgSGlzdG9yeU1hbmFnZXIge1xuICByZWFkb25seSB1bmRvU3RhY2s6IEhpc3RvcnlBY3Rpb25bXVxuICByZWFkb25seSByZWRvU3RhY2s6IEhpc3RvcnlBY3Rpb25bXVxuICByZWFkb25seSBsaXN0ZW5lcnM6IFNldDwoKSA9PiB2b2lkPlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtYXhTdGVwcyA9IDUwLFxuICApIHtcbiAgICB0aGlzLnVuZG9TdGFjayA9IFtdXG4gICAgdGhpcy5yZWRvU3RhY2sgPSBbXVxuICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IFNldCgpXG4gIH1cblxuICBnZXQgY2FuVW5kbygpIHtcbiAgICByZXR1cm4gdGhpcy51bmRvU3RhY2subGVuZ3RoID4gMFxuICB9XG5cbiAgZ2V0IGNhblJlZG8oKSB7XG4gICAgcmV0dXJuIHRoaXMucmVkb1N0YWNrLmxlbmd0aCA+IDBcbiAgfVxuXG4gIHN1YnNjcmliZShmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMubGlzdGVuZXJzLmFkZChmbilcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGZuKVxuICB9XG5cbiAgbm90aWZ5KCkge1xuICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGZuKSA9PiBmbigpKVxuICB9XG5cbiAgY29tbWl0KGFjdGlvbjogSGlzdG9yeUFjdGlvbikge1xuICAgIHRoaXMudW5kb1N0YWNrLnB1c2goYWN0aW9uKVxuICAgIHRoaXMuY2xlYXJSZWRvU3RhY2soKVxuXG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMubWF4U3RlcHMpIHtcbiAgICAgIHRoaXMudW5kb1N0YWNrLnNoaWZ0KCk/LmRpc3Bvc2U/LigpXG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZnkoKVxuICB9XG5cbiAgdW5kbygpIHtcbiAgICBsZXQgYWN0aW9uID0gdGhpcy51bmRvU3RhY2sucG9wKClcblxuICAgIGlmICghYWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMucmVkb1N0YWNrLnB1c2goYWN0aW9uKVxuICAgIGFjdGlvbi51bmRvKClcblxuICAgIHRoaXMubm90aWZ5KClcbiAgfVxuXG4gIHJlZG8oKSB7XG4gICAgbGV0IGFjdGlvbiA9IHRoaXMucmVkb1N0YWNrLnBvcCgpXG5cbiAgICBpZiAoIWFjdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLnVuZG9TdGFjay5wdXNoKGFjdGlvbilcbiAgICBhY3Rpb24ucmVkbygpXG5cbiAgICB0aGlzLm5vdGlmeSgpXG4gIH1cblxuICBjbGVhclJlZG9TdGFjaygpIHtcbiAgICBsZXQgbGVuZ3RoID0gdGhpcy5yZWRvU3RhY2subGVuZ3RoXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYWN0aW9uID0gdGhpcy5yZWRvU3RhY2tbaV1cblxuICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICBhY3Rpb24uZGlzcG9zZT8uKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlZG9TdGFjay5sZW5ndGggPSAwXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { applyPatchTiles } from './PixelPatchTiles';\nexport type DidChangeFn = (didChange: boolean) => boolean;\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[];\n public beforeTiles: PixelTile[];\n constructor(readonly config: PixelEngineConfig, readonly tilePool: PixelTilePool) {\n this.lookup = [];\n this.beforeTiles = [];\n }\n recyclePatch(patch: PixelPatchTiles) {\n this.tilePool.releaseTiles(patch.beforeTiles);\n this.tilePool.releaseTiles(patch.afterTiles);\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storePixelBeforeState(x: number, y: number): DidChangeFn {\n const shift = this.config.tileShift;\n const columns = this.config.targetColumns;\n const tx = x >> shift;\n const ty = y >> shift;\n const id = ty * columns + tx;\n let tile = this.lookup[id];\n let added = false;\n if (!tile) {\n tile = this.tilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n added = true;\n }\n return (didChange: boolean) => {\n if (!didChange && added) {\n this.beforeTiles.pop();\n this.lookup[id] = undefined;\n this.tilePool.releaseTile(tile!);\n }\n return didChange;\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): DidChangeFn {\n const shift = this.config.tileShift;\n const columns = this.config.targetColumns;\n const startX = x >> shift;\n const startY = y >> shift;\n const endX = x + w - 1 >> shift;\n const endY = y + h - 1 >> shift;\n const startIndex = this.beforeTiles.length;\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n const id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.tilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n }\n return (didChange: boolean) => {\n if (!didChange) {\n const length = this.beforeTiles.length;\n for (let i = startIndex; i < length; i++) {\n let t = this.beforeTiles[i];\n if (t) {\n this.lookup[t.id] = undefined;\n this.tilePool.releaseTile(t);\n }\n }\n this.beforeTiles.length = startIndex;\n }\n return didChange;\n };\n }\n storeTileBeforeState(id: number, tx: number, ty: number): DidChangeFn {\n let tile = this.lookup[id];\n let added = false;\n if (!tile) {\n tile = this.tilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n added = true;\n }\n return (didChange: boolean) => {\n if (!didChange && added) {\n this.beforeTiles.pop();\n this.lookup[id] = undefined;\n this.tilePool.releaseTile(tile!);\n }\n return didChange;\n };\n }\n extractState(tile: PixelTile) {\n const target = this.config.target;\n const TILE_SIZE = this.config.tileSize;\n const dst = tile.data32;\n const src = target.data32;\n const startX = tile.tx * TILE_SIZE;\n const startY = tile.ty * TILE_SIZE;\n const targetWidth = target.width;\n const targetHeight = target.height;\n\n // If the tile is completely outside the canvas, zero it out.\n if (startX >= targetWidth || startX + TILE_SIZE <= 0 || startY >= targetHeight || startY + TILE_SIZE <= 0) {\n dst.fill(0);\n return;\n }\n\n // Calculate offset if tile starts off the left side of the screen\n let srcOffsetX = Math.max(0, -startX);\n let copyWidth = Math.max(0, Math.min(TILE_SIZE - srcOffsetX, targetWidth - Math.max(0, startX)));\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly;\n let dstIndex = ly * TILE_SIZE;\n\n // Check negative bounds accurately\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE);\n continue;\n }\n let srcIndex = globalY * targetWidth + Math.max(0, startX);\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n\n // Shift the paste over by the offset\n dst.set(rowData, dstIndex + srcOffsetX);\n\n // Pad the left edge with 0s if we hung off the left side\n if (srcOffsetX > 0) {\n dst.fill(0, dstIndex, dstIndex + srcOffsetX);\n }\n\n // Pad the right edge with 0s if we hung off the right side\n if (srcOffsetX + copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + srcOffsetX + copyWidth, dstIndex + TILE_SIZE);\n }\n }\n }\n extractPatch(): PixelPatchTiles {\n const afterTiles: PixelTile[] = [];\n const 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.tilePool.getTile(beforeTile.id, beforeTile.tx, beforeTile.ty);\n this.extractState(afterTile);\n afterTiles.push(afterTile);\n }\n }\n const beforeTiles = this.beforeTiles;\n this.beforeTiles = [];\n this.lookup.length = 0;\n return {\n beforeTiles,\n afterTiles\n };\n }\n rollbackAfterError() {\n const target = this.config.target;\n const tileSize = this.config.tileSize;\n const length = this.beforeTiles.length;\n applyPatchTiles(target, this.beforeTiles, tileSize);\n for (let i = 0; i < length; i++) {\n let tile = this.beforeTiles[i];\n if (tile) {\n this.lookup[tile.id] = undefined;\n this.tilePool.releaseTile(tile);\n }\n }\n this.beforeTiles.length = 0;\n this.lookup.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxUaWxlIH0gZnJvbSAnLi4vUGl4ZWxUaWxlL1BpeGVsVGlsZSdcbmltcG9ydCB0eXBlIHsgUGl4ZWxUaWxlUG9vbCB9IGZyb20gJy4uL1BpeGVsVGlsZS9QaXhlbFRpbGVQb29sJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vUGl4ZWxFbmdpbmVDb25maWcnXG5pbXBvcnQgeyBhcHBseVBhdGNoVGlsZXMsIHR5cGUgUGl4ZWxQYXRjaFRpbGVzIH0gZnJvbSAnLi9QaXhlbFBhdGNoVGlsZXMnXG5cbmV4cG9ydCB0eXBlIERpZENoYW5nZUZuID0gKGRpZENoYW5nZTogYm9vbGVhbikgPT4gYm9vbGVhblxuXG5leHBvcnQgY2xhc3MgUGl4ZWxBY2N1bXVsYXRvciB7XG4gIHB1YmxpYyBsb29rdXA6IChQaXhlbFRpbGUgfCB1bmRlZmluZWQpW11cbiAgcHVibGljIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsXG4gICAgcmVhZG9ubHkgdGlsZVBvb2w6IFBpeGVsVGlsZVBvb2wsXG4gICkge1xuICAgIHRoaXMubG9va3VwID0gW11cbiAgICB0aGlzLmJlZm9yZVRpbGVzID0gW11cbiAgfVxuXG4gIHJlY3ljbGVQYXRjaChwYXRjaDogUGl4ZWxQYXRjaFRpbGVzKSB7XG4gICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYmVmb3JlVGlsZXMpXG4gICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYWZ0ZXJUaWxlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geCBwaXhlbCB4IGNvb3JkaW5hdGVcbiAgICogQHBhcmFtIHkgcGl4ZWwgeSBjb29yZGluYXRlXG4gICAqL1xuICBzdG9yZVBpeGVsQmVmb3JlU3RhdGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBEaWRDaGFuZ2VGbiB7XG4gICAgY29uc3Qgc2hpZnQgPSB0aGlzLmNvbmZpZy50aWxlU2hpZnRcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWcudGFyZ2V0Q29sdW1uc1xuICAgIGNvbnN0IHR4ID0geCA+PiBzaGlmdFxuICAgIGNvbnN0IHR5ID0geSA+PiBzaGlmdFxuICAgIGNvbnN0IGlkID0gdHkgKiBjb2x1bW5zICsgdHhcblxuICAgIGxldCB0aWxlID0gdGhpcy5sb29rdXBbaWRdXG4gICAgbGV0IGFkZGVkID0gZmFsc2VcblxuICAgIGlmICghdGlsZSkge1xuICAgICAgdGlsZSA9IHRoaXMudGlsZVBvb2wuZ2V0VGlsZShpZCwgdHgsIHR5KVxuXG4gICAgICB0aGlzLmV4dHJhY3RTdGF0ZSh0aWxlKVxuICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZVxuICAgICAgdGhpcy5iZWZvcmVUaWxlcy5wdXNoKHRpbGUpXG4gICAgICBhZGRlZCA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gKGRpZENoYW5nZTogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKCFkaWRDaGFuZ2UgJiYgYWRkZWQpIHtcbiAgICAgICAgdGhpcy5iZWZvcmVUaWxlcy5wb3AoKVxuICAgICAgICB0aGlzLmxvb2t1cFtpZF0gPSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZSh0aWxlISlcbiAgICAgIH1cbiAgICAgIHJldHVybiBkaWRDaGFuZ2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHggcGl4ZWwgeCBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB5IHBpeGVsIHkgY29vcmRpbmF0ZVxuICAgKiBAcGFyYW0gdyBwaXhlbCB3aWR0aFxuICAgKiBAcGFyYW0gaCBwaXhlbCBoZWlnaHRcbiAgICovXG4gIHN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB3OiBudW1iZXIsXG4gICAgaDogbnVtYmVyLFxuICApOiBEaWRDaGFuZ2VGbiB7XG4gICAgY29uc3Qgc2hpZnQgPSB0aGlzLmNvbmZpZy50aWxlU2hpZnRcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWcudGFyZ2V0Q29sdW1uc1xuXG4gICAgY29uc3Qgc3RhcnRYID0geCA+PiBzaGlmdFxuICAgIGNvbnN0IHN0YXJ0WSA9IHkgPj4gc2hpZnRcbiAgICBjb25zdCBlbmRYID0gKHggKyB3IC0gMSkgPj4gc2hpZnRcbiAgICBjb25zdCBlbmRZID0gKHkgKyBoIC0gMSkgPj4gc2hpZnRcblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgZm9yIChsZXQgdHkgPSBzdGFydFk7IHR5IDw9IGVuZFk7IHR5KyspIHtcbiAgICAgIGZvciAobGV0IHR4ID0gc3RhcnRYOyB0eCA8PSBlbmRYOyB0eCsrKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdHkgKiBjb2x1bW5zICsgdHhcbiAgICAgICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICB0aWxlID0gdGhpcy50aWxlUG9vbC5nZXRUaWxlKGlkLCB0eCwgdHkpXG5cbiAgICAgICAgICB0aGlzLmV4dHJhY3RTdGF0ZSh0aWxlKVxuICAgICAgICAgIHRoaXMubG9va3VwW2lkXSA9IHRpbGVcbiAgICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoZGlkQ2hhbmdlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWRpZENoYW5nZSkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBsZXQgdCA9IHRoaXMuYmVmb3JlVGlsZXNbaV1cblxuICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0aGlzLmxvb2t1cFt0LmlkXSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZSh0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmVmb3JlVGlsZXMubGVuZ3RoID0gc3RhcnRJbmRleFxuICAgICAgfVxuICAgICAgcmV0dXJuIGRpZENoYW5nZVxuICAgIH1cbiAgfVxuXG4gIHN0b3JlVGlsZUJlZm9yZVN0YXRlKGlkOiBudW1iZXIsIHR4OiBudW1iZXIsIHR5OiBudW1iZXIpOiBEaWRDaGFuZ2VGbiB7XG4gICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cbiAgICBsZXQgYWRkZWQgPSBmYWxzZVxuXG4gICAgaWYgKCF0aWxlKSB7XG4gICAgICB0aWxlID0gdGhpcy50aWxlUG9vbC5nZXRUaWxlKGlkLCB0eCwgdHkpXG5cbiAgICAgIHRoaXMuZXh0cmFjdFN0YXRlKHRpbGUpXG4gICAgICB0aGlzLmxvb2t1cFtpZF0gPSB0aWxlXG4gICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSlcbiAgICAgIGFkZGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiAoZGlkQ2hhbmdlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWRpZENoYW5nZSAmJiBhZGRlZCkge1xuICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnBvcCgpXG4gICAgICAgIHRoaXMubG9va3VwW2lkXSA9IHVuZGVmaW5lZFxuICAgICAgICB0aGlzLnRpbGVQb29sLnJlbGVhc2VUaWxlKHRpbGUhKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRpZENoYW5nZVxuICAgIH1cbiAgfVxuXG4gIGV4dHJhY3RTdGF0ZSh0aWxlOiBQaXhlbFRpbGUpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbmZpZy50YXJnZXRcbiAgICBjb25zdCBUSUxFX1NJWkUgPSB0aGlzLmNvbmZpZy50aWxlU2l6ZVxuICAgIGNvbnN0IGRzdCA9IHRpbGUuZGF0YTMyXG4gICAgY29uc3Qgc3JjID0gdGFyZ2V0LmRhdGEzMlxuICAgIGNvbnN0IHN0YXJ0WCA9IHRpbGUudHggKiBUSUxFX1NJWkVcbiAgICBjb25zdCBzdGFydFkgPSB0aWxlLnR5ICogVElMRV9TSVpFXG4gICAgY29uc3QgdGFyZ2V0V2lkdGggPSB0YXJnZXQud2lkdGhcbiAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0XG5cbiAgICAvLyBJZiB0aGUgdGlsZSBpcyBjb21wbGV0ZWx5IG91dHNpZGUgdGhlIGNhbnZhcywgemVybyBpdCBvdXQuXG4gICAgaWYgKHN0YXJ0WCA+PSB0YXJnZXRXaWR0aCB8fCBzdGFydFggKyBUSUxFX1NJWkUgPD0gMCB8fCBzdGFydFkgPj0gdGFyZ2V0SGVpZ2h0IHx8IHN0YXJ0WSArIFRJTEVfU0laRSA8PSAwKSB7XG4gICAgICBkc3QuZmlsbCgwKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIG9mZnNldCBpZiB0aWxlIHN0YXJ0cyBvZmYgdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2NyZWVuXG4gICAgbGV0IHNyY09mZnNldFggPSBNYXRoLm1heCgwLCAtc3RhcnRYKVxuICAgIGxldCBjb3B5V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihUSUxFX1NJWkUgLSBzcmNPZmZzZXRYLCB0YXJnZXRXaWR0aCAtIE1hdGgubWF4KDAsIHN0YXJ0WCkpKVxuXG4gICAgZm9yIChsZXQgbHkgPSAwOyBseSA8IFRJTEVfU0laRTsgbHkrKykge1xuICAgICAgbGV0IGdsb2JhbFkgPSBzdGFydFkgKyBseVxuICAgICAgbGV0IGRzdEluZGV4ID0gbHkgKiBUSUxFX1NJWkVcblxuICAgICAgLy8gQ2hlY2sgbmVnYXRpdmUgYm91bmRzIGFjY3VyYXRlbHlcbiAgICAgIGlmIChnbG9iYWxZIDwgMCB8fCBnbG9iYWxZID49IHRhcmdldEhlaWdodCB8fCBjb3B5V2lkdGggPT09IDApIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXgsIGRzdEluZGV4ICsgVElMRV9TSVpFKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgc3JjSW5kZXggPSBnbG9iYWxZICogdGFyZ2V0V2lkdGggKyBNYXRoLm1heCgwLCBzdGFydFgpXG4gICAgICBsZXQgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpXG5cbiAgICAgIC8vIFNoaWZ0IHRoZSBwYXN0ZSBvdmVyIGJ5IHRoZSBvZmZzZXRcbiAgICAgIGRzdC5zZXQocm93RGF0YSwgZHN0SW5kZXggKyBzcmNPZmZzZXRYKVxuXG4gICAgICAvLyBQYWQgdGhlIGxlZnQgZWRnZSB3aXRoIDBzIGlmIHdlIGh1bmcgb2ZmIHRoZSBsZWZ0IHNpZGVcbiAgICAgIGlmIChzcmNPZmZzZXRYID4gMCkge1xuICAgICAgICBkc3QuZmlsbCgwLCBkc3RJbmRleCwgZHN0SW5kZXggKyBzcmNPZmZzZXRYKVxuICAgICAgfVxuXG4gICAgICAvLyBQYWQgdGhlIHJpZ2h0IGVkZ2Ugd2l0aCAwcyBpZiB3ZSBodW5nIG9mZiB0aGUgcmlnaHQgc2lkZVxuICAgICAgaWYgKHNyY09mZnNldFggKyBjb3B5V2lkdGggPCBUSUxFX1NJWkUpIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXggKyBzcmNPZmZzZXRYICsgY29weVdpZHRoLCBkc3RJbmRleCArIFRJTEVfU0laRSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHRyYWN0UGF0Y2goKTogUGl4ZWxQYXRjaFRpbGVzIHtcbiAgICBjb25zdCBhZnRlclRpbGVzOiBQaXhlbFRpbGVbXSA9IFtdXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5iZWZvcmVUaWxlcy5sZW5ndGhcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBiZWZvcmVUaWxlID0gdGhpcy5iZWZvcmVUaWxlc1tpXVxuXG4gICAgICBpZiAoYmVmb3JlVGlsZSkge1xuICAgICAgICBsZXQgYWZ0ZXJUaWxlID0gdGhpcy50aWxlUG9vbC5nZXRUaWxlKGJlZm9yZVRpbGUuaWQsIGJlZm9yZVRpbGUudHgsIGJlZm9yZVRpbGUudHkpXG5cbiAgICAgICAgdGhpcy5leHRyYWN0U3RhdGUoYWZ0ZXJUaWxlKVxuICAgICAgICBhZnRlclRpbGVzLnB1c2goYWZ0ZXJUaWxlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJlZm9yZVRpbGVzID0gdGhpcy5iZWZvcmVUaWxlc1xuICAgIHRoaXMuYmVmb3JlVGlsZXMgPSBbXVxuICAgIHRoaXMubG9va3VwLmxlbmd0aCA9IDBcblxuICAgIHJldHVybiB7XG4gICAgICBiZWZvcmVUaWxlcyxcbiAgICAgIGFmdGVyVGlsZXMsXG4gICAgfVxuICB9XG5cbiAgcm9sbGJhY2tBZnRlckVycm9yKCkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29uZmlnLnRhcmdldFxuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5jb25maWcudGlsZVNpemVcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgYXBwbHlQYXRjaFRpbGVzKHRhcmdldCwgdGhpcy5iZWZvcmVUaWxlcywgdGlsZVNpemUpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdGlsZSA9IHRoaXMuYmVmb3JlVGlsZXNbaV1cblxuICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5sb29rdXBbdGlsZS5pZF0gPSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZSh0aWxlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlVGlsZXMubGVuZ3RoID0gMFxuICAgIHRoaXMubG9va3VwLmxlbmd0aCA9IDBcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export class PixelEngineConfig {\n readonly tileSize: number;\n // pixelX = tileX << tileShift\n // pixelY = tileY << tileShift\n readonly tileShift: number;\n readonly tileMask: number;\n readonly tileArea: number;\n readonly target!: PixelData;\n readonly targetColumns: number = 0;\n readonly targetRows: number = 0;\n constructor(tileSize: number, target: PixelData) {\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 = 31 - Math.clz32(tileSize);\n this.tileMask = tileSize - 1;\n this.tileArea = tileSize * tileSize;\n this.target = target;\n this.targetColumns = target.width + this.tileMask >> this.tileShift;\n this.targetRows = target.height + this.tileMask >> this.tileShift;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQaXhlbERhdGEgfSBmcm9tICcuLi9QaXhlbERhdGEvUGl4ZWxEYXRhJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxFbmdpbmVDb25maWcge1xuICByZWFkb25seSB0aWxlU2l6ZTogbnVtYmVyXG4gIC8vIHBpeGVsWCA9IHRpbGVYIDw8IHRpbGVTaGlmdFxuICAvLyBwaXhlbFkgPSB0aWxlWSA8PCB0aWxlU2hpZnRcbiAgcmVhZG9ubHkgdGlsZVNoaWZ0OiBudW1iZXJcbiAgcmVhZG9ubHkgdGlsZU1hc2s6IG51bWJlclxuICByZWFkb25seSB0aWxlQXJlYTogbnVtYmVyXG4gIHJlYWRvbmx5IHRhcmdldCE6IFBpeGVsRGF0YVxuICByZWFkb25seSB0YXJnZXRDb2x1bW5zOiBudW1iZXIgPSAwXG4gIHJlYWRvbmx5IHRhcmdldFJvd3M6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3Rvcih0aWxlU2l6ZTogbnVtYmVyLCB0YXJnZXQ6IFBpeGVsRGF0YSkge1xuICAgIC8vIEVuc3VyZSBpdCdzIGEgcG93ZXIgb2YgMiB0byBndWFyYW50ZWUgYml0d2lzZSBtYXRoIHdvcmtzXG4gICAgaWYgKCh0aWxlU2l6ZSAmICh0aWxlU2l6ZSAtIDEpKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlU2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMicpXG4gICAgfVxuXG4gICAgdGhpcy50aWxlU2l6ZSA9IHRpbGVTaXplXG4gICAgdGhpcy50aWxlU2hpZnQgPSAzMSAtIE1hdGguY2x6MzIodGlsZVNpemUpXG4gICAgdGhpcy50aWxlTWFzayA9IHRpbGVTaXplIC0gMVxuICAgIHRoaXMudGlsZUFyZWEgPSB0aWxlU2l6ZSAqIHRpbGVTaXplXG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXRcbiAgICB0aGlzLnRhcmdldENvbHVtbnMgPSAodGFyZ2V0LndpZHRoICsgdGhpcy50aWxlTWFzaykgPj4gdGhpcy50aWxlU2hpZnRcbiAgICB0aGlzLnRhcmdldFJvd3MgPSAodGFyZ2V0LmhlaWdodCArIHRoaXMudGlsZU1hc2spID4+IHRoaXMudGlsZVNoaWZ0XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blends a solid color into a target pixel buffer.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelData(dst: IPixelData32, color: Color32, opts: ColorBlendOptions = {}): boolean {\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 false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\n\n // 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 const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return false;\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 false;\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 let didChange = false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const current = dst32[dIdx] as Color32;\n const next = blendFn(finalSrcColor, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n }\n dIdx += dStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIENvbG9yQmxlbmRPcHRpb25zLCB0eXBlIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG4vKipcbiAqIEJsZW5kcyBhIHNvbGlkIGNvbG9yIGludG8gYSB0YXJnZXQgcGl4ZWwgYnVmZmVyLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgY29sb3I6IENvbG9yMzIsXG4gIG9wdHM6IENvbG9yQmxlbmRPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGJhc2VTcmNBbHBoYSA9IChjb2xvciA+Pj4gMjQpXG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gKGJsZW5kRm4gYXMgYW55KS5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuXG4gIGlmIChiYXNlU3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2VcblxuICAvLyBDbGlwcGluZ1xuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG5cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIC8vIFNpbmdsZS1jb2xvciBmaWxscyBjYW4gcHJlLWNhbGN1bGF0ZSB0aGUgc291cmNlIGNvbG9yIG9uY2VcbiAgbGV0IGZpbmFsU3JjQ29sb3IgPSBjb2xvclxuXG4gIGlmIChnbG9iYWxBbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGEgPSAoYmFzZVNyY0FscGhhICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVybiBmYWxzZVxuICAgIGZpbmFsU3JjQ29sb3IgPSAoKGNvbG9yICYgMHgwMGZmZmZmZikgfCAoYSA8PCAyNCkpID4+PiAwIGFzIENvbG9yMzJcbiAgfVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3QgbmV4dCA9IGJsZW5kRm4oZmluYWxTcmNDb2xvciwgY3VycmVudClcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZVxuICB9XG5cbiAgcmV0dXJuIGRpZENoYW5nZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 = {}): boolean {\n const target = writer.config.target;\n const {\n x = 0,\n y = 0,\n w = target.width,\n h = target.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendColorPixelData(target, color, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBDb2xvckJsZW5kT3B0aW9ucywgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHsgYmxlbmRDb2xvclBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JCbGVuZENvbG9yID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YSA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBibGVuZENvbG9yKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBvcHRzOiBDb2xvckJsZW5kT3B0aW9ucyA9IHt9LFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gdGFyZ2V0LndpZHRoLFxuICAgICAgICBoID0gdGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuICAgICAgcmV0dXJuIGRpZENoYW5nZShcbiAgICAgICAgYmxlbmRDb2xvclBpeGVsRGF0YSh0YXJnZXQsIGNvbG9yLCBvcHRzKSxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixel(target: IPixelData32, x: number, y: number, color: Color32, alpha: number = 255, blendFn: BlendColor32 = sourceOverPerfect): boolean {\n if (alpha === 0) return false;\n let width = target.width;\n let height = target.height;\n if (x < 0 || x >= width || y < 0 || y >= height) return false;\n let srcAlpha = color >>> 24;\n let isOverwrite = blendFn.isOverwrite;\n\n // Early exit for transparent source unless we are in an overwrite mode\n if (srcAlpha === 0 && !isOverwrite) return false;\n let dst32 = target.data32;\n let index = y * width + x;\n let finalColor = color;\n if (alpha !== 255) {\n let finalAlpha = srcAlpha * alpha + 128 >> 8;\n if (finalAlpha === 0 && !isOverwrite) return false;\n finalColor = (color & 0x00ffffff | finalAlpha << 24) >>> 0 as Color32;\n }\n let current = dst32[index] as Color32;\n let next = blendFn(finalColor, current);\n if (current !== next) {\n dst32[index] = next;\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbChcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhMzIsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBjb2xvcjogQ29sb3IzMixcbiAgYWxwaGE6IG51bWJlciA9IDI1NSxcbiAgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QsXG4pOiBib29sZWFuIHtcbiAgaWYgKGFscGhhID09PSAwKSByZXR1cm4gZmFsc2VcblxuICBsZXQgd2lkdGggPSB0YXJnZXQud2lkdGhcbiAgbGV0IGhlaWdodCA9IHRhcmdldC5oZWlnaHRcblxuICBpZiAoeCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5IDwgMCB8fCB5ID49IGhlaWdodCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHNyY0FscGhhID0gY29sb3IgPj4+IDI0XG4gIGxldCBpc092ZXJ3cml0ZSA9IGJsZW5kRm4uaXNPdmVyd3JpdGVcblxuICAvLyBFYXJseSBleGl0IGZvciB0cmFuc3BhcmVudCBzb3VyY2UgdW5sZXNzIHdlIGFyZSBpbiBhbiBvdmVyd3JpdGUgbW9kZVxuICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2VcblxuICBsZXQgZHN0MzIgPSB0YXJnZXQuZGF0YTMyXG4gIGxldCBpbmRleCA9IHkgKiB3aWR0aCArIHhcbiAgbGV0IGZpbmFsQ29sb3IgPSBjb2xvclxuXG4gIGlmIChhbHBoYSAhPT0gMjU1KSB7XG4gICAgbGV0IGZpbmFsQWxwaGEgPSAoc3JjQWxwaGEgKiBhbHBoYSArIDEyOCkgPj4gOFxuXG4gICAgaWYgKGZpbmFsQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2VcblxuICAgIGZpbmFsQ29sb3IgPSAoKChjb2xvciAmIDB4MDBmZmZmZmYpIHwgKGZpbmFsQWxwaGEgPDwgMjQpKSA+Pj4gMCkgYXMgQ29sb3IzMlxuICB9XG5cbiAgbGV0IGN1cnJlbnQgPSBkc3QzMltpbmRleF0gYXMgQ29sb3IzMlxuICBsZXQgbmV4dCA9IGJsZW5kRm4oZmluYWxDb2xvciwgY3VycmVudClcblxuICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgIGRzdDMyW2luZGV4XSA9IG5leHRcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { HistoryMutator } from '../../_types';\nimport { blendPixel } from '../../PixelData/blendPixel';\nconst defaults = {\n blendPixel\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixel = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixel = defaults.blendPixel\n } = deps;\n return {\n blendPixel(x: number, y: number, color: Color32, alpha?: number, blendFn?: BlendColor32): boolean {\n const didChange = writer.accumulator.storePixelBeforeState(x, y);\n return didChange(blendPixel(writer.config.target, x, y, color, alpha, blendFn));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYmxlbmRQaXhlbCB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGJsZW5kUGl4ZWwgfVxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRQaXhlbCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBQYXJ0aWFsPERlcHM+ID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kUGl4ZWwgPSBkZWZhdWx0cy5ibGVuZFBpeGVsLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYmxlbmRQaXhlbChcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlcixcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgYWxwaGE/OiBudW1iZXIsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICk6IGJvb2xlYW4ge1xuXG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVQaXhlbEJlZm9yZVN0YXRlKHgsIHkpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGJsZW5kUGl4ZWwod3JpdGVyLmNvbmZpZy50YXJnZXQsIHgsIHksIGNvbG9yLCBhbHBoYSwgYmxlbmRGbiksXG4gICAgICApXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cblxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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: IPixelData32, src: IPixelData32, opts: PixelBlendOptions = {}): boolean {\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 false;\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 false;\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 let didChange = false;\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 const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIElQaXhlbERhdGEzMiwgdHlwZSBQaXhlbEJsZW5kT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG4vKipcbiAqIEJsaXRzIHNvdXJjZSBQaXhlbERhdGEgaW50byBhIGRlc3RpbmF0aW9uIFBpeGVsRGF0YSB1c2luZyAzMi1iaXQgaW50ZWdlciBiaXR3aXNlIGJsZW5kaW5nLlxuICogVGhpcyBmdW5jdGlvbiBieXBhc3NlcyBzdGFuZGFyZCBJbWFnZURhdGEgbGltaXRhdGlvbnMgYnkgb3BlcmF0aW5nIGRpcmVjdGx5IG9uXG4gKiBVaW50MzJBcnJheSB2aWV3cy4gSXQgc3VwcG9ydHMgdmFyaW91cyBibGVuZCBtb2RlcywgYmluYXJ5L2FscGhhIG1hc2tpbmcsIGFuZFxuICogYXV0b21hdGljIGNsaXBwaW5nIG9mIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBib3VuZHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRzdCA9IG5ldyBQaXhlbERhdGEoY3R4LmdldEltYWdlRGF0YSgwLDAsMTAwLDEwMCkpXG4gKiBibGVuZEltYWdlRGF0YTMyKGRzdCwgc3ByaXRlLCB7XG4gKiAgIGJsZW5kRm46IENPTE9SXzMyX0JMRU5EX01PREVTLm11bHRpcGx5LFxuICogICBtYXNrOiBicnVzaE1hc2ssXG4gKiAgIG1hc2tUeXBlOiBNYXNrVHlwZS5BTFBIQVxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIHNyYzogSVBpeGVsRGF0YTMyLFxuICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyA9IHt9LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICB4OiB0YXJnZXRYID0gMCxcbiAgICB5OiB0YXJnZXRZID0gMCxcbiAgICBzeDogc291cmNlWCA9IDAsXG4gICAgc3k6IHNvdXJjZVkgPSAwLFxuICAgIHc6IHdpZHRoID0gc3JjLndpZHRoLFxuICAgIGg6IGhlaWdodCA9IHNyYy5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZVxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHN4ID0gc291cmNlWFxuICBsZXQgc3kgPSBzb3VyY2VZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeFxuICAgIHcgKz0gc3hcbiAgICBzeCA9IDBcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeVxuICAgIGggKz0gc3lcbiAgICBzeSA9IDBcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpXG4gIGggPSBNYXRoLm1pbihoLCBzcmMuaGVpZ2h0IC0gc3kpXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBzcmMzMiA9IHNyYy5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgY29uc3Qgc3cgPSBzcmMud2lkdGhcblxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IHNJZHggPSAoc3kgKiBzdyArIHN4KSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNTdHJpZGUgPSAoc3cgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZVxuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IChzcmNDb2wgPj4+IDI0KVxuXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sXG4gICAgICBpZiAoIWlzT3BhcXVlKSB7XG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3QgbmV4dCA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dFxuICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZVxuICAgIHNJZHggKz0gc1N0cmlkZVxuICB9XG5cbiAgcmV0dXJuIGRpZENoYW5nZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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: IPixelData32, opts: PixelBlendOptions = {}): boolean {\n const {\n x = 0,\n y = 0,\n w = src.width,\n h = src.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelData(writer.config.target, src, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgSVBpeGVsRGF0YTMyLCBQaXhlbEJsZW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGJsZW5kUGl4ZWxEYXRhIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kUGl4ZWxEYXRhID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGEgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YSxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGJsZW5kUGl4ZWxEYXRhKFxuICAgICAgc3JjOiBJUGl4ZWxEYXRhMzIsXG4gICAgICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyA9IHt9LFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHcgPSBzcmMud2lkdGgsXG4gICAgICAgIGggPSBzcmMuaGVpZ2h0LFxuICAgICAgfSA9IG9wdHNcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGJsZW5kUGl4ZWxEYXRhKHdyaXRlci5jb25maWcudGFyZ2V0LCBzcmMsIG9wdHMpLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataAlphaMask(dst: IPixelData32, src: IPixelData32, alphaMask: AlphaMask, opts: PixelBlendMaskOptions = {}): boolean {\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 false;\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 false;\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 let didChange = 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 const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQ29sb3IzMiwgdHlwZSBJUGl4ZWxEYXRhMzIsIHR5cGUgUGl4ZWxCbGVuZE1hc2tPcHRpb25zIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBibGVuZFBpeGVsRGF0YUFscGhhTWFzayhcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIHNyYzogSVBpeGVsRGF0YTMyLFxuICBhbHBoYU1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogUGl4ZWxCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHN4OiBzb3VyY2VYID0gMCxcbiAgICBzeTogc291cmNlWSA9IDAsXG4gICAgdzogd2lkdGggPSBzcmMud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gc3JjLmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgc3ggPSBzb3VyY2VYXG4gIGxldCBzeSA9IHNvdXJjZVlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIC8vIDEuIENsaXBwaW5nIChNYXRjaGVzIG1haW4gYnJhbmNoIGJlaGF2aW9yKVxuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeFxuICAgIHcgKz0gc3hcbiAgICBzeCA9IDBcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeVxuICAgIGggKz0gc3lcbiAgICBzeSA9IDBcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpXG4gIGggPSBNYXRoLm1pbihoLCBzcmMuaGVpZ2h0IC0gc3kpXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIC8vIDIuIEluZGV4IFNldHVwXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IGFscGhhTWFzay53XG4gIGNvbnN0IG1hc2tEYXRhID0gYWxwaGFNYXNrLmRhdGFcblxuICAvLyBkeC9keSBpcyB0aGUgZGlzcGxhY2VtZW50IGZyb20gcmVxdWVzdGVkIHN0YXJ0IHRvIGNsaXBwZWQgc3RhcnQuXG4gIC8vIFRoaXMga2VlcHMgdGhlIG1hc2sgbG9ja2VkIHRvIHRoZSBzb3VyY2UgY29udGVudCBkdXJpbmcgY3Jvc3MtY2xpcHBpbmcuXG4gIGNvbnN0IGR4ID0gKHggLSB0YXJnZXRYKSB8IDBcbiAgY29uc3QgZHkgPSAoeSAtIHRhcmdldFkpIHwgMFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBzcmMzMiA9IHNyYy5kYXRhMzJcblxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IHNJZHggPSAoc3kgKiBzdyArIHN4KSB8IDBcbiAgbGV0IG1JZHggPSAoKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpKSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNTdHJpZGUgPSAoc3cgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcblxuICBjb25zdCBpc09wYXF1ZSA9IGdsb2JhbEFscGhhID09PSAyNTVcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSBibGVuZEZuLmlzT3ZlcndyaXRlIHx8IGZhbHNlXG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBtYXNrRGF0YVttSWR4XVxuICAgICAgY29uc3QgZWZmTSA9IGludmVydE1hc2sgPyAyNTUgLSBtVmFsIDogbVZhbFxuXG4gICAgICAvLyBFYXJseSBleGl0IGlmIG1hc2sgaXMgZnVsbHkgdHJhbnNwYXJlbnRcbiAgICAgIGlmIChlZmZNID09PSAwKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNyY0NvbCA9IHNyYzMyW3NJZHhdIGFzIENvbG9yMzJcbiAgICAgIGNvbnN0IHNyY0FscGhhID0gc3JjQ29sID4+PiAyNFxuXG4gICAgICAvLyBFYXJseSBleGl0IGlmIHNvdXJjZSBpcyBmdWxseSB0cmFuc3BhcmVudCAodW5sZXNzIG92ZXJ3cml0aW5nKVxuICAgICAgaWYgKHNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgd2VpZ2h0IHVzaW5nIGxpbmVhciBsb2dpYyAoRWFzaWVyIGZvciBKSVQgdGhhbiBuZXN0ZWQgdGVybmFyaWVzKVxuICAgICAgbGV0IHdlaWdodCA9IGdsb2JhbEFscGhhXG4gICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZWZmTVxuICAgICAgfSBlbHNlIGlmIChlZmZNICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gKGVmZk0gKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgfVxuXG4gICAgICAvLyBaZXJvLXdlaWdodCBzYWZldHkgY2hlY2tcbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIHNJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sXG4gICAgICBpZiAod2VpZ2h0IDwgMjU1KSB7XG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiB3ZWlnaHQgKyAxMjgpID4+IDhcbiAgICAgICAgLy8gRmluYWwgY2hlY2s6IHdlaWdodCBtaWdodCBoYXZlIHJlc3VsdGVkIGluIGEgdHJhbnNwYXJlbnQgcGl4ZWxcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrXG4gICAgICAgICAgc0lkeCsrXG4gICAgICAgICAgbUlkeCsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9ICgoc3JjQ29sICYgMHgwMGZmZmZmZikgfCAoYSA8PCAyNCkpID4+PiAwIGFzIENvbG9yMzJcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBuZXh0ID0gYmxlbmRGbihmaW5hbENvbCwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBzSWR4KytcbiAgICAgIG1JZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBzSWR4ICs9IHNTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxuXG4gIHJldHVybiBkaWRDaGFuZ2Vcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { HistoryMutator } from '../../_types';\nimport { blendPixelDataAlphaMask } from '../../PixelData/blendPixelDataAlphaMask';\nconst defaults = {\n blendPixelDataAlphaMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixelDataAlphaMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataAlphaMask = defaults.blendPixelDataAlphaMask\n } = deps;\n return {\n blendPixelDataAlphaMask(src: IPixelData32, mask: AlphaMask, opts: PixelBlendMaskOptions = {}): boolean {\n const x = opts.x ?? 0;\n const y = opts.y ?? 0;\n const w = opts.w ?? src.width;\n const h = opts.h ?? src.height;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelDataAlphaMask(writer.config.target, src, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIEhpc3RvcnlNdXRhdG9yLCBJUGl4ZWxEYXRhMzIsIFBpeGVsQmxlbmRNYXNrT3B0aW9ucyB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YUFscGhhTWFzayxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrKFxuICAgICAgc3JjOiBJUGl4ZWxEYXRhMzIsXG4gICAgICBtYXNrOiBBbHBoYU1hc2ssXG4gICAgICBvcHRzOiBQaXhlbEJsZW5kTWFza09wdGlvbnMgPSB7fSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzLnggPz8gMFxuICAgICAgY29uc3QgeSA9IG9wdHMueSA/PyAwXG4gICAgICBjb25zdCB3ID0gb3B0cy53ID8/IHNyYy53aWR0aFxuICAgICAgY29uc3QgaCA9IG9wdHMuaCA/PyBzcmMuaGVpZ2h0XG5cbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBzcmMsIG1hc2ssIG9wdHMpLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataBinaryMask(dst: IPixelData32, src: IPixelData32, binaryMask: BinaryMask, opts: PixelBlendMaskOptions = {}): boolean {\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 false;\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 false;\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 let didChange = 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 const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBJUGl4ZWxEYXRhMzIsIFBpeGVsQmxlbmRNYXNrT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgc3JjOiBJUGl4ZWxEYXRhMzIsXG4gIGJpbmFyeU1hc2s6IEJpbmFyeU1hc2ssXG4gIG9wdHM6IFBpeGVsQmxlbmRNYXNrT3B0aW9ucyA9IHt9LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICB4OiB0YXJnZXRYID0gMCxcbiAgICB5OiB0YXJnZXRZID0gMCxcbiAgICBzeDogc291cmNlWCA9IDAsXG4gICAgc3k6IHNvdXJjZVkgPSAwLFxuICAgIHc6IHdpZHRoID0gc3JjLndpZHRoLFxuICAgIGg6IGhlaWdodCA9IHNyYy5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBteCA9IDAsXG4gICAgbXkgPSAwLFxuICAgIGludmVydE1hc2sgPSBmYWxzZSxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZVxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHN4ID0gc291cmNlWFxuICBsZXQgc3kgPSBzb3VyY2VZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICAvLyAxLiBTb3VyY2UgQ2xpcHBpbmdcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3hcbiAgICB3ICs9IHN4XG4gICAgc3ggPSAwXG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3lcbiAgICBoICs9IHN5XG4gICAgc3kgPSAwXG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyYy53aWR0aCAtIHN4KVxuICBoID0gTWF0aC5taW4oaCwgc3JjLmhlaWdodCAtIHN5KVxuXG4gIC8vIDIuIERlc3RpbmF0aW9uIENsaXBwaW5nXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgLy8gMy4gQ29vcmRpbmF0ZSBEaXNwbGFjZW1lbnQgZm9yIE1hc2sgU3luY1xuICAvLyBkeC9keSByZXByZXNlbnRzIGhvdyBmYXIgdGhlIGNsaXBwZWQgc3RhcnQgaXMgZnJvbSB0aGUgcmVxdWVzdGVkIHN0YXJ0LlxuICAvLyBUaGlzIGlzIHRoZSBzdGFibGUgd2F5IHRvIGFsaWduIHRoZSBtYXNrIGFjcm9zcyBhbGwgY2xpcHBpbmcgcGVybXV0YXRpb25zLlxuICBjb25zdCBkeCA9ICh4IC0gdGFyZ2V0WCkgfCAwXG4gIGNvbnN0IGR5ID0gKHkgLSB0YXJnZXRZKSB8IDBcblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IGJpbmFyeU1hc2sud1xuICBjb25zdCBtYXNrRGF0YSA9IGJpbmFyeU1hc2suZGF0YVxuXG4gIGxldCBkSWR4ID0gKHkgKiBkdyArIHgpIHwgMFxuICBsZXQgc0lkeCA9IChzeSAqIHN3ICsgc3gpIHwgMFxuICBsZXQgbUlkeCA9ICgobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkpIHwgMFxuXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3Qgc1N0cmlkZSA9IChzdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBtU3RyaWRlID0gKG1QaXRjaCAtIGFjdHVhbFcpIHwgMFxuXG4gIGNvbnN0IHNraXBWYWwgPSBpbnZlcnRNYXNrID8gMSA6IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICAvLyBCaW5hcnkgTWFzayBDaGVjayAoRWFybGllc3QgZXhpdClcbiAgICAgIGlmIChtYXNrRGF0YVttSWR4XSA9PT0gc2tpcFZhbCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IHNyY0NvbCA+Pj4gMjRcblxuICAgICAgLy8gU291cmNlIEFscGhhIENoZWNrXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbENvbCA9IHNyY0NvbFxuICAgICAgaWYgKCFpc09wYXF1ZSkge1xuICAgICAgICAvLyBSb3VuZGluZy1jb3JyZWN0ZWQgZ2xvYmFsIGFscGhhIGFwcGxpY2F0aW9uXG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBtSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3QgbmV4dCA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dFxuICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgc0lkeCArPSBzU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cblxuICByZXR1cm4gZGlkQ2hhbmdlXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { blendPixelDataBinaryMask } from '../../PixelData/blendPixelDataBinaryMask';\nconst defaults = {\n blendPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixelDataBinaryMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataBinaryMask = defaults.blendPixelDataBinaryMask\n } = deps;\n return {\n blendPixelDataBinaryMask(src: IPixelData32, mask: BinaryMask, opts: PixelBlendMaskOptions = {}): boolean {\n const x = opts.x ?? 0;\n const y = opts.y ?? 0;\n const w = opts.w ?? src.width;\n const h = opts.h ?? src.height;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelDataBinaryMask(writer.config.target, src, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBIaXN0b3J5TXV0YXRvciwgSVBpeGVsRGF0YTMyLCBQaXhlbEJsZW5kTWFza09wdGlvbnMgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JCbGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2soXG4gICAgICBzcmM6IElQaXhlbERhdGEzMixcbiAgICAgIG1hc2s6IEJpbmFyeU1hc2ssXG4gICAgICBvcHRzOiBQaXhlbEJsZW5kTWFza09wdGlvbnMgPSB7fSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzLnggPz8gMFxuICAgICAgY29uc3QgeSA9IG9wdHMueSA/PyAwXG4gICAgICBjb25zdCB3ID0gb3B0cy53ID8/IHNyYy53aWR0aFxuICAgICAgY29uc3QgaCA9IG9wdHMuaCA/PyBzcmMuaGVpZ2h0XG5cbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgc3JjLCBtYXNrLCBvcHRzKSxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link IPixelData32} buffer with a solid color.\n * This function is faster than {@link fillPixelData} but does not\n * return a boolean value indicating changes were made.\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 fillPixelDataFast(dst: IPixelData32, 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 fillPixelDataFast(dst: IPixelData32, color: Color32, x: number, y: number, w: number, h: number): void;\nexport function fillPixelDataFast(dst: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBJUGl4ZWxEYXRhMzIsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfUkVDVCA9IG1ha2VDbGlwcGVkUmVjdCgpXG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb3IgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHtAbGluayBmaWxsUGl4ZWxEYXRhfSBidXQgZG9lcyBub3RcbiAqIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBjaGFuZ2VzIHdlcmUgbWFkZS5cbiAqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gcmVjdCAtIERlZmluZXMgdGhlIGFyZWEgdG8gZmlsbC4gSWYgb21pdHRlZCwgdGhlIGVudGlyZVxuICogYnVmZmVyIGlzIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGFGYXN0KFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgY29sb3I6IENvbG9yMzIsXG4gIHJlY3Q/OiBQYXJ0aWFsPFJlY3Q+LFxuKTogdm9pZFxuLyoqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gV2lkdGggb2YgdGhlIGZpbGwgYXJlYS5cbiAqIEBwYXJhbSBoIC0gSGVpZ2h0IG9mIHRoZSBmaWxsIGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhRmFzdChcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YUZhc3QoXG4gIGRzdDogSVBpeGVsRGF0YTMyLFxuICBjb2xvcjogQ29sb3IzMixcbiAgX3g/OiBQYXJ0aWFsPFJlY3Q+IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGxldCB4OiBudW1iZXJcbiAgbGV0IHk6IG51bWJlclxuICBsZXQgdzogbnVtYmVyXG4gIGxldCBoOiBudW1iZXJcblxuICBpZiAodHlwZW9mIF94ID09PSAnb2JqZWN0Jykge1xuICAgIHggPSBfeC54ID8/IDBcbiAgICB5ID0gX3gueSA/PyAwXG4gICAgdyA9IF94LncgPz8gZHN0LndpZHRoXG4gICAgaCA9IF94LmggPz8gZHN0LmhlaWdodFxuICB9IGVsc2UgaWYgKHR5cGVvZiBfeCA9PT0gJ251bWJlcicpIHtcbiAgICB4ID0gX3hcbiAgICB5ID0gX3khXG4gICAgdyA9IF93IVxuICAgIGggPSBfaCFcbiAgfSBlbHNlIHtcbiAgICB4ID0gMFxuICAgIHkgPSAwXG4gICAgdyA9IGRzdC53aWR0aFxuICAgIGggPSBkc3QuaGVpZ2h0XG4gIH1cblxuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh4LCB5LCB3LCBoLCBkc3Qud2lkdGgsIGRzdC5oZWlnaHQsIFNDUkFUQ0hfUkVDVClcblxuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVyblxuXG4gIC8vIFVzZSB0aGUgY2xpcHBlZCB2YWx1ZXNcbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuXG4gIC8vIE9wdGltaXphdGlvbjogSWYgZmlsbGluZyB0aGUgZW50aXJlIGJ1ZmZlciwgdXNlIHRoZSBuYXRpdmUgLmZpbGwoKVxuICBpZiAoYWN0dWFsVyA9PT0gZHcgJiYgYWN0dWFsSCA9PT0gZHN0LmhlaWdodCAmJiBmaW5hbFggPT09IDAgJiYgZmluYWxZID09PSAwKSB7XG4gICAgZHN0MzIuZmlsbChjb2xvcilcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFJvdy1ieS1yb3cgZmlsbCBmb3IgcGFydGlhbCByZWN0YW5nbGVzXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3Qgc3RhcnQgPSAoZmluYWxZICsgaXkpICogZHcgKyBmaW5hbFhcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGFjdHVhbFdcbiAgICBkc3QzMi5maWxsKGNvbG9yLCBzdGFydCwgZW5kKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32, HistoryMutator } from '../../_types';\nimport { fillPixelDataFast } from '../../PixelData/fillPixelDataFast';\nconst defaults = {\n fillPixelData: fillPixelDataFast\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<Rect> = {}) {\n const target = writer.config.target;\n const x = rect.x ?? 0;\n const y = rect.y ?? 0;\n const w = rect.w ?? target.width;\n const h = rect.h ?? target.height;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n fillPixelData(target, 0 as Color32, x, y, w, h);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciwgUmVjdCB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGFGYXN0IH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGFGYXN0J1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGZpbGxQaXhlbERhdGE6IGZpbGxQaXhlbERhdGFGYXN0IH1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQ2xlYXIgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YSxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGNsZWFyKFxuICAgICAgcmVjdDogUGFydGlhbDxSZWN0PiA9IHt9LFxuICAgICkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcbiAgICAgIGNvbnN0IHggPSByZWN0LnggPz8gMFxuICAgICAgY29uc3QgeSA9IHJlY3QueSA/PyAwXG4gICAgICBjb25zdCB3ID0gcmVjdC53ID8/IHRhcmdldC53aWR0aFxuICAgICAgY29uc3QgaCA9IHJlY3QuaCA/PyB0YXJnZXQuaGVpZ2h0XG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBmaWxsUGl4ZWxEYXRhKHRhcmdldCwgMCBhcyBDb2xvcjMyLCB4LCB5LCB3LCBoKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link IPixelData32} 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 * @returns true if any pixels were actually modified.\n */\nexport function fillPixelData(dst: IPixelData32, color: Color32, rect?: Partial<Rect>): boolean;\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: IPixelData32, color: Color32, x: number, y: number, w: number, h: number): boolean;\nexport function fillPixelData(dst: IPixelData32, color: Color32, _x?: Partial<Rect> | number, _y?: number, _w?: number, _h?: number): boolean {\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 false;\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 let hasChanged = false;\n for (let iy = 0; iy < actualH; iy++) {\n const rowOffset = (finalY + iy) * dw;\n const start = rowOffset + finalX;\n const end = start + actualW;\n for (let i = start; i < end; i++) {\n if (dst32[i] !== color) {\n dst32[i] = color;\n hasChanged = true;\n }\n }\n }\n return hasChanged;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBJUGl4ZWxEYXRhMzIsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfUkVDVCA9IG1ha2VDbGlwcGVkUmVjdCgpXG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb3IgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHJlY3QgLSBEZWZpbmVzIHRoZSBhcmVhIHRvIGZpbGwuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmVcbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICByZWN0PzogUGFydGlhbDxSZWN0Pixcbik6IGJvb2xlYW5cbi8qKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHggLSBTdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gdyAtIFdpZHRoIG9mIHRoZSBmaWxsIGFyZWEuXG4gKiBAcGFyYW0gaCAtIEhlaWdodCBvZiB0aGUgZmlsbCBhcmVhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiBib29sZWFuXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICBfeD86IFBhcnRpYWw8UmVjdD4gfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiBib29sZWFuIHtcbiAgbGV0IHg6IG51bWJlclxuICBsZXQgeTogbnVtYmVyXG4gIGxldCB3OiBudW1iZXJcbiAgbGV0IGg6IG51bWJlclxuXG4gIGlmICh0eXBlb2YgX3ggPT09ICdvYmplY3QnKSB7XG4gICAgeCA9IF94LnggPz8gMFxuICAgIHkgPSBfeC55ID8/IDBcbiAgICB3ID0gX3gudyA/PyBkc3Qud2lkdGhcbiAgICBoID0gX3guaCA/PyBkc3QuaGVpZ2h0XG4gIH0gZWxzZSBpZiAodHlwZW9mIF94ID09PSAnbnVtYmVyJykge1xuICAgIHggPSBfeFxuICAgIHkgPSBfeSFcbiAgICB3ID0gX3chXG4gICAgaCA9IF9oIVxuICB9IGVsc2Uge1xuICAgIHggPSAwXG4gICAgeSA9IDBcbiAgICB3ID0gZHN0LndpZHRoXG4gICAgaCA9IGRzdC5oZWlnaHRcbiAgfVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlUmVjdENsaXBwaW5nKFxuICAgIHgsXG4gICAgeSxcbiAgICB3LFxuICAgIGgsXG4gICAgZHN0LndpZHRoLFxuICAgIGRzdC5oZWlnaHQsXG4gICAgU0NSQVRDSF9SRUNULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCB7XG4gICAgeDogZmluYWxYLFxuICAgIHk6IGZpbmFsWSxcbiAgICB3OiBhY3R1YWxXLFxuICAgIGg6IGFjdHVhbEgsXG4gIH0gPSBjbGlwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGxldCBoYXNDaGFuZ2VkID0gZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IChmaW5hbFkgKyBpeSkgKiBkd1xuICAgIGNvbnN0IHN0YXJ0ID0gcm93T2Zmc2V0ICsgZmluYWxYXG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyBhY3R1YWxXXG5cbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgaWYgKGRzdDMyW2ldICE9PSBjb2xvcikge1xuICAgICAgICBkc3QzMltpXSA9IGNvbG9yXG4gICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc0NoYW5nZWRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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, x = 0, y = 0, w = writer.config.target.width, h = writer.config.target.height) {\n const target = writer.config.target;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(fillPixelData(target, color, x, y, w, h));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFillRect = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n fillRect(color: Color32, rect: Rect) {\n const target = writer.config.target;\n const didChange = writer.accumulator.storeRegionBeforeState(rect.x, rect.y, rect.w, rect.h);\n return didChange(fillPixelData(target, color, rect.x, rect.y, rect.w, rect.h));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciwgUmVjdCB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvZmlsbFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBmaWxsUGl4ZWxEYXRhIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YSxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGZpbGwoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHggPSAwLFxuICAgICAgeSA9IDAsXG4gICAgICB3ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQud2lkdGgsXG4gICAgICBoID0gd3JpdGVyLmNvbmZpZy50YXJnZXQuaGVpZ2h0LFxuICAgICkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcblxuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaClcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGZpbGxQaXhlbERhdGEodGFyZ2V0LCBjb2xvciwgeCwgeSwgdywgaCksXG4gICAgICApXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JGaWxsUmVjdCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZpbGxQaXhlbERhdGEgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgZmlsbFJlY3QoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHJlY3Q6IFJlY3QsXG4gICAgKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3cml0ZXIuY29uZmlnLnRhcmdldFxuXG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZShyZWN0LngsIHJlY3QueSwgcmVjdC53LCByZWN0LmgpXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKFxuICAgICAgICBmaWxsUGl4ZWxEYXRhKHRhcmdldCwgY29sb3IsIHJlY3QueCwgcmVjdC55LCByZWN0LncsIHJlY3QuaClcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region of the {@link IPixelData32} 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: IPixelData32, color: Color32, mask: BinaryMask, alpha = 255, x = 0, y = 0): boolean {\n if (alpha === 0) return false;\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 false;\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 let hasChanged = false;\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 const current = dst32[dstRowOffset + currentX];\n if (current !== finalCol) {\n dst32[dstRowOffset + currentX] = finalCol;\n hasChanged = true;\n }\n }\n }\n }\n return hasChanged;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfUkVDVCA9IG1ha2VDbGlwcGVkUmVjdCgpXG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb2YgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IgdXNpbmcgYSBtYXNrLlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIG1hc2sgLSBUaGUgbWFzayBkZWZpbmluZyB0aGUgYXJlYSB0byBmaWxsLlxuICogQHBhcmFtIGFscGhhIC0gVGhlIG92ZXJhbGwgb3BhY2l0eSBvZiB0aGUgZmlsbCAoMC0yNTUpLlxuICogQHBhcmFtIHggLSBTdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUgZm9yIHRoZSBtYXNrIHBsYWNlbWVudC5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZSBmb3IgdGhlIG1hc2sgcGxhY2VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2soXG4gIGRzdDogSVBpeGVsRGF0YTMyLFxuICBjb2xvcjogQ29sb3IzMixcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgYWxwaGEgPSAyNTUsXG4gIHggPSAwLFxuICB5ID0gMCxcbik6IGJvb2xlYW4ge1xuICBpZiAoYWxwaGEgPT09IDApIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IG1hc2tXID0gbWFzay53XG4gIGNvbnN0IG1hc2tIID0gbWFzay5oXG5cbiAgY29uc3QgY2xpcCA9IHJlc29sdmVSZWN0Q2xpcHBpbmcoXG4gICAgeCxcbiAgICB5LFxuICAgIG1hc2tXLFxuICAgIG1hc2tILFxuICAgIGRzdC53aWR0aCxcbiAgICBkc3QuaGVpZ2h0LFxuICAgIFNDUkFUQ0hfUkVDVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuXG4gIC8vIFByZS1jYWxjdWxhdGUgdGhlIGFscGhhLWFkanVzdGVkIGNvbG9yIG9uY2Ugb3V0c2lkZSB0aGUgbG9vcFxuICBsZXQgZmluYWxDb2wgPSBjb2xvclxuXG4gIGlmIChhbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGJhc2VTcmNBbHBoYSA9IGNvbG9yID4+PiAyNFxuICAgIGNvbnN0IGNvbG9yUkdCID0gY29sb3IgJiAweDAwZmZmZmZmXG4gICAgY29uc3QgYSA9IChiYXNlU3JjQWxwaGEgKiBhbHBoYSArIDEyOCkgPj4gOFxuXG4gICAgZmluYWxDb2wgPSAoKGNvbG9yUkdCIHwgKGEgPDwgMjQpKSA+Pj4gMCkgYXMgQ29sb3IzMlxuICB9XG5cbiAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3QgY3VycmVudFkgPSBmaW5hbFkgKyBpeVxuICAgIGNvbnN0IG1hc2tZID0gY3VycmVudFkgLSB5XG4gICAgY29uc3QgbWFza09mZnNldCA9IG1hc2tZICogbWFza1dcblxuICAgIGNvbnN0IGRzdFJvd09mZnNldCA9IGN1cnJlbnRZICogZHdcblxuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50WCA9IGZpbmFsWCArIGl4XG4gICAgICBjb25zdCBtYXNrWCA9IGN1cnJlbnRYIC0geFxuICAgICAgY29uc3QgbWFza0luZGV4ID0gbWFza09mZnNldCArIG1hc2tYXG5cbiAgICAgIGlmIChtYXNrRGF0YVttYXNrSW5kZXhdKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkc3RSb3dPZmZzZXQgKyBjdXJyZW50WF1cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IGZpbmFsQ29sKSB7XG4gICAgICAgICAgZHN0MzJbZHN0Um93T2Zmc2V0ICsgY3VycmVudFhdID0gZmluYWxDb2xcbiAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc0NoYW5nZWRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 const didChange = writer.accumulator.storeRegionBeforeState(x, y, mask.w, mask.h);\n return didChange(fillPixelDataBinaryMask(writer.config.target, color, mask, alpha, x, y));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGxCaW5hcnlNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGZpbGxCaW5hcnlNYXNrKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBtYXNrOiBCaW5hcnlNYXNrLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICB4ID0gMCxcbiAgICAgIHkgPSAwLFxuICAgICkge1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgbWFzay53LCBtYXNrLmgpXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKFxuICAgICAgICBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgY29sb3IsIG1hc2ssIGFscGhhLCB4LCB5KSxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\nexport function invertPixelData(pixelData: IPixelData32, opts: PixelMutateOptions = {}): boolean {\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 false;\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 return true;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhMzIsIHR5cGUgUGl4ZWxNdXRhdGVPcHRpb25zIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRSZWN0LCByZXNvbHZlUmVjdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX1JFQ1QgPSBtYWtlQ2xpcHBlZFJlY3QoKVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0UGl4ZWxEYXRhKFxuICBwaXhlbERhdGE6IElQaXhlbERhdGEzMixcbiAgb3B0czogUGl4ZWxNdXRhdGVPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZHN0ID0gcGl4ZWxEYXRhXG4gIGNvbnN0IHtcbiAgICB4OiB0YXJnZXRYID0gMCxcbiAgICB5OiB0YXJnZXRZID0gMCxcbiAgICB3OiB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aCxcbiAgICBoOiBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0LFxuICAgIG1hc2ssXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgY29uc3QgY2xpcCA9IHJlc29sdmVSZWN0Q2xpcHBpbmcodGFyZ2V0WCwgdGFyZ2V0WSwgd2lkdGgsIGhlaWdodCwgZHN0LndpZHRoLCBkc3QuaGVpZ2h0LCBTQ1JBVENIX1JFQ1QpXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHc6IGFjdHVhbFcsXG4gICAgaDogYWN0dWFsSCxcbiAgfSA9IGNsaXBcblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgY29uc3QgbVBpdGNoID0gbWFzaz8udyA/PyB3aWR0aFxuXG4gIGNvbnN0IGR4ID0geCAtIHRhcmdldFhcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WVxuXG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeFxuICBsZXQgbUlkeCA9IChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KVxuXG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGFjdHVhbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGFjdHVhbFdcblxuICAvLyBPcHRpbWl6YXRpb246IFNwbGl0IGxvb3BzIHRvIGF2b2lkIGNoZWNraW5nIGBpZiAobWFzaylgIGZvciBldmVyeSBwaXhlbC5cbiAgaWYgKG1hc2spIHtcbiAgICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuICAgIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF1cbiAgICAgICAgY29uc3QgaXNIaXQgPSBpbnZlcnRNYXNrXG4gICAgICAgICAgPyBtVmFsID09PSAwXG4gICAgICAgICAgOiBtVmFsID09PSAxXG5cbiAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgLy8gWE9SIHdpdGggMHgwMEZGRkZGRiBmbGlwcyBSR0IgYml0cyBhbmQgaWdub3JlcyBBbHBoYSAodGhlIHRvcCA4IGJpdHMpXG4gICAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkZcbiAgICAgICAgfVxuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICAgIG1JZHggKz0gbVN0cmlkZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkZcbiAgICAgICAgZElkeCsrXG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 target = writer.config.target;\n const {\n x = 0,\n y = 0,\n w = target.width,\n h = target.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(invertPixelData(target, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgUGl4ZWxNdXRhdGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgaW52ZXJ0UGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ludmVydFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBpbnZlcnRQaXhlbERhdGEgfVxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9ySW52ZXJ0ID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgaW52ZXJ0UGl4ZWxEYXRhID0gZGVmYXVsdHMuaW52ZXJ0UGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgaW52ZXJ0KG9wdHM6IFBpeGVsTXV0YXRlT3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3cml0ZXIuY29uZmlnLnRhcmdldFxuICAgICAgY29uc3Qge1xuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHcgPSB0YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB0YXJnZXQuaGVpZ2h0LFxuICAgICAgfSA9IG9wdHNcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGludmVydFBpeGVsRGF0YSh0YXJnZXQsIG9wdHMpLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { mutatorBlendColor } from './PixelMutator/mutatorBlendColor';\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel';\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData';\nimport { mutatorBlendPixelDataAlphaMask } from './PixelMutator/mutatorBlendPixelDataAlphaMask';\nimport { mutatorBlendPixelDataBinaryMask } from './PixelMutator/mutatorBlendPixelDataBinaryMask';\nimport { mutatorClear } from './PixelMutator/mutatorClear';\nimport { mutatorFill, mutatorFillRect } from './PixelMutator/mutatorFill';\nimport { mutatorFillBinaryMask } from './PixelMutator/mutatorFillBinaryMask';\nimport { mutatorInvert } from './PixelMutator/mutatorInvert';\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n // @sort\n ...mutatorBlendColor(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorBlendPixelDataAlphaMask(writer),\n ...mutatorBlendPixelDataBinaryMask(writer),\n ...mutatorClear(writer),\n ...mutatorFill(writer),\n ...mutatorFillBinaryMask(writer),\n ...mutatorFillRect(writer),\n ...mutatorInvert(writer)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbXV0YXRvckJsZW5kQ29sb3IgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRDb2xvcidcbmltcG9ydCB7IG11dGF0b3JCbGVuZFBpeGVsIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWwnXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGEnXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGFBbHBoYU1hc2snXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzaydcbmltcG9ydCB7IG11dGF0b3JDbGVhciB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JDbGVhcidcbmltcG9ydCB7IG11dGF0b3JGaWxsLCBtdXRhdG9yRmlsbFJlY3QgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbCdcbmltcG9ydCB7IG11dGF0b3JGaWxsQmluYXJ5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JGaWxsQmluYXJ5TWFzaydcbmltcG9ydCB7IG11dGF0b3JJbnZlcnQgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9ySW52ZXJ0J1xuaW1wb3J0IHR5cGUgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4vUGl4ZWxXcml0ZXInXG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRnVsbFBpeGVsTXV0YXRvcih3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4pIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBAc29ydFxuICAgIC4uLm11dGF0b3JCbGVuZENvbG9yKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kUGl4ZWwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGEod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGFBbHBoYU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckNsZWFyKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckZpbGwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yRmlsbEJpbmFyeU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yRmlsbFJlY3Qod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9ySW52ZXJ0KHdyaXRlciksXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\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=","// @__INLINE_MACRO__\nexport const macro_halfAndFloor = (value: number) => value >> 1;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQF9fSU5MSU5FX01BQ1JPX19cbmV4cG9ydCBjb25zdCBtYWNyb19oYWxmQW5kRmxvb3IgPSAodmFsdWU6IG51bWJlcikgPT4gdmFsdWUgPj4gMVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function trimRectBounds(x: number, y: number, w: number, h: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const left = Math.max(0, x);\n const top = Math.max(0, y);\n const right = Math.min(targetWidth, x + w);\n const bottom = Math.min(targetHeight, y + h);\n res.x = left;\n res.y = top;\n res.w = Math.max(0, right - left);\n res.h = Math.max(0, bottom - top);\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdHJpbVJlY3RCb3VuZHMoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbiAgdGFyZ2V0V2lkdGg6IG51bWJlcixcbiAgdGFyZ2V0SGVpZ2h0OiBudW1iZXIsXG4gIG91dD86IFJlY3QsXG4pOiBSZWN0IHtcbiAgY29uc3QgcmVzID0gb3V0ID8/IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGgubWF4KDAsIHgpXG4gIGNvbnN0IHRvcCA9IE1hdGgubWF4KDAsIHkpXG4gIGNvbnN0IHJpZ2h0ID0gTWF0aC5taW4odGFyZ2V0V2lkdGgsIHggKyB3KVxuICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih0YXJnZXRIZWlnaHQsIHkgKyBoKVxuXG4gIHJlcy54ID0gbGVmdFxuICByZXMueSA9IHRvcFxuICByZXMudyA9IE1hdGgubWF4KDAsIHJpZ2h0IC0gbGVmdClcbiAgcmVzLmggPSBNYXRoLm1heCgwLCBib3R0b20gLSB0b3ApXG5cbiAgcmV0dXJuIHJlc1xufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { forEachLinePoint } from '../Algorithm/forEachLinePoint';\nimport { macro_halfAndFloor } from '../Internal/helpers';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nexport class PaintBuffer {\n readonly lookup: (PixelTile | undefined)[];\n private readonly scratchBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n constructor(readonly config: PixelEngineConfig, readonly tilePool: PixelTilePool) {\n this.lookup = [];\n }\n private eachTileInBounds(bounds: Rect, callback: (tile: PixelTile, bX: number, bY: number, bW: number, bH: number) => void): void {\n const {\n tileShift,\n targetColumns,\n targetRows,\n tileSize\n } = this.config;\n const x1 = Math.max(0, bounds.x >> tileShift);\n const y1 = Math.max(0, bounds.y >> tileShift);\n const x2 = Math.min(targetColumns - 1, bounds.x + bounds.w - 1 >> tileShift);\n const y2 = Math.min(targetRows - 1, bounds.y + bounds.h - 1 >> tileShift);\n if (x1 > x2 || y1 > y2) return;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n for (let ty = y1; ty <= y2; ty++) {\n const rowOffset = ty * targetColumns;\n const tileTop = ty << tileShift;\n for (let tx = x1; tx <= x2; tx++) {\n const id = rowOffset + tx;\n const tile = lookup[id] ?? (lookup[id] = tilePool.getTile(id, tx, ty));\n const tileLeft = tx << tileShift;\n const startX = bounds.x > tileLeft ? bounds.x : tileLeft;\n const startY = bounds.y > tileTop ? bounds.y : tileTop;\n const maskEndX = bounds.x + bounds.w;\n const tileEndX = tileLeft + tileSize;\n const endX = maskEndX < tileEndX ? maskEndX : tileEndX;\n const maskEndY = bounds.y + bounds.h;\n const tileEndY = tileTop + tileSize;\n const endY = maskEndY < tileEndY ? maskEndY : tileEndY;\n callback(tile, startX, startY, endX - startX, endY - startY);\n }\n }\n }\n writePaintAlphaMaskStroke(color: Color32, brush: PaintAlphaMask, x0: number, y0: number, x1: number, y1: number): boolean {\n const cA = color >>> 24;\n if (cA === 0) return false;\n const {\n tileShift,\n tileMask,\n target\n } = this.config;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n const cRGB = color & 0x00ffffff;\n const scratch = this.scratchBounds;\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, bW, bH, target.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n const brushA = bD[bOff + (canvasX - topLeftX)];\n if (brushA === 0) continue;\n const t = cA * brushA + 128;\n const blendedA = t + (t >> 8) >> 8;\n const idx = dS + j;\n const cur = d32[idx];\n if (brushA > cur >>> 24) {\n const next = (cRGB | blendedA << 24) >>> 0;\n if (cur !== next) {\n d32[idx] = next as Color32;\n tileChanged = true;\n }\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n writePaintBinaryMaskStroke(color: Color32, brush: PaintBinaryMask, x0: number, y0: number, x1: number, y1: number): boolean {\n const alphaIsZero = color >>> 24 === 0;\n if (alphaIsZero) return false;\n const {\n tileShift,\n tileMask,\n target\n } = this.config;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n const scratch = this.scratchBounds;\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, bW, bH, target.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n if (bD[bOff + (canvasX - topLeftX)]) {\n const idx = dS + j;\n if (d32[idx] !== color) {\n d32[idx] = color;\n tileChanged = true;\n }\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n writeRectStroke(color: Color32, brushWidth: number, brushHeight: number, x0: number, y0: number, x1: number, y1: number): boolean {\n const alphaIsZero = color >>> 24 === 0;\n if (alphaIsZero) return false;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const scratch = this.scratchBounds;\n const centerOffsetX = macro_halfAndFloor(brushWidth - 1);\n const centerOffsetY = macro_halfAndFloor(brushHeight - 1);\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, brushWidth, brushHeight, target.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const idx = dS + j;\n if (d32[idx] !== color) {\n d32[idx] = color;\n tileChanged = true;\n }\n }\n }\n if (tileChanged) {\n changed = true;\n }\n });\n });\n return changed;\n }\n clear(): void {\n this.tilePool.releaseTiles(this.lookup);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBQYWludEFscGhhTWFzaywgUGFpbnRCaW5hcnlNYXNrLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZm9yRWFjaExpbmVQb2ludCB9IGZyb20gJy4uL0FsZ29yaXRobS9mb3JFYWNoTGluZVBvaW50J1xuaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4uL0hpc3RvcnkvUGl4ZWxFbmdpbmVDb25maWcnXG5pbXBvcnQgeyBtYWNyb19oYWxmQW5kRmxvb3IgfSBmcm9tICcuLi9JbnRlcm5hbC9oZWxwZXJzJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbFRpbGUgfSBmcm9tICcuLi9QaXhlbFRpbGUvUGl4ZWxUaWxlJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbFRpbGVQb29sIH0gZnJvbSAnLi4vUGl4ZWxUaWxlL1BpeGVsVGlsZVBvb2wnXG5pbXBvcnQgeyB0cmltUmVjdEJvdW5kcyB9IGZyb20gJy4uL1JlY3QvdHJpbVJlY3RCb3VuZHMnXG5cbmV4cG9ydCBjbGFzcyBQYWludEJ1ZmZlciB7XG4gIHJlYWRvbmx5IGxvb2t1cDogKFBpeGVsVGlsZSB8IHVuZGVmaW5lZClbXVxuICBwcml2YXRlIHJlYWRvbmx5IHNjcmF0Y2hCb3VuZHM6IFJlY3QgPSB7IHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsXG4gICAgcmVhZG9ubHkgdGlsZVBvb2w6IFBpeGVsVGlsZVBvb2wsXG4gICkge1xuICAgIHRoaXMubG9va3VwID0gW11cbiAgfVxuXG4gIHByaXZhdGUgZWFjaFRpbGVJbkJvdW5kcyhcbiAgICBib3VuZHM6IFJlY3QsXG4gICAgY2FsbGJhY2s6ICh0aWxlOiBQaXhlbFRpbGUsIGJYOiBudW1iZXIsIGJZOiBudW1iZXIsIGJXOiBudW1iZXIsIGJIOiBudW1iZXIpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgdGlsZVNoaWZ0LCB0YXJnZXRDb2x1bW5zLCB0YXJnZXRSb3dzLCB0aWxlU2l6ZSB9ID0gdGhpcy5jb25maWdcblxuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoMCwgYm91bmRzLnggPj4gdGlsZVNoaWZ0KVxuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoMCwgYm91bmRzLnkgPj4gdGlsZVNoaWZ0KVxuICAgIGNvbnN0IHgyID0gTWF0aC5taW4odGFyZ2V0Q29sdW1ucyAtIDEsIChib3VuZHMueCArIGJvdW5kcy53IC0gMSkgPj4gdGlsZVNoaWZ0KVxuICAgIGNvbnN0IHkyID0gTWF0aC5taW4odGFyZ2V0Um93cyAtIDEsIChib3VuZHMueSArIGJvdW5kcy5oIC0gMSkgPj4gdGlsZVNoaWZ0KVxuXG4gICAgaWYgKHgxID4geDIgfHwgeTEgPiB5MikgcmV0dXJuXG5cbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cFxuICAgIGNvbnN0IHRpbGVQb29sID0gdGhpcy50aWxlUG9vbFxuXG4gICAgZm9yIChsZXQgdHkgPSB5MTsgdHkgPD0geTI7IHR5KyspIHtcbiAgICAgIGNvbnN0IHJvd09mZnNldCA9IHR5ICogdGFyZ2V0Q29sdW1uc1xuICAgICAgY29uc3QgdGlsZVRvcCA9IHR5IDw8IHRpbGVTaGlmdFxuXG4gICAgICBmb3IgKGxldCB0eCA9IHgxOyB0eCA8PSB4MjsgdHgrKykge1xuICAgICAgICBjb25zdCBpZCA9IHJvd09mZnNldCArIHR4XG4gICAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaWRdID8/IChsb29rdXBbaWRdID0gdGlsZVBvb2wuZ2V0VGlsZShpZCwgdHgsIHR5KSlcbiAgICAgICAgY29uc3QgdGlsZUxlZnQgPSB0eCA8PCB0aWxlU2hpZnRcblxuICAgICAgICBjb25zdCBzdGFydFggPSBib3VuZHMueCA+IHRpbGVMZWZ0ID8gYm91bmRzLnggOiB0aWxlTGVmdFxuICAgICAgICBjb25zdCBzdGFydFkgPSBib3VuZHMueSA+IHRpbGVUb3AgPyBib3VuZHMueSA6IHRpbGVUb3BcblxuICAgICAgICBjb25zdCBtYXNrRW5kWCA9IGJvdW5kcy54ICsgYm91bmRzLndcbiAgICAgICAgY29uc3QgdGlsZUVuZFggPSB0aWxlTGVmdCArIHRpbGVTaXplXG4gICAgICAgIGNvbnN0IGVuZFggPSBtYXNrRW5kWCA8IHRpbGVFbmRYID8gbWFza0VuZFggOiB0aWxlRW5kWFxuXG4gICAgICAgIGNvbnN0IG1hc2tFbmRZID0gYm91bmRzLnkgKyBib3VuZHMuaFxuICAgICAgICBjb25zdCB0aWxlRW5kWSA9IHRpbGVUb3AgKyB0aWxlU2l6ZVxuICAgICAgICBjb25zdCBlbmRZID0gbWFza0VuZFkgPCB0aWxlRW5kWSA/IG1hc2tFbmRZIDogdGlsZUVuZFlcblxuICAgICAgICBjYWxsYmFjayh0aWxlLCBzdGFydFgsIHN0YXJ0WSwgZW5kWCAtIHN0YXJ0WCwgZW5kWSAtIHN0YXJ0WSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3cml0ZVBhaW50QWxwaGFNYXNrU3Ryb2tlKFxuICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgIGJydXNoOiBQYWludEFscGhhTWFzayxcbiAgICB4MDogbnVtYmVyLFxuICAgIHkwOiBudW1iZXIsXG4gICAgeDE6IG51bWJlcixcbiAgICB5MTogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBjQSA9IGNvbG9yID4+PiAyNFxuICAgIGlmIChjQSA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCB7IHRpbGVTaGlmdCwgdGlsZU1hc2ssIHRhcmdldCB9ID0gdGhpcy5jb25maWdcbiAgICBjb25zdCB7IHc6IGJXLCBoOiBiSCwgZGF0YTogYkQsIGNlbnRlck9mZnNldFgsIGNlbnRlck9mZnNldFkgfSA9IGJydXNoXG4gICAgY29uc3QgY1JHQiA9IGNvbG9yICYgMHgwMGZmZmZmZlxuICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLnNjcmF0Y2hCb3VuZHNcblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcblxuICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcblxuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WClcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpXG4gICAgICB0cmltUmVjdEJvdW5kcyhcbiAgICAgICAgdG9wTGVmdFgsXG4gICAgICAgIHRvcExlZnRZLFxuICAgICAgICBiVyxcbiAgICAgICAgYkgsXG4gICAgICAgIHRhcmdldC53aWR0aCxcbiAgICAgICAgdGFyZ2V0LmhlaWdodCxcbiAgICAgICAgc2NyYXRjaCxcbiAgICAgIClcblxuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm5cblxuICAgICAgdGhpcy5lYWNoVGlsZUluQm91bmRzKHNjcmF0Y2gsICh0aWxlLCBiWCwgYlksIGJXX3QsIGJIX3QpID0+IHtcbiAgICAgICAgY29uc3QgZDMyID0gdGlsZS5kYXRhMzJcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2VcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJIX3Q7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNhbnZhc1kgPSBiWSArIGlcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiV1xuICAgICAgICAgIGNvbnN0IHRPZmYgPSAoY2FudmFzWSAmIHRpbGVNYXNrKSA8PCB0aWxlU2hpZnRcbiAgICAgICAgICBjb25zdCBkUyA9IHRPZmYgKyAoYlggJiB0aWxlTWFzaylcblxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYldfdDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNYID0gYlggKyBqXG4gICAgICAgICAgICBjb25zdCBicnVzaEEgPSBiRFtiT2ZmICsgKGNhbnZhc1ggLSB0b3BMZWZ0WCldXG4gICAgICAgICAgICBpZiAoYnJ1c2hBID09PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjb25zdCB0ID0gY0EgKiBicnVzaEEgKyAxMjhcbiAgICAgICAgICAgIGNvbnN0IGJsZW5kZWRBID0gKHQgKyAodCA+PiA4KSkgPj4gOFxuXG4gICAgICAgICAgICBjb25zdCBpZHggPSBkUyArIGpcbiAgICAgICAgICAgIGNvbnN0IGN1ciA9IGQzMltpZHhdXG4gICAgICAgICAgICBpZiAoYnJ1c2hBID4gKGN1ciA+Pj4gMjQpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHQgPSAoY1JHQiB8IChibGVuZGVkQSA8PCAyNCkpID4+PiAwXG4gICAgICAgICAgICAgIGlmIChjdXIgIT09IG5leHQpIHtcbiAgICAgICAgICAgICAgICBkMzJbaWR4XSA9IG5leHQgYXMgQ29sb3IzMlxuICAgICAgICAgICAgICAgIHRpbGVDaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkgY2hhbmdlZCA9IHRydWVcbiAgICAgIH0pXG4gICAgfSlcbiAgICByZXR1cm4gY2hhbmdlZFxuICB9XG5cbiAgd3JpdGVQYWludEJpbmFyeU1hc2tTdHJva2UoXG4gICAgY29sb3I6IENvbG9yMzIsXG4gICAgYnJ1c2g6IFBhaW50QmluYXJ5TWFzayxcbiAgICB4MDogbnVtYmVyLFxuICAgIHkwOiBudW1iZXIsXG4gICAgeDE6IG51bWJlcixcbiAgICB5MTogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBhbHBoYUlzWmVybyA9IChjb2xvciA+Pj4gMjQpID09PSAwXG4gICAgaWYgKGFscGhhSXNaZXJvKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHsgdGlsZVNoaWZ0LCB0aWxlTWFzaywgdGFyZ2V0IH0gPSB0aGlzLmNvbmZpZ1xuICAgIGNvbnN0IHsgdzogYlcsIGg6IGJILCBkYXRhOiBiRCwgY2VudGVyT2Zmc2V0WCwgY2VudGVyT2Zmc2V0WSB9ID0gYnJ1c2hcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WClcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpXG5cbiAgICAgIHRyaW1SZWN0Qm91bmRzKFxuICAgICAgICB0b3BMZWZ0WCxcbiAgICAgICAgdG9wTGVmdFksXG4gICAgICAgIGJXLFxuICAgICAgICBiSCxcbiAgICAgICAgdGFyZ2V0LndpZHRoLFxuICAgICAgICB0YXJnZXQuaGVpZ2h0LFxuICAgICAgICBzY3JhdGNoLFxuICAgICAgKVxuXG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVyblxuXG4gICAgICB0aGlzLmVhY2hUaWxlSW5Cb3VuZHMoc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkMzIgPSB0aWxlLmRhdGEzMlxuICAgICAgICBsZXQgdGlsZUNoYW5nZWQgPSBmYWxzZVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaVxuICAgICAgICAgIGNvbnN0IGJPZmYgPSAoY2FudmFzWSAtIHRvcExlZnRZKSAqIGJXXG4gICAgICAgICAgY29uc3QgdE9mZiA9IChjYW52YXNZICYgdGlsZU1hc2spIDw8IHRpbGVTaGlmdFxuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKVxuXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBiV190OyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhc1ggPSBiWCArIGpcbiAgICAgICAgICAgIGlmIChiRFtiT2ZmICsgKGNhbnZhc1ggLSB0b3BMZWZ0WCldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgalxuICAgICAgICAgICAgICBpZiAoZDMyW2lkeF0gIT09IGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgZDMyW2lkeF0gPSBjb2xvclxuICAgICAgICAgICAgICAgIHRpbGVDaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkgY2hhbmdlZCA9IHRydWVcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiBjaGFuZ2VkXG4gIH1cblxuICB3cml0ZVJlY3RTdHJva2UoXG4gICAgY29sb3I6IENvbG9yMzIsXG4gICAgYnJ1c2hXaWR0aDogbnVtYmVyLFxuICAgIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gICAgeDA6IG51bWJlcixcbiAgICB5MDogbnVtYmVyLFxuICAgIHgxOiBudW1iZXIsXG4gICAgeTE6IG51bWJlcixcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWxwaGFJc1plcm8gPSAoY29sb3IgPj4+IDI0KSA9PT0gMFxuICAgIGlmIChhbHBoYUlzWmVybykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnRcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFza1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXRcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzXG5cbiAgICBjb25zdCBjZW50ZXJPZmZzZXRYID0gbWFjcm9faGFsZkFuZEZsb29yKGJydXNoV2lkdGggLSAxKVxuICAgIGNvbnN0IGNlbnRlck9mZnNldFkgPSBtYWNyb19oYWxmQW5kRmxvb3IoYnJ1c2hIZWlnaHQgLSAxKVxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgZm9yRWFjaExpbmVQb2ludChcbiAgICAgIHgwLFxuICAgICAgeTAsXG4gICAgICB4MSxcbiAgICAgIHkxLFxuICAgICAgKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCB0b3BMZWZ0WCA9IE1hdGguZmxvb3IocHggKyBjZW50ZXJPZmZzZXRYKVxuICAgICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKVxuXG4gICAgICAgIHRyaW1SZWN0Qm91bmRzKFxuICAgICAgICAgIHRvcExlZnRYLFxuICAgICAgICAgIHRvcExlZnRZLFxuICAgICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0LndpZHRoLFxuICAgICAgICAgIHRhcmdldC5oZWlnaHQsXG4gICAgICAgICAgc2NyYXRjaCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChzY3JhdGNoLncgPD0gMCB8fCBzY3JhdGNoLmggPD0gMCkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5lYWNoVGlsZUluQm91bmRzKFxuICAgICAgICAgIHNjcmF0Y2gsXG4gICAgICAgICAgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZDMyID0gdGlsZS5kYXRhMzJcbiAgICAgICAgICAgIGxldCB0aWxlQ2hhbmdlZCA9IGZhbHNlXG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbnZhc1kgPSBiWSArIGlcbiAgICAgICAgICAgICAgY29uc3QgdE9mZiA9IChjYW52YXNZICYgdGlsZU1hc2spIDw8IHRpbGVTaGlmdFxuICAgICAgICAgICAgICBjb25zdCBkUyA9IHRPZmYgKyAoYlggJiB0aWxlTWFzaylcblxuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgalxuXG4gICAgICAgICAgICAgICAgaWYgKGQzMltpZHhdICE9PSBjb2xvcikge1xuICAgICAgICAgICAgICAgICAgZDMyW2lkeF0gPSBjb2xvclxuICAgICAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aWxlQ2hhbmdlZCkge1xuICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgcmV0dXJuIGNoYW5nZWRcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudGlsZVBvb2wucmVsZWFzZVRpbGVzKHRoaXMubG9va3VwKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { IPixelData } from '../_types';\nexport class PixelTile implements IPixelData {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n readonly imageData: ImageData;\n constructor(public id: number, public tx: number, public ty: number, tileSize: number, tileArea: number) {\n this.width = this.height = tileSize;\n this.data32 = new Uint32Array(tileArea);\n const data8 = new Uint8ClampedArray(this.data32.buffer) as Uint8ClampedArray<ArrayBuffer>;\n this.imageData = new ImageData(data8, tileSize, tileSize);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxUaWxlIGltcGxlbWVudHMgSVBpeGVsRGF0YSB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXlcbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlclxuICByZWFkb25seSBoZWlnaHQ6IG51bWJlclxuICByZWFkb25seSBpbWFnZURhdGE6IEltYWdlRGF0YVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpZDogbnVtYmVyLFxuICAgIHB1YmxpYyB0eDogbnVtYmVyLFxuICAgIHB1YmxpYyB0eTogbnVtYmVyLFxuICAgIHRpbGVTaXplOiBudW1iZXIsXG4gICAgdGlsZUFyZWE6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gdGlsZVNpemVcbiAgICB0aGlzLmRhdGEzMiA9IG5ldyBVaW50MzJBcnJheSh0aWxlQXJlYSlcbiAgICBjb25zdCBkYXRhOCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLmRhdGEzMi5idWZmZXIpIGFzIFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyPlxuICAgIHRoaXMuaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShkYXRhOCwgdGlsZVNpemUsIHRpbGVTaXplKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { PixelTile } from './PixelTile';\nexport class PixelTilePool {\n public pool: PixelTile[];\n private tileSize: number;\n private tileArea: number;\n constructor(config: PixelEngineConfig) {\n this.pool = [];\n this.tileSize = config.tileSize;\n this.tileArea = config.tileArea;\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\n // Wipe dirty memory from previous uses before handing it out\n tile.data32.fill(0);\n return tile;\n }\n return new PixelTile(id, tx, ty, this.tileSize, this.tileArea);\n }\n releaseTile(tile: PixelTile): void {\n this.pool.push(tile);\n }\n releaseTiles(tiles: (PixelTile | undefined)[]): void {\n let length = tiles.length;\n for (let i = 0; i < length; i++) {\n let tile = tiles[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n tiles.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4uL0hpc3RvcnkvUGl4ZWxFbmdpbmVDb25maWcnXG5cbmltcG9ydCB7IFBpeGVsVGlsZSB9IGZyb20gJy4vUGl4ZWxUaWxlJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxUaWxlUG9vbCB7XG4gIHB1YmxpYyBwb29sOiBQaXhlbFRpbGVbXVxuXG4gIHByaXZhdGUgdGlsZVNpemU6IG51bWJlclxuICBwcml2YXRlIHRpbGVBcmVhOiBudW1iZXJcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc6IFBpeGVsRW5naW5lQ29uZmlnLFxuICApIHtcbiAgICB0aGlzLnBvb2wgPSBbXVxuICAgIHRoaXMudGlsZVNpemUgPSBjb25maWcudGlsZVNpemVcbiAgICB0aGlzLnRpbGVBcmVhID0gY29uZmlnLnRpbGVBcmVhXG4gIH1cblxuICBnZXRUaWxlKFxuICAgIGlkOiBudW1iZXIsXG4gICAgdHg6IG51bWJlcixcbiAgICB0eTogbnVtYmVyLFxuICApOiBQaXhlbFRpbGUge1xuICAgIGxldCB0aWxlID0gdGhpcy5wb29sLnBvcCgpXG5cbiAgICBpZiAodGlsZSkge1xuICAgICAgdGlsZS5pZCA9IGlkXG4gICAgICB0aWxlLnR4ID0gdHhcbiAgICAgIHRpbGUudHkgPSB0eVxuXG4gICAgICAvLyBXaXBlIGRpcnR5IG1lbW9yeSBmcm9tIHByZXZpb3VzIHVzZXMgYmVmb3JlIGhhbmRpbmcgaXQgb3V0XG4gICAgICB0aWxlLmRhdGEzMi5maWxsKDApXG5cbiAgICAgIHJldHVybiB0aWxlXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQaXhlbFRpbGUoXG4gICAgICBpZCxcbiAgICAgIHR4LFxuICAgICAgdHksXG4gICAgICB0aGlzLnRpbGVTaXplLFxuICAgICAgdGhpcy50aWxlQXJlYSxcbiAgICApXG4gIH1cblxuICByZWxlYXNlVGlsZSh0aWxlOiBQaXhlbFRpbGUpOiB2b2lkIHtcbiAgICB0aGlzLnBvb2wucHVzaCh0aWxlKVxuICB9XG5cbiAgcmVsZWFzZVRpbGVzKHRpbGVzOiAoUGl4ZWxUaWxlIHwgdW5kZWZpbmVkKVtdKTogdm9pZCB7XG4gICAgbGV0IGxlbmd0aCA9IHRpbGVzLmxlbmd0aFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRpbGUgPSB0aWxlc1tpXVxuXG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh0aWxlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRpbGVzLmxlbmd0aCA9IDBcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { resizeImageData } from '../ImageData/resizeImageData';\nimport { PaintBuffer } from '../Paint/PaintBuffer';\nimport { blendPixelData } from '../PixelData/blendPixelData';\nimport { PixelTilePool } from '../PixelTile/PixelTilePool';\nimport { makeHistoryAction } from './HistoryAction';\nimport { HistoryManager } from './HistoryManager';\nimport { PixelAccumulator } from './PixelAccumulator';\nimport { PixelEngineConfig } from './PixelEngineConfig';\nexport interface PixelWriterOptions {\n maxHistorySteps?: number;\n tileSize?: number;\n historyManager?: HistoryManager;\n historyActionFactory?: HistoryActionFactory;\n pixelTilePool?: PixelTilePool;\n accumulator?: PixelAccumulator;\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 readonly historyManager: HistoryManager;\n readonly accumulator: PixelAccumulator;\n readonly historyActionFactory: HistoryActionFactory;\n readonly config: PixelEngineConfig;\n readonly pixelTilePool: PixelTilePool;\n readonly paintBuffer: PaintBuffer;\n readonly mutator: M;\n private blendPixelDataOpts = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n private _inProgress = false;\n constructor(target: PixelData, mutatorFactory: (writer: PixelWriter<any>) => M, {\n tileSize = 256,\n maxHistorySteps = 50,\n historyManager = new HistoryManager(maxHistorySteps),\n historyActionFactory = makeHistoryAction,\n pixelTilePool,\n accumulator\n }: PixelWriterOptions = {}) {\n this.config = new PixelEngineConfig(tileSize, target);\n this.historyManager = historyManager;\n this.pixelTilePool = pixelTilePool ?? new PixelTilePool(this.config);\n this.accumulator = accumulator ?? new PixelAccumulator(this.config, this.pixelTilePool);\n this.historyActionFactory = historyActionFactory;\n this.mutator = mutatorFactory(this);\n this.paintBuffer = new PaintBuffer(this.config, this.pixelTilePool);\n }\n\n /**\n * Executes `transaction` and commits the resulting pixel changes as a single\n * undoable history action.\n *\n * - If `transaction` throws, all accumulated changes are rolled back and the error\n * is re-thrown. No action is committed.\n * - If `transaction` completes without modifying any pixels, no action is committed.\n * - `withHistory` is not re-entrant. Calling it again from inside `transaction` will\n * throw immediately to prevent silent data loss from a nested extractPatch.\n *\n * @param transaction Callback to be executed inside the transaction.\n * @param after Called after both undo and redo — use for generic change notifications.\n * @param afterUndo Called after undo only — use for dimension or state changes specific to undo.\n * @param afterRedo Called after redo only.\n */\n withHistory(transaction: (mutator: M) => void, after?: () => void, afterUndo?: () => void, afterRedo?: () => void): void {\n if (this._inProgress) {\n throw new Error('withHistory is not re-entrant — commit or rollback the current operation first');\n }\n this._inProgress = true;\n try {\n transaction(this.mutator);\n } catch (e) {\n this.accumulator.rollbackAfterError();\n throw e;\n } finally {\n this._inProgress = false;\n }\n if (this.accumulator.beforeTiles.length === 0) return;\n const patch = this.accumulator.extractPatch();\n const action = this.historyActionFactory(this, patch, after, afterUndo, afterRedo);\n this.historyManager.commit(action);\n }\n resize(newWidth: number, newHeight: number, offsetX = 0, offsetY = 0, after?: (target: ImageData) => void, afterUndo?: (target: ImageData) => void, afterRedo?: (target: ImageData) => void, resizeImageDataFn = resizeImageData): void {\n if (this._inProgress) {\n throw new Error('Cannot resize inside a withHistory callback');\n }\n if (this.accumulator.beforeTiles.length > 0) {\n throw new Error('Cannot resize with an open accumulator — commit or rollback first');\n }\n const config = this.config;\n const target = config.target;\n const beforeImageData = target.imageData;\n const afterImageData = resizeImageDataFn(beforeImageData, newWidth, newHeight, offsetX, offsetY);\n target.set(afterImageData);\n this.historyManager.commit({\n undo: () => {\n target.set(beforeImageData);\n afterUndo?.(beforeImageData);\n after?.(beforeImageData);\n },\n redo: () => {\n target.set(afterImageData);\n afterRedo?.(afterImageData);\n after?.(afterImageData);\n }\n });\n }\n commitPaintBuffer(alpha = 255, blendFn = sourceOverPerfect, blendPixelDataFn = blendPixelData) {\n const paintBuffer = this.paintBuffer;\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n const opts = this.blendPixelDataOpts;\n opts.alpha = alpha;\n opts.blendFn = blendFn;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const didChange = this.accumulator.storeTileBeforeState(tile.id, tile.tx, tile.ty);\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n opts.x = dx;\n opts.y = dy;\n opts.w = tile.width;\n opts.h = tile.height;\n didChange(blendPixelDataFn(this.config.target, tile, opts));\n }\n }\n paintBuffer.clear();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5pbXBvcnQgeyByZXNpemVJbWFnZURhdGEgfSBmcm9tICcuLi9JbWFnZURhdGEvcmVzaXplSW1hZ2VEYXRhJ1xuaW1wb3J0IHsgUGFpbnRCdWZmZXIgfSBmcm9tICcuLi9QYWludC9QYWludEJ1ZmZlcidcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhIH0gZnJvbSAnLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbERhdGEgfSBmcm9tICcuLi9QaXhlbERhdGEvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxUaWxlUG9vbCB9IGZyb20gJy4uL1BpeGVsVGlsZS9QaXhlbFRpbGVQb29sJ1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5QWN0aW9uRmFjdG9yeSwgbWFrZUhpc3RvcnlBY3Rpb24gfSBmcm9tICcuL0hpc3RvcnlBY3Rpb24nXG5pbXBvcnQgeyBIaXN0b3J5TWFuYWdlciB9IGZyb20gJy4vSGlzdG9yeU1hbmFnZXInXG5pbXBvcnQgeyBQaXhlbEFjY3VtdWxhdG9yIH0gZnJvbSAnLi9QaXhlbEFjY3VtdWxhdG9yJ1xuaW1wb3J0IHsgUGl4ZWxFbmdpbmVDb25maWcgfSBmcm9tICcuL1BpeGVsRW5naW5lQ29uZmlnJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsV3JpdGVyT3B0aW9ucyB7XG4gIG1heEhpc3RvcnlTdGVwcz86IG51bWJlclxuICB0aWxlU2l6ZT86IG51bWJlclxuICBoaXN0b3J5TWFuYWdlcj86IEhpc3RvcnlNYW5hZ2VyXG4gIGhpc3RvcnlBY3Rpb25GYWN0b3J5PzogSGlzdG9yeUFjdGlvbkZhY3RvcnlcbiAgcGl4ZWxUaWxlUG9vbD86IFBpeGVsVGlsZVBvb2wsXG4gIGFjY3VtdWxhdG9yPzogUGl4ZWxBY2N1bXVsYXRvclxufVxuXG4vKipcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0YXJnID0gbmV3IFBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKDEwLCAxMCkpXG4gKiBjb25zdCB3cml0ZXIgPSBuZXcgUGl4ZWxXcml0ZXIodGFyZywgKHdyaXRlcikgPT4ge1xuICogICByZXR1cm4ge1xuICogICAgIC4uLm11dGF0b3JBcHBseU1hc2sod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGEod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yQmxlbmRDb2xvcih3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsKHdyaXRlciksXG4gKiAgICAgLi4ubXV0YXRvckZpbGwod3JpdGVyKSxcbiAqICAgfVxuICogfSlcbiAqXG4gKiAvLyB0byBpbXBvcnQgYWxsIG11dGF0b3IgZnVuY3Rpb25zXG4gKiBjb25zdCB3cml0ZXIgPSBuZXcgUGl4ZWxXcml0ZXIodGFyZywgbWFrZUZ1bGxQaXhlbE11dGF0b3IpXG4gKlxuICogd3JpdGVyLndpdGhIaXN0b3J5KChtdXRhdG9yKSA9PiB7XG4gKiAgIG11dGF0b3IuYXBwbHlNYXNrKClcbiAqICAgbXV0YXRvci5ibGVuZFBpeGVsRGF0YSgpXG4gKiB9KVxuICovXG5leHBvcnQgY2xhc3MgUGl4ZWxXcml0ZXI8TT4ge1xuICByZWFkb25seSBoaXN0b3J5TWFuYWdlcjogSGlzdG9yeU1hbmFnZXJcbiAgcmVhZG9ubHkgYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3JcbiAgcmVhZG9ubHkgaGlzdG9yeUFjdGlvbkZhY3Rvcnk6IEhpc3RvcnlBY3Rpb25GYWN0b3J5XG4gIHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWdcbiAgcmVhZG9ubHkgcGl4ZWxUaWxlUG9vbDogUGl4ZWxUaWxlUG9vbFxuICByZWFkb25seSBwYWludEJ1ZmZlcjogUGFpbnRCdWZmZXJcbiAgcmVhZG9ubHkgbXV0YXRvcjogTVxuXG4gIHByaXZhdGUgYmxlbmRQaXhlbERhdGFPcHRzID0ge1xuICAgIGFscGhhOiAyNTUsXG4gICAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3QsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIHByaXZhdGUgX2luUHJvZ3Jlc3MgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKHRhcmdldDogUGl4ZWxEYXRhLCBtdXRhdG9yRmFjdG9yeTogKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PikgPT4gTSwge1xuICAgIHRpbGVTaXplID0gMjU2LFxuICAgIG1heEhpc3RvcnlTdGVwcyA9IDUwLFxuICAgIGhpc3RvcnlNYW5hZ2VyID0gbmV3IEhpc3RvcnlNYW5hZ2VyKG1heEhpc3RvcnlTdGVwcyksXG4gICAgaGlzdG9yeUFjdGlvbkZhY3RvcnkgPSBtYWtlSGlzdG9yeUFjdGlvbixcbiAgICBwaXhlbFRpbGVQb29sLFxuICAgIGFjY3VtdWxhdG9yLFxuICB9OiBQaXhlbFdyaXRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0gbmV3IFBpeGVsRW5naW5lQ29uZmlnKHRpbGVTaXplLCB0YXJnZXQpXG4gICAgdGhpcy5oaXN0b3J5TWFuYWdlciA9IGhpc3RvcnlNYW5hZ2VyXG4gICAgdGhpcy5waXhlbFRpbGVQb29sID0gcGl4ZWxUaWxlUG9vbCA/PyBuZXcgUGl4ZWxUaWxlUG9vbCh0aGlzLmNvbmZpZylcbiAgICB0aGlzLmFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IgPz8gbmV3IFBpeGVsQWNjdW11bGF0b3IodGhpcy5jb25maWcsIHRoaXMucGl4ZWxUaWxlUG9vbClcbiAgICB0aGlzLmhpc3RvcnlBY3Rpb25GYWN0b3J5ID0gaGlzdG9yeUFjdGlvbkZhY3RvcnlcbiAgICB0aGlzLm11dGF0b3IgPSBtdXRhdG9yRmFjdG9yeSh0aGlzKVxuICAgIHRoaXMucGFpbnRCdWZmZXIgPSBuZXcgUGFpbnRCdWZmZXIodGhpcy5jb25maWcsIHRoaXMucGl4ZWxUaWxlUG9vbClcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBgdHJhbnNhY3Rpb25gIGFuZCBjb21taXRzIHRoZSByZXN1bHRpbmcgcGl4ZWwgY2hhbmdlcyBhcyBhIHNpbmdsZVxuICAgKiB1bmRvYWJsZSBoaXN0b3J5IGFjdGlvbi5cbiAgICpcbiAgICogLSBJZiBgdHJhbnNhY3Rpb25gIHRocm93cywgYWxsIGFjY3VtdWxhdGVkIGNoYW5nZXMgYXJlIHJvbGxlZCBiYWNrIGFuZCB0aGUgZXJyb3JcbiAgICogICBpcyByZS10aHJvd24uIE5vIGFjdGlvbiBpcyBjb21taXR0ZWQuXG4gICAqIC0gSWYgYHRyYW5zYWN0aW9uYCBjb21wbGV0ZXMgd2l0aG91dCBtb2RpZnlpbmcgYW55IHBpeGVscywgbm8gYWN0aW9uIGlzIGNvbW1pdHRlZC5cbiAgICogLSBgd2l0aEhpc3RvcnlgIGlzIG5vdCByZS1lbnRyYW50LiBDYWxsaW5nIGl0IGFnYWluIGZyb20gaW5zaWRlIGB0cmFuc2FjdGlvbmAgd2lsbFxuICAgKiAgIHRocm93IGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgc2lsZW50IGRhdGEgbG9zcyBmcm9tIGEgbmVzdGVkIGV4dHJhY3RQYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIENhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBhZnRlciAgICBDYWxsZWQgYWZ0ZXIgYm90aCB1bmRvIGFuZCByZWRvIOKAlCB1c2UgZm9yIGdlbmVyaWMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuXG4gICAqIEBwYXJhbSBhZnRlclVuZG8gQ2FsbGVkIGFmdGVyIHVuZG8gb25seSDigJQgdXNlIGZvciBkaW1lbnNpb24gb3Igc3RhdGUgY2hhbmdlcyBzcGVjaWZpYyB0byB1bmRvLlxuICAgKiBAcGFyYW0gYWZ0ZXJSZWRvIENhbGxlZCBhZnRlciByZWRvIG9ubHkuXG4gICAqL1xuICB3aXRoSGlzdG9yeShcbiAgICB0cmFuc2FjdGlvbjogKG11dGF0b3I6IE0pID0+IHZvaWQsXG4gICAgYWZ0ZXI/OiAoKSA9PiB2b2lkLFxuICAgIGFmdGVyVW5kbz86ICgpID0+IHZvaWQsXG4gICAgYWZ0ZXJSZWRvPzogKCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2l0aEhpc3RvcnkgaXMgbm90IHJlLWVudHJhbnQg4oCUIGNvbW1pdCBvciByb2xsYmFjayB0aGUgY3VycmVudCBvcGVyYXRpb24gZmlyc3QnKVxuICAgIH1cblxuICAgIHRoaXMuX2luUHJvZ3Jlc3MgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24odGhpcy5tdXRhdG9yKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWNjdW11bGF0b3Iucm9sbGJhY2tBZnRlckVycm9yKClcbiAgICAgIHRocm93IGVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faW5Qcm9ncmVzcyA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWNjdW11bGF0b3IuYmVmb3JlVGlsZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5hY2N1bXVsYXRvci5leHRyYWN0UGF0Y2goKVxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuaGlzdG9yeUFjdGlvbkZhY3RvcnkodGhpcywgcGF0Y2gsIGFmdGVyLCBhZnRlclVuZG8sIGFmdGVyUmVkbylcblxuICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuY29tbWl0KGFjdGlvbilcbiAgfVxuXG4gIHJlc2l6ZShcbiAgICBuZXdXaWR0aDogbnVtYmVyLFxuICAgIG5ld0hlaWdodDogbnVtYmVyLFxuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGFmdGVyPzogKHRhcmdldDogSW1hZ2VEYXRhKSA9PiB2b2lkLFxuICAgIGFmdGVyVW5kbz86ICh0YXJnZXQ6IEltYWdlRGF0YSkgPT4gdm9pZCxcbiAgICBhZnRlclJlZG8/OiAodGFyZ2V0OiBJbWFnZURhdGEpID0+IHZvaWQsXG4gICAgcmVzaXplSW1hZ2VEYXRhRm4gPSByZXNpemVJbWFnZURhdGEsXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pblByb2dyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXNpemUgaW5zaWRlIGEgd2l0aEhpc3RvcnkgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjY3VtdWxhdG9yLmJlZm9yZVRpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlc2l6ZSB3aXRoIGFuIG9wZW4gYWNjdW11bGF0b3Ig4oCUIGNvbW1pdCBvciByb2xsYmFjayBmaXJzdCcpXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0XG4gICAgY29uc3QgYmVmb3JlSW1hZ2VEYXRhID0gdGFyZ2V0LmltYWdlRGF0YVxuICAgIGNvbnN0IGFmdGVySW1hZ2VEYXRhID0gcmVzaXplSW1hZ2VEYXRhRm4oYmVmb3JlSW1hZ2VEYXRhLCBuZXdXaWR0aCwgbmV3SGVpZ2h0LCBvZmZzZXRYLCBvZmZzZXRZKVxuXG4gICAgdGFyZ2V0LnNldChhZnRlckltYWdlRGF0YSlcblxuICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuY29tbWl0KHtcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgdGFyZ2V0LnNldChiZWZvcmVJbWFnZURhdGEpXG4gICAgICAgIGFmdGVyVW5kbz8uKGJlZm9yZUltYWdlRGF0YSlcbiAgICAgICAgYWZ0ZXI/LihiZWZvcmVJbWFnZURhdGEpXG4gICAgICB9LFxuICAgICAgcmVkbzogKCkgPT4ge1xuICAgICAgICB0YXJnZXQuc2V0KGFmdGVySW1hZ2VEYXRhKVxuICAgICAgICBhZnRlclJlZG8/LihhZnRlckltYWdlRGF0YSlcbiAgICAgICAgYWZ0ZXI/LihhZnRlckltYWdlRGF0YSlcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbW1pdFBhaW50QnVmZmVyKFxuICAgIGFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBibGVuZFBpeGVsRGF0YUZuID0gYmxlbmRQaXhlbERhdGEsXG4gICkge1xuICAgIGNvbnN0IHBhaW50QnVmZmVyID0gdGhpcy5wYWludEJ1ZmZlclxuICAgIGNvbnN0IHRpbGVTaGlmdCA9IHBhaW50QnVmZmVyLmNvbmZpZy50aWxlU2hpZnRcbiAgICBjb25zdCBsb29rdXAgPSBwYWludEJ1ZmZlci5sb29rdXBcblxuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmJsZW5kUGl4ZWxEYXRhT3B0c1xuXG4gICAgb3B0cy5hbHBoYSA9IGFscGhhXG4gICAgb3B0cy5ibGVuZEZuID0gYmxlbmRGblxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV1cblxuICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgY29uc3QgZGlkQ2hhbmdlID0gdGhpcy5hY2N1bXVsYXRvci5zdG9yZVRpbGVCZWZvcmVTdGF0ZSh0aWxlLmlkLCB0aWxlLnR4LCB0aWxlLnR5KVxuXG4gICAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnRcbiAgICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdFxuXG4gICAgICAgIG9wdHMueCA9IGR4XG4gICAgICAgIG9wdHMueSA9IGR5XG4gICAgICAgIG9wdHMudyA9IHRpbGUud2lkdGhcbiAgICAgICAgb3B0cy5oID0gdGlsZS5oZWlnaHRcblxuICAgICAgICBkaWRDaGFuZ2UoXG4gICAgICAgICAgYmxlbmRQaXhlbERhdGFGbihcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnRhcmdldCxcbiAgICAgICAgICAgIHRpbGUsXG4gICAgICAgICAgICBvcHRzLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYWludEJ1ZmZlci5jbGVhcigpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\n\n/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyAlphaMaskToPixelData(dst: IPixelData32, mask: AlphaMask, opts: ApplyMaskToPixelDataOptions = {}): boolean {\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 false;\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 false;\n if (h <= 0) return false;\n\n // 2. Determine Source Dimensions\n const mPitch = mask.w;\n if (mPitch <= 0) return false;\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 false;\n if (finalH <= 0) return false;\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 let didChange = false;\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 didChange = true;\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 const current = dst32[dIdx] as Color32;\n const next = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIENvbG9yMzIsIHR5cGUgSVBpeGVsRGF0YTMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgbWFzazogQWxwaGFNYXNrLFxuICBvcHRzOiBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMgPSB7fSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgdzogd2lkdGggPSBkc3Qud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gZHN0LmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm4gZmFsc2VcblxuICAvLyAxLiBJbml0aWFsIERlc3RpbmF0aW9uIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgdyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAodyA8PSAwKSByZXR1cm4gZmFsc2VcbiAgaWYgKGggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgLy8gMi4gRGV0ZXJtaW5lIFNvdXJjZSBEaW1lbnNpb25zXG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sud1xuICBpZiAobVBpdGNoIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIC8vIDMuIFNvdXJjZSBCb3VuZHMgQ2xpcHBpbmdcbiAgLy8gQ2FsY3VsYXRlIHdoZXJlIHdlIHdvdWxkIHN0YXJ0IHJlYWRpbmcgaW4gdGhlIG1hc2tcbiAgY29uc3Qgc3RhcnRYID0gbXggKyAoeCAtIHRhcmdldFgpXG4gIGNvbnN0IHN0YXJ0WSA9IG15ICsgKHkgLSB0YXJnZXRZKVxuXG4gIC8vIEZpbmQgdGhlIHNhZmUgb3ZlcmxhcCBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGFuZCB0aGUgbWFzayBib3VuZHNcbiAgY29uc3Qgc1gwID0gTWF0aC5tYXgoMCwgc3RhcnRYKVxuICBjb25zdCBzWTAgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKG1QaXRjaCwgc3RhcnRYICsgdylcbiAgY29uc3Qgc1kxID0gTWF0aC5taW4obWFzay5oLCBzdGFydFkgKyBoKVxuXG4gIGNvbnN0IGZpbmFsVyA9IHNYMSAtIHNYMFxuICBjb25zdCBmaW5hbEggPSBzWTEgLSBzWTBcblxuICAvLyBUaGlzIGlzIHdoZXJlIHlvdXIgZmFpbGluZyB0ZXN0cyBhcmUgbm93IGNhdWdodFxuICBpZiAoZmluYWxXIDw9IDApIHJldHVybiBmYWxzZVxuICBpZiAoZmluYWxIIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIC8vIDQuIEFsaWduIERlc3RpbmF0aW9uIHdpdGggU291cmNlIENsaXBwaW5nXG4gIC8vIElmIHRoZSBzb3VyY2Ugd2FzIGNsaXBwZWQgb24gdGhlIHRvcC9sZWZ0LCB3ZSBtdXN0IHNoaWZ0IHRoZSBkZXN0aW5hdGlvbiBzdGFydFxuICBjb25zdCB4U2hpZnQgPSBzWDAgLSBzdGFydFhcbiAgY29uc3QgeVNoaWZ0ID0gc1kwIC0gc3RhcnRZXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGZpbmFsV1xuICBjb25zdCBtU3RyaWRlID0gbVBpdGNoIC0gZmluYWxXXG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhXG5cbiAgbGV0IGRJZHggPSAoeSArIHlTaGlmdCkgKiBkdyArICh4ICsgeFNoaWZ0KVxuICBsZXQgbUlkeCA9IHNZMCAqIG1QaXRjaCArIHNYMFxuXG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZVxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgaDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCB3OyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF1cbiAgICAgIC8vIFVuaWZpZWQgbG9naWMgYnJhbmNoIGluc2lkZSB0aGUgaG90IHBhdGhcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgbGV0IHdlaWdodCA9IDBcblxuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMFxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVNID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcbiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEgPT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZlY3RpdmVNXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3ZWlnaHQgPSAoZWZmZWN0aXZlTSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICB9XG5cbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxwaGEgY2hhbm5lbFxuICAgICAgICBkc3QzMltkSWR4XSA9IChkc3QzMltkSWR4XSAmIDB4MDBmZmZmZmYpID4+PiAwXG4gICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAod2VpZ2h0ICE9PSAyNTUpIHtcbiAgICAgICAgLy8gTWVyZ2UgYWxwaGEgY2hhbm5lbFxuICAgICAgICBjb25zdCBkID0gZHN0MzJbZElkeF1cbiAgICAgICAgY29uc3QgZGEgPSBkID4+PiAyNFxuXG4gICAgICAgIGlmIChkYSAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGZpbmFsQWxwaGEgPSBkYSA9PT0gMjU1ID8gd2VpZ2h0IDogKGRhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMlxuICAgICAgICAgIGNvbnN0IG5leHQgPSAoKGQgJiAweDAwZmZmZmZmKSB8IChmaW5hbEFscGhhIDw8IDI0KSkgPj4+IDBcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0XG4gICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgbUlkeCsrXG4gICAgfVxuXG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 = {}): boolean {\n let target = writer.config.target;\n const {\n x = 0,\n y = 0,\n w = target.width,\n h = target.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(applyAlphaMaskToPixelData(target, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5QWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseUFscGhhTWFzayhtYXNrOiBBbHBoYU1hc2ssIG9wdHM6IEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gICAgICBsZXQgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gdGFyZ2V0LndpZHRoLFxuICAgICAgICBoID0gdGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEodGFyZ2V0LCBtYXNrLCBvcHRzKSlcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyBinaryMaskToPixelData(dst: IPixelData32, mask: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}): boolean {\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 false;\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 || h <= 0) return false;\n const mPitch = mask.w;\n if (mPitch <= 0) return false;\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 if (finalW <= 0 || finalH <= 0) {\n return false;\n }\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 let didChange = false;\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = maskData[mIdx];\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n const current = dst32[dIdx];\n const next = (current & 0x00ffffff) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n } else if (globalAlpha !== 255) {\n const d = dst32[dIdx];\n const da = d >>> 24;\n if (da !== 0) {\n const finalAlpha = da === 255 ? globalAlpha : da * globalAlpha + 128 >> 8;\n const next = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n if (d !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbi8qKlxuICogRGlyZWN0bHkgYXBwbGllcyBhIG1hc2sgdG8gYSByZWdpb24gb2YgUGl4ZWxEYXRhLFxuICogbW9kaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbidzIGFscGhhIGNoYW5uZWwgaW4tcGxhY2UuXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFueSBwaXhlbHMgd2VyZSBhY3R1YWxseSBtb2RpZmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuXG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICB3ID0gTWF0aC5taW4odywgZHN0LndpZHRoIC0geClcbiAgaCA9IE1hdGgubWluKGgsIGRzdC5oZWlnaHQgLSB5KVxuXG4gIGlmICh3IDw9IDAgfHwgaCA8PSAwKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBtUGl0Y2ggPSBtYXNrLndcbiAgaWYgKG1QaXRjaCA8PSAwKSByZXR1cm4gZmFsc2VcblxuICAvLyAzLiBTb3VyY2UgQm91bmRzIENsaXBwaW5nXG4gIC8vIENhbGN1bGF0ZSB3aGVyZSB3ZSB3b3VsZCBzdGFydCByZWFkaW5nIGluIHRoZSBtYXNrXG4gIGNvbnN0IHN0YXJ0WCA9IG14ICsgKHggLSB0YXJnZXRYKVxuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSlcblxuICAvLyBGaW5kIHRoZSBzYWZlIG92ZXJsYXAgYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBhbmQgdGhlIG1hc2sgYm91bmRzXG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WClcbiAgY29uc3Qgc1kwID0gTWF0aC5tYXgoMCwgc3RhcnRZKVxuICBjb25zdCBzWDEgPSBNYXRoLm1pbihtUGl0Y2gsIHN0YXJ0WCArIHcpXG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKG1hc2suaCwgc3RhcnRZICsgaClcblxuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDBcbiAgY29uc3QgZmluYWxIID0gc1kxIC0gc1kwXG5cbiAgaWYgKGZpbmFsVyA8PSAwIHx8IGZpbmFsSCA8PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyA0LiBBbGlnbiBEZXN0aW5hdGlvbiB3aXRoIFNvdXJjZSBDbGlwcGluZ1xuICAvLyBJZiB0aGUgc291cmNlIHdhcyBjbGlwcGVkIG9uIHRoZSB0b3AvbGVmdCwgd2UgbXVzdCBzaGlmdCB0aGUgZGVzdGluYXRpb24gc3RhcnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYXG4gIGNvbnN0IHlTaGlmdCA9IHNZMCAtIHN0YXJ0WVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBkU3RyaWRlID0gZHcgLSBmaW5hbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGZpbmFsV1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gIGxldCBkSWR4ID0gKHkgKyB5U2hpZnQpICogZHcgKyAoeCArIHhTaGlmdClcbiAgbGV0IG1JZHggPSBzWTAgKiBtUGl0Y2ggKyBzWDBcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGZpbmFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBmaW5hbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBtYXNrRGF0YVttSWR4XVxuICAgICAgY29uc3QgaXNNYXNrZWRPdXQgPSBpbnZlcnRNYXNrID8gbVZhbCAhPT0gMCA6IG1WYWwgPT09IDBcblxuICAgICAgaWYgKGlzTWFza2VkT3V0KSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkSWR4XVxuICAgICAgICBjb25zdCBuZXh0ID0gKGN1cnJlbnQgJiAweDAwZmZmZmZmKSA+Pj4gMFxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dFxuICAgICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChnbG9iYWxBbHBoYSAhPT0gMjU1KSB7XG4gICAgICAgIGNvbnN0IGQgPSBkc3QzMltkSWR4XVxuICAgICAgICBjb25zdCBkYSA9IGQgPj4+IDI0XG5cbiAgICAgICAgaWYgKGRhICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgZmluYWxBbHBoYSA9IGRhID09PSAyNTUgPyBnbG9iYWxBbHBoYSA6IChkYSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICAgICAgY29uc3QgbmV4dCA9ICgoZCAmIDB4MDBmZmZmZmYpIHwgKGZpbmFsQWxwaGEgPDwgMjQpKSA+Pj4gMFxuICAgICAgICAgIGlmIChkICE9PSBuZXh0KSB7XG4gICAgICAgICAgICBkc3QzMltkSWR4XSA9IG5leHRcbiAgICAgICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxuXG4gIHJldHVybiBkaWRDaGFuZ2Vcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 = {}): boolean {\n let target = writer.config.target;\n const {\n x = 0,\n y = 0,\n w = target.width,\n h = target.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(applyBinaryMaskToPixelData(target, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYXBwbHlCaW5hcnlNYXNrKG1hc2s6IEJpbmFyeU1hc2ssIG9wdHM6IEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gICAgICBsZXQgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gdGFyZ2V0LndpZHRoLFxuICAgICAgICBoID0gdGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cykpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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=","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 if (imageData === null || imageData.width !== width || imageData.height !== height) {\n imageData = new ImageData(width, height);\n } else {\n imageData.data.fill(0);\n }\n return imageData!;\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUmV1c2FibGVJbWFnZURhdGEgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlUmV1c2FibGVJbWFnZURhdGE+XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIGEgc2luZ2xlLCByZXVzYWJsZSBJbWFnZURhdGEgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIHVzZWQgdG8gbWluaW1pemUgZ2FyYmFnZSBjb2xsZWN0aW9uIG92ZXJoZWFkIGJ5IHJlY3ljbGluZyB0aGVcbiAqIHVuZGVybHlpbmcgcGl4ZWwgYnVmZmVyIGFjcm9zcyBtdWx0aXBsZSBvcGVyYXRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJldHVybnMgYSBwb29sZWQgSW1hZ2VEYXRhIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJldXNhYmxlSW1hZ2VEYXRhKCkge1xuICBsZXQgaW1hZ2VEYXRhOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gSW1hZ2VEYXRhIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucy5cbiAgICogSWYgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGRpZmZlciBmcm9tIHRoZSBjYWNoZWQgaW5zdGFuY2UsIGEgbmV3IG9uZSBpcyBhbGxvY2F0ZWQuXG4gICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscy5cbiAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBpbiBwaXhlbHMuXG4gICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgYWxsb2NhdGVkIEltYWdlRGF0YSBvYmplY3QuXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UmV1c2FibGVJbWFnZURhdGEod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBpZiAoaW1hZ2VEYXRhID09PSBudWxsIHx8IGltYWdlRGF0YS53aWR0aCAhPT0gd2lkdGggfHwgaW1hZ2VEYXRhLmhlaWdodCAhPT0gaGVpZ2h0KSB7XG4gICAgICBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlRGF0YS5kYXRhLmZpbGwoMClcbiAgICB9XG5cbiAgICByZXR1cm4gaW1hZ2VEYXRhIVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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==","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 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 { 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 { ImageDataLike, IPixelData } from '../_types';\nimport { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array';\nexport class PixelData<T extends ImageDataLike = ImageData> implements IPixelData<T> {\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//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlLCBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgaW1hZ2VEYXRhVG9VSW50MzJBcnJheSB9IGZyb20gJy4uL0ltYWdlRGF0YS9pbWFnZURhdGFUb1VJbnQzMkFycmF5J1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxEYXRhPFQgZXh0ZW5kcyBJbWFnZURhdGFMaWtlID0gSW1hZ2VEYXRhPiBpbXBsZW1lbnRzIElQaXhlbERhdGE8VD4ge1xuICByZWFkb25seSBkYXRhMzI6IFVpbnQzMkFycmF5XG4gIHJlYWRvbmx5IGltYWdlRGF0YTogVFxuICByZWFkb25seSB3aWR0aDogbnVtYmVyXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IoaW1hZ2VEYXRhOiBUKSB7XG4gICAgdGhpcy5kYXRhMzIgPSBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YSlcbiAgICB0aGlzLmltYWdlRGF0YSA9IGltYWdlRGF0YVxuICAgIHRoaXMud2lkdGggPSBpbWFnZURhdGEud2lkdGhcbiAgICB0aGlzLmhlaWdodCA9IGltYWdlRGF0YS5oZWlnaHRcbiAgfVxuXG4gIHNldChpbWFnZURhdGE6IFQpOiB2b2lkIHtcbiAgICA7KHRoaXMgYXMgYW55KS5pbWFnZURhdGEgPSBpbWFnZURhdGFcbiAgICA7KHRoaXMgYXMgYW55KS5kYXRhMzIgPSBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YSlcbiAgICA7KHRoaXMgYXMgYW55KS53aWR0aCA9IGltYWdlRGF0YS53aWR0aFxuICAgIDsodGhpcyBhcyBhbnkpLmhlaWdodCA9IGltYWdlRGF0YS5oZWlnaHRcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 IPixelData32} 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 * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelDataAlphaMask(dst: IPixelData32, color: Color32, mask: AlphaMask, opts: ColorBlendMaskOptions = {}): boolean {\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 false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\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 false;\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 isOpaque = globalAlpha === 255;\n const colorRGB = color & 0x00ffffff;\n let didChange = 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 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 const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIENvbG9yMzIsIENvbG9yQmxlbmRNYXNrT3B0aW9ucywgSVBpeGVsRGF0YTMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5cbi8qKlxuICogQmxlbmRzIGEgc29saWQgY29sb3IgaW50byBhIHRhcmdldCBwaXhlbCBidWZmZXIgdXNpbmcgYW4gYWxwaGEgbWFzay5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlIHdpZHRoIChgd2ApIG9yIGhlaWdodCAoYGhgKSBhcmUgb21pdHRlZCBmcm9tIHRoZSBvcHRpb25zLCB0aGV5IHdpbGwgc2FmZWx5XG4gKiBkZWZhdWx0IHRvIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBwcm92aWRlZCBtYXNrIHRvIHByZXZlbnQgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzLlxuICpcbiAqIEBwYXJhbSBkc3QgLSBUaGUgZGVzdGluYXRpb24ge0BsaW5rIElQaXhlbERhdGEzMn0gYnVmZmVyIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSBzb2xpZCBjb2xvciB0byBhcHBseS5cbiAqIEBwYXJhbSBtYXNrIC0gVGhlIG1hc2sgZGVmaW5pbmcgdGhlIHBlci1waXhlbCBvcGFjaXR5IG9mIHRoZSB0YXJnZXQgYXJlYS5cbiAqIEBwYXJhbSBvcHRzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBwbGFjZW1lbnQgY29vcmRpbmF0ZXMsIGJvdW5kcywgZ2xvYmFsIGFscGhhLCBhbmQgbWFzayBvZmZzZXRzLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgY29sb3I6IENvbG9yMzIsXG4gIG1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogQ29sb3JCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHMueCA/PyAwXG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzLnkgPz8gMFxuICBjb25zdCB3ID0gb3B0cy53ID8/IG1hc2sud1xuICBjb25zdCBoID0gb3B0cy5oID8/IG1hc2suaFxuICBjb25zdCBnbG9iYWxBbHBoYSA9IG9wdHMuYWxwaGEgPz8gMjU1XG4gIGNvbnN0IGJsZW5kRm4gPSBvcHRzLmJsZW5kRm4gPz8gc291cmNlT3ZlclBlcmZlY3RcbiAgY29uc3QgbXggPSBvcHRzLm14ID8/IDBcbiAgY29uc3QgbXkgPSBvcHRzLm15ID8/IDBcbiAgY29uc3QgaW52ZXJ0TWFzayA9IG9wdHMuaW52ZXJ0TWFzayA/PyBmYWxzZVxuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgYmFzZVNyY0FscGhhID0gKGNvbG9yID4+PiAyNClcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlIHx8IGZhbHNlXG5cbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVybiBmYWxzZVxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IGFjdHVhbFcgPSB3XG4gIGxldCBhY3R1YWxIID0gaFxuXG4gIGlmICh4IDwgMCkge1xuICAgIGFjdHVhbFcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBhY3R1YWxIICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgYWN0dWFsVyA9IE1hdGgubWluKGFjdHVhbFcsIGRzdC53aWR0aCAtIHgpXG4gIGFjdHVhbEggPSBNYXRoLm1pbihhY3R1YWxILCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgZHggPSAoeCAtIHRhcmdldFgpIHwgMFxuICBjb25zdCBkeSA9ICh5IC0gdGFyZ2V0WSkgfCAwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sud1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gIGxldCBkSWR4ID0gKHkgKiBkdyArIHgpIHwgMFxuICBsZXQgbUlkeCA9ICgobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkpIHwgMFxuXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGNvbG9yUkdCID0gY29sb3IgJiAweDAwZmZmZmZmXG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBtYXNrRGF0YVttSWR4XVxuICAgICAgY29uc3QgZWZmTSA9IGludmVydE1hc2sgPyAyNTUgLSBtVmFsIDogbVZhbFxuXG4gICAgICBpZiAoZWZmTSA9PT0gMCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCB3ZWlnaHQgPSBnbG9iYWxBbHBoYVxuXG4gICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZWZmTVxuICAgICAgfSBlbHNlIGlmIChlZmZNICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gKGVmZk0gKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgfVxuXG4gICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gY29sb3JcblxuICAgICAgaWYgKHdlaWdodCA8IDI1NSkge1xuICAgICAgICBjb25zdCBhID0gKGJhc2VTcmNBbHBoYSAqIHdlaWdodCArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBtSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChjb2xvclJHQiB8IChhIDw8IDI0KSkgPj4+IDApIGFzIENvbG9yMzJcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzJcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGZpbmFsQ29sLCBjdXJyZW50KVxuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICBkc3QzMltkSWR4XSA9IG5leHRcbiAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBkSWR4KytcbiAgICAgIG1JZHgrK1xuICAgIH1cblxuICAgIGRJZHggKz0gZFN0cmlkZVxuICAgIG1JZHggKz0gbVN0cmlkZVxuICB9XG5cbiAgcmV0dXJuIGRpZENoYW5nZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 IPixelData32} 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 * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelDataBinaryMask(dst: IPixelData32, color: Color32, mask: BinaryMask, opts: ColorBlendMaskOptions = {}): boolean {\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 false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\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 false;\n let baseColorWithGlobalAlpha = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return false;\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 let didChange = false;\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 const current = dst32[dIdx] as Color32;\n const next = blendFn(baseColorWithGlobalAlpha, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBDb2xvckJsZW5kTWFza09wdGlvbnMsIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG4vKipcbiAqIEJsZW5kcyBhIHNvbGlkIGNvbG9yIGludG8gYSB0YXJnZXQgcGl4ZWwgYnVmZmVyIHVzaW5nIGEgYmluYXJ5IG1hc2suXG4gKlxuICogQHJlbWFya3NcbiAqIElmIHRoZSB3aWR0aCAoYHdgKSBvciBoZWlnaHQgKGBoYCkgYXJlIG9taXR0ZWQgZnJvbSB0aGUgb3B0aW9ucywgdGhleSB3aWxsIHNhZmVseVxuICogZGVmYXVsdCB0byB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcHJvdmlkZWQgbWFzayB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzcy5cbiAqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIGRlc3RpbmF0aW9uIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgc29saWQgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gbWFzayAtIFRoZSBtYXNrIGRlZmluaW5nIHRoZSBwZXItcGl4ZWwgb3BhY2l0eSBvZiB0aGUgdGFyZ2V0IGFyZWEuXG4gKiBAcGFyYW0gb3B0cyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgcGxhY2VtZW50IGNvb3JkaW5hdGVzLCBib3VuZHMsIGdsb2JhbCBhbHBoYSwgYW5kIG1hc2sgb2Zmc2V0cy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2soXG4gIGRzdDogSVBpeGVsRGF0YTMyLFxuICBjb2xvcjogQ29sb3IzMixcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgb3B0czogQ29sb3JCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHMueCA/PyAwXG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzLnkgPz8gMFxuICBsZXQgdyA9IG9wdHMudyA/PyBtYXNrLndcbiAgbGV0IGggPSBvcHRzLmggPz8gbWFzay5oXG4gIGNvbnN0IGdsb2JhbEFscGhhID0gb3B0cy5hbHBoYSA/PyAyNTVcbiAgY29uc3QgYmxlbmRGbiA9IG9wdHMuYmxlbmRGbiA/PyBzb3VyY2VPdmVyUGVyZmVjdFxuICBjb25zdCBteCA9IG9wdHMubXggPz8gMFxuICBjb25zdCBteSA9IG9wdHMubXkgPz8gMFxuICBjb25zdCBpbnZlcnRNYXNrID0gb3B0cy5pbnZlcnRNYXNrID8/IGZhbHNlXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2VcblxuICBpZiAoYmFzZVNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSA9IGNvbG9yXG5cbiAgaWYgKGdsb2JhbEFscGhhIDwgMjU1KSB7XG4gICAgY29uc3QgYSA9IChiYXNlU3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuIGZhbHNlXG4gICAgYmFzZUNvbG9yV2l0aEdsb2JhbEFscGhhID0gKChjb2xvciAmIDB4MDBmZmZmZmYpIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gIH1cblxuICBjb25zdCBkeCA9ICh4IC0gdGFyZ2V0WCkgfCAwXG4gIGNvbnN0IGR5ID0gKHkgLSB0YXJnZXRZKSB8IDBcbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sud1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IG1JZHggPSAoKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpKSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IG1TdHJpZGUgPSAobVBpdGNoIC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNraXBWYWwgPSBpbnZlcnRNYXNrID8gMSA6IDBcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgaWYgKG1hc2tEYXRhW21JZHhdID09PSBza2lwVmFsKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzJcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSwgY3VycmVudClcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxuXG4gIHJldHVybiBkaWRDaGFuZ2Vcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { BlendColor32 } from '../_types';\nimport { blendPixelData } from './blendPixelData';\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: undefined as BlendColor32 | undefined\n};\nexport function blendPixelDataPaintBuffer(paintBuffer: PaintBuffer, target: IPixelData32, alpha = 255, blendFn?: BlendColor32, blendPixelDataFn = blendPixelData): void {\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const x = tile.tx << tileShift;\n const y = tile.ty << tileShift;\n SCRATCH_OPTS.x = x;\n SCRATCH_OPTS.y = y;\n SCRATCH_OPTS.alpha = alpha;\n SCRATCH_OPTS.blendFn = blendFn;\n blendPixelDataFn(target, tile, SCRATCH_OPTS);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhIH0gZnJvbSAnLi9ibGVuZFBpeGVsRGF0YSdcbmltcG9ydCB0eXBlIHsgUGFpbnRCdWZmZXIgfSBmcm9tICcuLi9QYWludC9QYWludEJ1ZmZlcidcblxuY29uc3QgU0NSQVRDSF9PUFRTID0ge1xuICB4OiAwLFxuICB5OiAwLFxuICBhbHBoYTogMjU1LFxuICBibGVuZEZuOiB1bmRlZmluZWQgYXMgQmxlbmRDb2xvcjMyIHwgdW5kZWZpbmVkLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGFQYWludEJ1ZmZlcihcbiAgcGFpbnRCdWZmZXI6IFBhaW50QnVmZmVyLFxuICB0YXJnZXQ6IElQaXhlbERhdGEzMixcbiAgYWxwaGEgPSAyNTUsXG4gIGJsZW5kRm4/OiBCbGVuZENvbG9yMzIsXG4gIGJsZW5kUGl4ZWxEYXRhRm4gPSBibGVuZFBpeGVsRGF0YSxcbik6IHZvaWQge1xuICBjb25zdCB0aWxlU2hpZnQgPSBwYWludEJ1ZmZlci5jb25maWcudGlsZVNoaWZ0XG4gIGNvbnN0IGxvb2t1cCA9IHBhaW50QnVmZmVyLmxvb2t1cFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV1cblxuICAgIGlmICh0aWxlKSB7XG4gICAgICBjb25zdCB4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnRcbiAgICAgIGNvbnN0IHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdFxuXG4gICAgICBTQ1JBVENIX09QVFMueCA9IHhcbiAgICAgIFNDUkFUQ0hfT1BUUy55ID0geVxuICAgICAgU0NSQVRDSF9PUFRTLmFscGhhID0gYWxwaGFcbiAgICAgIFNDUkFUQ0hfT1BUUy5ibGVuZEZuID0gYmxlbmRGblxuXG4gICAgICBibGVuZFBpeGVsRGF0YUZuKHRhcmdldCwgdGlsZSwgU0NSQVRDSF9PUFRTKVxuICAgIH1cbiAgfVxufVxuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { fillPixelDataFast } from './fillPixelDataFast';\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelData.\n */\nexport function clearPixelData(dst: IPixelData32, rect?: Partial<BinaryMaskRect>): void {\n fillPixelDataFast(dst, 0 as Color32, rect);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrUmVjdCwgQ29sb3IzMiwgSVBpeGVsRGF0YTMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZmlsbFBpeGVsRGF0YUZhc3QgfSBmcm9tICcuL2ZpbGxQaXhlbERhdGFGYXN0J1xuXG4vKipcbiAqIENsZWFycyBhIHJlZ2lvbiBvZiB0aGUgUGl4ZWxEYXRhIHRvIHRyYW5zcGFyZW50ICgweDAwMDAwMDAwKS5cbiAqIEludGVybmFsbHkgdXNlcyB0aGUgb3B0aW1pemVkIGZpbGxQaXhlbERhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIHJlY3Q/OiBQYXJ0aWFsPEJpbmFyeU1hc2tSZWN0Pixcbik6IHZvaWQge1xuICBmaWxsUGl4ZWxEYXRhRmFzdChkc3QsIDAgYXMgQ29sb3IzMiwgcmVjdClcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32, rect: Rect): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData32, x: number, y: number, w: number, h: number): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData32, _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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfQkxJVCA9IG1ha2VDbGlwcGVkQmxpdCgpXG5cbi8qKlxuICogRXh0cmFjdHMgYSByZWN0YW5ndWxhciByZWdpb24gb2YgcGl4ZWxzIGZyb20gUGl4ZWxEYXRhLlxuICogUmV0dXJucyBhIG5ldyBVaW50MzJBcnJheSBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgcGl4ZWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcihzb3VyY2U6IElQaXhlbERhdGEzMiwgcmVjdDogUmVjdCk6IFVpbnQzMkFycmF5XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcihzb3VyY2U6IElQaXhlbERhdGEzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogVWludDMyQXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKFxuICBzb3VyY2U6IElQaXhlbERhdGEzMixcbiAgX3g6IFJlY3QgfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gdHlwZW9mIF94ID09PSAnb2JqZWN0J1xuICAgID8gX3hcbiAgICA6IHsgeDogX3gsIHk6IF95ISwgdzogX3chLCBoOiBfaCEgfVxuXG4gIGNvbnN0IHNyY1cgPSBzb3VyY2Uud2lkdGhcbiAgY29uc3Qgc3JjSCA9IHNvdXJjZS5oZWlnaHRcbiAgY29uc3Qgc3JjRGF0YSA9IHNvdXJjZS5kYXRhMzJcblxuICAvLyBTYWZldHkgY2hlY2sgZm9yIGVtcHR5IG9yIGludmFsaWQgZGltZW5zaW9uc1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkoMClcbiAgfVxuXG4gIGNvbnN0IGRzdERhdGEgPSBuZXcgVWludDMyQXJyYXkodyAqIGgpXG5cbiAgLy8gV2UgbWFwIGZyb20gU291cmNlIChzcmNXLCBzcmNIKSBhdCAoeCx5KVxuICAvLyBUbyBEZXN0ICh3LCBoKSBhdCAoMCwwKVxuICAvLyBOb3RlOiByZXNvbHZlQmxpdENsaXBwaW5nIHVzdWFsbHkgdGFrZXMgKGRzdFgsIGRzdFksIHNyY1gsIHNyY1kuLi4pXG4gIC8vIEhlcmUgd2UgYXJlIFwiYmxpdHRpbmdcIiBGUk9NIHgseSBUTyAwLDAuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIDAsXG4gICAgMCxcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoLFxuICAgIHcsXG4gICAgaCxcbiAgICBzcmNXLFxuICAgIHNyY0gsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZHN0RGF0YVxuXG4gIGNvbnN0IHtcbiAgICB4OiBkc3RYLFxuICAgIHk6IGRzdFksXG4gICAgc3g6IHNyY1gsXG4gICAgc3k6IHNyY1ksXG4gICAgdzogY29weVcsXG4gICAgaDogY29weUgsXG4gIH0gPSBjbGlwXG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29weUg7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSArIHJvdykgKiBzcmNXICsgc3JjWFxuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKyByb3cpICogdyArIGRzdFhcblxuICAgIC8vIFBlcmZvcm0gdGhlIGhpZ2gtc3BlZWQgMzItYml0IGJ1bGsgY29weVxuICAgIGNvbnN0IGNodW5rID0gc3JjRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5VylcbiAgICBkc3REYXRhLnNldChjaHVuaywgZHN0U3RhcnQpXG4gIH1cblxuICByZXR1cm4gZHN0RGF0YVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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: IPixelData32, rect: Rect): PixelData;\nexport function extractPixelData(source: IPixelData32, x: number, y: number, w: number, h: number): PixelData;\nexport function extractPixelData(source: IPixelData32, _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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyIH0gZnJvbSAnLi9leHRyYWN0UGl4ZWxEYXRhQnVmZmVyJ1xuaW1wb3J0IHsgUGl4ZWxEYXRhIH0gZnJvbSAnLi9QaXhlbERhdGEnXG5cbi8qKlxuICogSGlnaC1sZXZlbCBleHRyYWN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBQaXhlbERhdGEgaW5zdGFuY2UuXG4gKiBMZXZlcmFnZXMgZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlciBmb3Igb3B0aW1pemVkIDMyLWJpdCBtZW1vcnkgbW92ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhKHNvdXJjZTogSVBpeGVsRGF0YTMyLCByZWN0OiBSZWN0KTogUGl4ZWxEYXRhXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShzb3VyY2U6IElQaXhlbERhdGEzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogUGl4ZWxEYXRhXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShcbiAgc291cmNlOiBJUGl4ZWxEYXRhMzIsXG4gIF94OiBSZWN0IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogUGl4ZWxEYXRhIHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDogeyB4OiBfeCwgeTogX3khLCB3OiBfdyEsIGg6IF9oISB9XG5cbiAgY29uc3QgcmVzdWx0ID0gbmV3IFBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKHcsIGgpKVxuXG4gIGNvbnN0IGJ1ZmZlciA9IGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlLCB4LCB5LCB3LCBoKVxuICByZXN1bHQuZGF0YTMyLnNldChidWZmZXIpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { IPixelData32 } from '../_types';\nexport class PixelBuffer32 implements IPixelData32 {\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBjbGFzcyBQaXhlbEJ1ZmZlcjMyIGltcGxlbWVudHMgSVBpeGVsRGF0YTMyIHtcbiAgcmVhZG9ubHkgZGF0YTMyOiBVaW50MzJBcnJheVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHdpZHRoOiBudW1iZXIsXG4gICAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGF0YTMyPzogVWludDMyQXJyYXksXG4gICkge1xuICAgIHRoaXMuZGF0YTMyID0gZGF0YTMyID8/IG5ldyBVaW50MzJBcnJheSh3aWR0aCAqIGhlaWdodClcbiAgfVxuXG4gIHNldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YTMyPzogVWludDMyQXJyYXkpOiB2b2lkIHtcbiAgICA7KHRoaXMgYXMgYW55KS5kYXRhMzIgPSBkYXRhMzIgPz8gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KVxuICAgIDsodGhpcyBhcyBhbnkpLndpZHRoID0gd2lkdGhcbiAgICA7KHRoaXMgYXMgYW55KS5oZWlnaHQgPSBoZWlnaHRcbiAgfVxuXG4gIGNvcHkoKTogUGl4ZWxCdWZmZXIzMiB7XG4gICAgY29uc3QgbmV3RGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuZGF0YTMyKVxuICAgIHJldHVybiBuZXcgUGl4ZWxCdWZmZXIzMihcbiAgICAgIHRoaXMud2lkdGgsXG4gICAgICB0aGlzLmhlaWdodCxcbiAgICAgIG5ld0RhdGEzMixcbiAgICApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32): 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IG1ha2VBbHBoYU1hc2sgfSBmcm9tICcuLi9NYXNrL0FscGhhTWFzaydcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYWxwaGEgY2hhbm5lbCBmcm9tIFBpeGVsRGF0YSBpbnRvIGEgc2luZ2xlLWNoYW5uZWwgbWFzay5cbiAqIFJldHVybnMgYSBVaW50OEFycmF5IGJyYW5kZWQgYXMgQWxwaGFNYXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxEYXRhVG9BbHBoYU1hc2soXG4gIHBpeGVsRGF0YTogSVBpeGVsRGF0YTMyLFxuKTogQWxwaGFNYXNrIHtcbiAgY29uc3Qge1xuICAgIGRhdGEzMixcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH0gPSBwaXhlbERhdGFcbiAgY29uc3QgbGVuID0gZGF0YTMyLmxlbmd0aFxuICBjb25zdCBtYXNrID0gbWFrZUFscGhhTWFzayh3aWR0aCwgaGVpZ2h0KVxuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhMzJbaV1cblxuICAgIC8vIEV4dHJhY3QgdGhlIEFscGhhIGJ5dGUgKHRvcCA4IGJpdHMgaW4gQUJHUiAvIExpdHRsZS1FbmRpYW4pXG4gICAgLy8gU2hpZnQgcmlnaHQgYnkgMjQgbW92ZXMgdGhlIDR0aCBieXRlIHRvIHRoZSAxc3QgcG9zaXRpb25cbiAgICBtYXNrRGF0YVtpXSA9ICh2YWwgPj4+IDI0KSAmIDB4ZmZcbiAgfVxuXG4gIHJldHVybiBtYXNrXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function reflectPixelDataHorizontal(pixelData: IPixelData32): 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: IPixelData32): 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0UGl4ZWxEYXRhSG9yaXpvbnRhbChwaXhlbERhdGE6IElQaXhlbERhdGEzMik6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aFxuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTMyXG4gIGNvbnN0IGhhbGZXaWR0aCA9IE1hdGguZmxvb3Iod2lkdGggLyAyKVxuXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCByb3dPZmZzZXQgPSB5ICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgaGFsZldpZHRoOyB4KyspIHtcbiAgICAgIGNvbnN0IGxlZnRJZHggPSByb3dPZmZzZXQgKyB4XG4gICAgICBjb25zdCByaWdodElkeCA9IHJvd09mZnNldCArICh3aWR0aCAtIDEgLSB4KVxuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbbGVmdElkeF1cblxuICAgICAgZGF0YVtsZWZ0SWR4XSA9IGRhdGFbcmlnaHRJZHhdXG4gICAgICBkYXRhW3JpZ2h0SWR4XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3RQaXhlbERhdGFWZXJ0aWNhbChwaXhlbERhdGE6IElQaXhlbERhdGEzMik6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aFxuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTMyXG4gIGNvbnN0IGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIDIpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoYWxmSGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCB0b3BSb3dPZmZzZXQgPSB5ICogd2lkdGhcbiAgICBjb25zdCBib3R0b21Sb3dPZmZzZXQgPSAoaGVpZ2h0IC0gMSAtIHkpICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgdG9wSWR4ID0gdG9wUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgYm90dG9tSWR4ID0gYm90dG9tUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbdG9wSWR4XVxuXG4gICAgICBkYXRhW3RvcElkeF0gPSBkYXRhW2JvdHRvbUlkeF1cbiAgICAgIGRhdGFbYm90dG9tSWR4XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhMzIsIFBpeGVsRGF0YSB9IGZyb20gJy4uL2luZGV4J1xuaW1wb3J0IHsgcmVzYW1wbGUzMiB9IGZyb20gJy4uL0ludGVybmFsL3Jlc2FtcGxlMzInXG5cbi8qKlxuICogUmVzYW1wbGVzIFBpeGVsRGF0YSBieSBhIHNwZWNpZmljIGZhY3RvciB1c2luZyBuZWFyZXN0IG5laWdoYm9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVQaXhlbERhdGEoXG4gIHBpeGVsRGF0YTogSVBpeGVsRGF0YTMyLFxuICBmYWN0b3I6IG51bWJlcixcbik6IFBpeGVsRGF0YSB7XG4gIGNvbnN0IHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9ID0gcmVzYW1wbGUzMihwaXhlbERhdGEuZGF0YTMyLCBwaXhlbERhdGEud2lkdGgsIHBpeGVsRGF0YS5oZWlnaHQsIGZhY3RvcilcblxuICByZXR1cm4gbmV3IFBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKFxuICAgIG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhLmJ1ZmZlcikgYXMgSW1hZ2VEYXRhQXJyYXksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICApKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 IPixelData32} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target buffer.\n */\nexport function writePixelDataBuffer(target: IPixelData32, data: Uint32Array, rect: Rect): void;\nexport function writePixelDataBuffer(target: IPixelData32, data: Uint32Array, x: number, y: number, w: number, h: number): void;\nexport function writePixelDataBuffer(target: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhMzIsIHR5cGUgUmVjdCB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IG1ha2VDbGlwcGVkQmxpdCwgcmVzb2x2ZUJsaXRDbGlwcGluZyB9IGZyb20gJy4uL0ludGVybmFsL3Jlc29sdmVDbGlwcGluZydcblxuY29uc3QgU0NSQVRDSF9CTElUID0gbWFrZUNsaXBwZWRCbGl0KClcblxuLyoqXG4gKiBDb3BpZXMgYSBwaXhlbCBidWZmZXIgaW50byBhIHNwZWNpZmljIHJlZ2lvbiBvZiBhIHtAbGluayBJUGl4ZWxEYXRhMzJ9IG9iamVjdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZGlyZWN0IG1lbW9yeSBjb3B5IGZyb20gYSB7QGxpbmsgVWludDMyQXJyYXl9XG4gKiBpbnRvIHRoZSB0YXJnZXQgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQaXhlbERhdGFCdWZmZXIoXG4gIHRhcmdldDogSVBpeGVsRGF0YTMyLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgcmVjdDogUmVjdCxcbik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhMzIsXG4gIGRhdGE6IFVpbnQzMkFycmF5LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQaXhlbERhdGFCdWZmZXIoXG4gIHRhcmdldDogSVBpeGVsRGF0YTMyLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgX3g6IFJlY3QgfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDoge1xuICAgICAgeDogX3gsXG4gICAgICB5OiBfeSEsXG4gICAgICB3OiBfdyEsXG4gICAgICBoOiBfaCEsXG4gICAgfVxuXG4gIGNvbnN0IGRzdFcgPSB0YXJnZXQud2lkdGhcbiAgY29uc3QgZHN0SCA9IHRhcmdldC5oZWlnaHRcbiAgY29uc3QgZHN0RGF0YSA9IHRhcmdldC5kYXRhMzJcblxuICAvLyB0cmVhdCB0aGUgc291cmNlIGJ1ZmZlciBhcyBhIFNvdXJjZSBJbWFnZSBzdGFydGluZyBhdCAwLDAgd2l0aCBzaXplIHcsaFxuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgICB4LFxuICAgIHksXG4gICAgMCxcbiAgICAwLFxuICAgIHcsXG4gICAgaCxcbiAgICBkc3RXLFxuICAgIGRzdEgsXG4gICAgdyxcbiAgICBoLFxuICAgIFNDUkFUQ0hfQkxJVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuXG5cbiAgY29uc3Qge1xuICAgIHg6IGRzdFgsXG4gICAgeTogZHN0WSxcbiAgICBzeDogc3JjWCxcbiAgICBzeTogc3JjWSxcbiAgICB3OiBjb3B5VyxcbiAgICBoOiBjb3B5SCxcbiAgfSA9IGNsaXBcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICsgcm93KSAqIGRzdFcgKyBkc3RYXG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSArIHJvdykgKiB3ICsgc3JjWFxuXG4gICAgZHN0RGF0YS5zZXQoZGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5VyksIGRzdFN0YXJ0KVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { writePixelDataBuffer } from './writePixelDataBuffer';\n\n/**\n * @param writePixelDataBufferFn - @hidden\n */\nexport function writePaintBufferToPixelData(target: IPixelData, paintBuffer: PaintBuffer, writePixelDataBufferFn = writePixelDataBuffer) {\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n writePixelDataBufferFn(target, tile.data32, dx, dy, tile.width, tile.height);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYWludEJ1ZmZlciB9IGZyb20gJy4uL1BhaW50L1BhaW50QnVmZmVyJ1xuaW1wb3J0IHsgd3JpdGVQaXhlbERhdGFCdWZmZXIgfSBmcm9tICcuL3dyaXRlUGl4ZWxEYXRhQnVmZmVyJ1xuXG4vKipcbiAqIEBwYXJhbSB3cml0ZVBpeGVsRGF0YUJ1ZmZlckZuIC0gQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQYWludEJ1ZmZlclRvUGl4ZWxEYXRhKFxuICB0YXJnZXQ6IElQaXhlbERhdGEsXG4gIHBhaW50QnVmZmVyOiBQYWludEJ1ZmZlcixcbiAgd3JpdGVQaXhlbERhdGFCdWZmZXJGbiA9IHdyaXRlUGl4ZWxEYXRhQnVmZmVyLFxuKSB7XG4gIGNvbnN0IHRpbGVTaGlmdCA9IHBhaW50QnVmZmVyLmNvbmZpZy50aWxlU2hpZnRcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aWxlID0gbG9va3VwW2ldXG5cbiAgICBpZiAodGlsZSkge1xuICAgICAgY29uc3QgZHggPSB0aWxlLnR4IDw8IHRpbGVTaGlmdFxuICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdFxuXG4gICAgICB3cml0ZVBpeGVsRGF0YUJ1ZmZlckZuKHRhcmdldCwgdGlsZS5kYXRhMzIsIGR4LCBkeSwgdGlsZS53aWR0aCwgdGlsZS5oZWlnaHQpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\nexport function makeCirclePaintAlphaMask(size: number, fallOff: (d: number) => number = d => d): PaintAlphaMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const invR = 1 / radius;\n const centerOffset = -Math.ceil(radius - 0.5);\n for (let y = 0; y < size; y++) {\n const rowOffset = y * size;\n const dy = y - radius + 0.5;\n const dy2 = dy * dy;\n for (let x = 0; x < size; x++) {\n const dx = x - radius + 0.5;\n const distSqr = dx * dx + dy2;\n if (distSqr <= radius * radius) {\n const dist = Math.sqrt(distSqr) * invR;\n\n // Pass 1.0 at center, 0.0 at edge\n const strength = fallOff(1 - dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n data[rowOffset + x] = Math.max(0, Math.min(255, intensity));\n }\n }\n }\n }\n return {\n type: MaskType.ALPHA,\n data,\n w: size,\n h: size,\n centerOffsetX: centerOffset,\n centerOffsetY: centerOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUsIHR5cGUgUGFpbnRBbHBoYU1hc2sgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2lyY2xlUGFpbnRBbHBoYU1hc2soc2l6ZTogbnVtYmVyLCBmYWxsT2ZmOiAoZDogbnVtYmVyKSA9PiBudW1iZXIgPSAoZCkgPT4gZCk6IFBhaW50QWxwaGFNYXNrIHtcbiAgY29uc3QgYXJlYSA9IHNpemUgKiBzaXplXG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhcmVhKVxuICBjb25zdCByYWRpdXMgPSBzaXplIC8gMlxuICBjb25zdCBpbnZSID0gMSAvIHJhZGl1c1xuXG4gIGNvbnN0IGNlbnRlck9mZnNldCA9IC1NYXRoLmNlaWwocmFkaXVzIC0gMC41KVxuXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgc2l6ZTsgeSsrKSB7XG4gICAgY29uc3Qgcm93T2Zmc2V0ID0geSAqIHNpemVcbiAgICBjb25zdCBkeSA9IHkgLSByYWRpdXMgKyAwLjVcbiAgICBjb25zdCBkeTIgPSBkeSAqIGR5XG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNpemU7IHgrKykge1xuICAgICAgY29uc3QgZHggPSB4IC0gcmFkaXVzICsgMC41XG4gICAgICBjb25zdCBkaXN0U3FyID0gZHggKiBkeCArIGR5MlxuXG4gICAgICBpZiAoZGlzdFNxciA8PSAocmFkaXVzICogcmFkaXVzKSkge1xuICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5zcXJ0KGRpc3RTcXIpICogaW52UlxuXG4gICAgICAgIC8vIFBhc3MgMS4wIGF0IGNlbnRlciwgMC4wIGF0IGVkZ2VcbiAgICAgICAgY29uc3Qgc3RyZW5ndGggPSBmYWxsT2ZmKDEgLSBkaXN0KVxuICAgICAgICBpZiAoc3RyZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgaW50ZW5zaXR5ID0gKHN0cmVuZ3RoICogMjU1KSB8IDBcbiAgICAgICAgICBkYXRhW3Jvd09mZnNldCArIHhdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBpbnRlbnNpdHkpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5BTFBIQSxcbiAgICBkYXRhLFxuICAgIHc6IHNpemUsXG4gICAgaDogc2l6ZSxcbiAgICBjZW50ZXJPZmZzZXRYOiBjZW50ZXJPZmZzZXQsXG4gICAgY2VudGVyT2Zmc2V0WTogY2VudGVyT2Zmc2V0XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../_types';\nexport function makeCirclePaintBinaryMask(size: number): PaintBinaryMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const centerOffset = -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 centerOffsetX: centerOffset,\n centerOffsetY: centerOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUsIHR5cGUgUGFpbnRCaW5hcnlNYXNrIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNpcmNsZVBhaW50QmluYXJ5TWFzayhzaXplOiBudW1iZXIpOiBQYWludEJpbmFyeU1hc2sge1xuICBjb25zdCBhcmVhID0gc2l6ZSAqIHNpemVcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGFyZWEpXG4gIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyXG5cbiAgY29uc3QgY2VudGVyT2Zmc2V0ID0gLU1hdGguY2VpbChyYWRpdXMgLSAwLjUpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNpemU7IHgrKykge1xuICAgICAgY29uc3QgZHggPSB4IC0gcmFkaXVzICsgMC41XG4gICAgICBjb25zdCBkeSA9IHkgLSByYWRpdXMgKyAwLjVcbiAgICAgIGNvbnN0IGRpc3RTcXIgPSBkeCAqIGR4ICsgZHkgKiBkeVxuICAgICAgaWYgKGRpc3RTcXIgPD0gKHJhZGl1cyAqIHJhZGl1cykpIHtcbiAgICAgICAgZGF0YVt5ICogc2l6ZSArIHhdID0gMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIGRhdGEsXG4gICAgdzogc2l6ZSxcbiAgICBoOiBzaXplLFxuICAgIGNlbnRlck9mZnNldFg6IGNlbnRlck9mZnNldCxcbiAgICBjZW50ZXJPZmZzZXRZOiBjZW50ZXJPZmZzZXQsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../_types';\nexport function makePaintBinaryMask(mask: BinaryMask): PaintBinaryMask {\n return {\n type: MaskType.BINARY,\n data: mask.data,\n w: mask.w,\n h: mask.h,\n centerOffsetX: -((mask.w) >> 1),\n centerOffsetY: -((mask.h) >> 1)\n };\n}\nexport function makePaintAlphaMask(mask: AlphaMask): PaintAlphaMask {\n return {\n type: MaskType.ALPHA,\n data: mask.data,\n w: mask.w,\n h: mask.h,\n centerOffsetX: -((mask.w) >> 1),\n centerOffsetY: -((mask.h) >> 1)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQmluYXJ5TWFzaywgTWFza1R5cGUsIHR5cGUgUGFpbnRBbHBoYU1hc2ssIHR5cGUgUGFpbnRCaW5hcnlNYXNrIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFjcm9faGFsZkFuZEZsb29yIH0gZnJvbSAnLi4vSW50ZXJuYWwvaGVscGVycydcblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWludEJpbmFyeU1hc2soXG4gIG1hc2s6IEJpbmFyeU1hc2ssXG4pOiBQYWludEJpbmFyeU1hc2sge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkJJTkFSWSxcbiAgICBkYXRhOiBtYXNrLmRhdGEsXG4gICAgdzogbWFzay53LFxuICAgIGg6IG1hc2suaCxcbiAgICBjZW50ZXJPZmZzZXRYOiAtbWFjcm9faGFsZkFuZEZsb29yKG1hc2sudyksXG4gICAgY2VudGVyT2Zmc2V0WTogLW1hY3JvX2hhbGZBbmRGbG9vcihtYXNrLmgpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFpbnRBbHBoYU1hc2soXG4gIG1hc2s6IEFscGhhTWFzayxcbik6IFBhaW50QWxwaGFNYXNrIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5BTFBIQSxcbiAgICBkYXRhOiBtYXNrLmRhdGEsXG4gICAgdzogbWFzay53LFxuICAgIGg6IG1hc2suaCxcbiAgICBjZW50ZXJPZmZzZXRYOiAtbWFjcm9faGFsZkFuZEZsb29yKG1hc2sudyksXG4gICAgY2VudGVyT2Zmc2V0WTogLW1hY3JvX2hhbGZBbmRGbG9vcihtYXNrLmgpLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\nimport { macro_halfAndFloor } from '../Internal/helpers';\nexport function makeRectFalloffPaintAlphaMask(width: number, height: number, fallOff: (d: number) => number = d => d): PaintAlphaMask {\n const fPx = Math.floor(width / 2);\n const fPy = Math.floor(height / 2);\n const invHalfW = 2 / width;\n const invHalfH = 2 / height;\n const offX = width % 2 === 0 ? 0.5 : 0;\n const offY = height % 2 === 0 ? 0.5 : 0;\n const area = width * height;\n const data = new Uint8Array(area);\n for (let y = 0; y < height; y++) {\n const dy = Math.abs(y - fPy + offY) * invHalfH;\n const rowOffset = y * width;\n for (let x = 0; x < width; x++) {\n const dx = Math.abs(x - fPx + offX) * invHalfW;\n\n // Chebyshev distance (square/rect shape)\n const dist = dx > dy ? dx : dy;\n // Pass 1.0 at center, 0.0 at edge\n const strength = fallOff(1 - dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n data[rowOffset + x] = Math.max(0, Math.min(255, intensity));\n }\n }\n }\n return {\n type: MaskType.ALPHA,\n data: data,\n w: width,\n h: height,\n centerOffsetX: -macro_halfAndFloor(width),\n centerOffsetY: -macro_halfAndFloor(height)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUsIHR5cGUgUGFpbnRBbHBoYU1hc2sgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWNyb19oYWxmQW5kRmxvb3IgfSBmcm9tICcuLi9JbnRlcm5hbC9oZWxwZXJzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlY3RGYWxsb2ZmUGFpbnRBbHBoYU1hc2soXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBmYWxsT2ZmOiAoZDogbnVtYmVyKSA9PiBudW1iZXIgPSAoZCkgPT4gZCxcbik6IFBhaW50QWxwaGFNYXNrIHtcbiAgY29uc3QgZlB4ID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpXG4gIGNvbnN0IGZQeSA9IE1hdGguZmxvb3IoaGVpZ2h0IC8gMilcblxuICBjb25zdCBpbnZIYWxmVyA9IDIgLyB3aWR0aFxuICBjb25zdCBpbnZIYWxmSCA9IDIgLyBoZWlnaHRcblxuICBjb25zdCBvZmZYID0gKHdpZHRoICUgMiA9PT0gMCkgPyAwLjUgOiAwXG4gIGNvbnN0IG9mZlkgPSAoaGVpZ2h0ICUgMiA9PT0gMCkgPyAwLjUgOiAwXG5cbiAgY29uc3QgYXJlYSA9IHdpZHRoICogaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhcmVhKVxuXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCBkeSA9IE1hdGguYWJzKCh5IC0gZlB5KSArIG9mZlkpICogaW52SGFsZkhcbiAgICBjb25zdCByb3dPZmZzZXQgPSB5ICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgZHggPSBNYXRoLmFicygoeCAtIGZQeCkgKyBvZmZYKSAqIGludkhhbGZXXG5cbiAgICAgIC8vIENoZWJ5c2hldiBkaXN0YW5jZSAoc3F1YXJlL3JlY3Qgc2hhcGUpXG4gICAgICBjb25zdCBkaXN0ID0gZHggPiBkeSA/IGR4IDogZHlcbiAgICAgIC8vIFBhc3MgMS4wIGF0IGNlbnRlciwgMC4wIGF0IGVkZ2VcbiAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZigxIC0gZGlzdClcbiAgICAgIGlmIChzdHJlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaW50ZW5zaXR5ID0gKHN0cmVuZ3RoICogMjU1KSB8IDBcbiAgICAgICAgZGF0YVtyb3dPZmZzZXQgKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgaW50ZW5zaXR5KSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkFMUEhBLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgdzogd2lkdGgsXG4gICAgaDogaGVpZ2h0LFxuICAgIGNlbnRlck9mZnNldFg6IC1tYWNyb19oYWxmQW5kRmxvb3Iod2lkdGgpLFxuICAgIGNlbnRlck9mZnNldFk6IC1tYWNyb19oYWxmQW5kRmxvb3IoaGVpZ2h0KSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { CANVAS_CTX_FAILED } from '../Canvas/_constants';\nexport type PaintBufferCanvasRenderer = ReturnType<typeof makePaintBufferCanvasRenderer>;\n\n/**\n *\n * @param offscreenCanvasClass - @internal\n */\nexport function makePaintBufferCanvasRenderer(paintBuffer: PaintBuffer, offscreenCanvasClass = OffscreenCanvas) {\n const config = paintBuffer.config;\n const tileSize = config.tileSize;\n const tileShift = config.tileShift;\n const lookup = paintBuffer.lookup;\n const canvas = new offscreenCanvasClass(tileSize, tileSize);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\n return function drawPaintBuffer(targetCtx: CanvasRenderingContext2D, alpha = 255, compOperation: GlobalCompositeOperation = 'source-over'): void {\n targetCtx.globalAlpha = alpha / 255;\n targetCtx.globalCompositeOperation = compOperation;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n ctx.putImageData(tile.imageData, 0, 0);\n targetCtx.drawImage(canvas, dx, dy);\n }\n }\n targetCtx.globalAlpha = 1;\n targetCtx.globalCompositeOperation = 'source-over';\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuLi9DYW52YXMvX2NvbnN0YW50cydcbmltcG9ydCB0eXBlIHsgUGFpbnRCdWZmZXIgfSBmcm9tICcuL1BhaW50QnVmZmVyJ1xuXG5leHBvcnQgdHlwZSBQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZVBhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXI+XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBvZmZzY3JlZW5DYW52YXNDbGFzcyAtIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIoXG4gIHBhaW50QnVmZmVyOiBQYWludEJ1ZmZlcixcbiAgb2Zmc2NyZWVuQ2FudmFzQ2xhc3MgPSBPZmZzY3JlZW5DYW52YXMsXG4pIHtcbiAgY29uc3QgY29uZmlnID0gcGFpbnRCdWZmZXIuY29uZmlnXG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplXG4gIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnRcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwXG4gIGNvbnN0IGNhbnZhcyA9IG5ldyBvZmZzY3JlZW5DYW52YXNDbGFzcyh0aWxlU2l6ZSwgdGlsZVNpemUpXG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpXG4gIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZVxuXG4gIHJldHVybiBmdW5jdGlvbiBkcmF3UGFpbnRCdWZmZXIoXG4gICAgdGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgYWxwaGEgPSAyNTUsXG4gICAgY29tcE9wZXJhdGlvbjogR2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJyxcbiAgKTogdm9pZCB7XG5cbiAgICB0YXJnZXRDdHguZ2xvYmFsQWxwaGEgPSBhbHBoYSAvIDI1NVxuICAgIHRhcmdldEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjb21wT3BlcmF0aW9uXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGlsZSA9IGxvb2t1cFtpXVxuXG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkeCA9IHRpbGUudHggPDwgdGlsZVNoaWZ0XG4gICAgICAgIGNvbnN0IGR5ID0gdGlsZS50eSA8PCB0aWxlU2hpZnRcblxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKHRpbGUuaW1hZ2VEYXRhLCAwLCAwKVxuXG4gICAgICAgIHRhcmdldEN0eC5kcmF3SW1hZ2UoY2FudmFzLCBkeCwgZHkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gMVxuICAgIHRhcmdldEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ=="],"mappings":"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","names":["MaskType","get","makeReusableCanvas","defaults","blendColorPixelData","defaults","blendPixel","defaults","blendPixelData","defaults","blendPixelDataAlphaMask","defaults","blendPixelDataBinaryMask","defaults","fillPixelData","SCRATCH_RECT","defaults","fillPixelData","SCRATCH_RECT","defaults","fillPixelDataBinaryMask","SCRATCH_RECT","defaults","invertPixelData","defaults","applyAlphaMaskToPixelData","defaults","applyBinaryMaskToPixelData","SCRATCH_BLIT","SCRATCH_BLIT","r","g","b","a","SCRATCH_BLIT","SCRATCH_BLIT"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/_types.ts","../src/color.ts","../src/Internal/resolveClipping.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMaskBuffer.ts","../src/Rect/trimMaskRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/Algorithm/forEachLinePoint.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/canvas-blend-modes.ts","../src/Canvas/ReusableCanvas.ts","../src/Canvas/CanvasFrameRenderer.ts","../src/Canvas/PixelCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/PixelPatchTiles.ts","../src/History/HistoryAction.ts","../src/History/HistoryManager.ts","../src/History/PixelAccumulator.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/PixelData/blendPixel.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/blendPixelDataAlphaMask.ts","../src/History/PixelMutator/mutatorBlendPixelDataAlphaMask.ts","../src/PixelData/blendPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorBlendPixelDataBinaryMask.ts","../src/PixelData/fillPixelDataFast.ts","../src/History/PixelMutator/mutatorClear.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorFill.ts","../src/PixelData/fillPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorFillBinaryMask.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/ImageData/resizeImageData.ts","../src/Rect/trimRectBounds.ts","../src/Paint/PaintBuffer.ts","../src/PixelTile/PixelTile.ts","../src/PixelTile/PixelTilePool.ts","../src/History/PixelWriter.ts","../src/PixelData/applyAlphaMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyAlphaMask.ts","../src/PixelData/applyBinaryMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyBinaryMask.ts","../src/PixelData/blendColorPixelDataAlphaMask.ts","../src/PixelData/blendColorPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorBlendPaintMask.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/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/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/Rect/getRectsBounds.ts","../src/MaskRect/merge2BinaryMaskRects.ts","../src/MaskRect/mergeBinaryMaskRects.ts","../src/MaskRect/subtractBinaryMaskRects.ts","../src/PixelData/PixelData.ts","../src/PixelData/blendPixelDataPaintBuffer.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","../src/PixelData/writePaintBufferToPixelData.ts","../src/Paint/makeCirclePaintAlphaMask.ts","../src/Paint/makeCirclePaintBinaryMask.ts","../src/Internal/helpers.ts","../src/Paint/makePaintMask.ts","../src/Paint/makeRectFalloffPaintAlphaMask.ts","../src/Paint/PaintBufferCanvasRenderer.ts"],"sourcesContent":["// @sort-all\nexport * from './_types';\nexport * from './color';\nexport * from './Algorithm/floodFillSelection';\nexport * from './Algorithm/forEachLinePoint';\nexport * from './BlendModes/blend-modes-fast';\nexport * from './BlendModes/blend-modes-perfect';\nexport * from './BlendModes/blend-modes';\nexport * from './BlendModes/BlendModeRegistry';\nexport * from './BlendModes/toBlendModeIndexAndName';\nexport * from './Canvas/_constants';\nexport * from './Canvas/canvas-blend-modes';\nexport * from './Canvas/CanvasFrameRenderer';\nexport * from './Canvas/PixelCanvas';\nexport * from './Canvas/ReusableCanvas';\nexport * from './Clipboard/getImageDataFromClipboard';\nexport * from './Clipboard/writeImageDataToClipboard';\nexport * from './Clipboard/writeImgBlobToClipboard';\nexport * from './History/HistoryAction';\nexport * from './History/HistoryManager';\nexport * from './History/PixelAccumulator';\nexport * from './History/PixelEngineConfig';\nexport * from './History/PixelMutator';\nexport * from './History/PixelPatchTiles';\nexport * from './History/PixelWriter';\nexport * from './History/PixelMutator/mutatorApplyAlphaMask';\nexport * from './History/PixelMutator/mutatorApplyBinaryMask';\nexport * from './History/PixelMutator/mutatorBlendColor';\nexport * from './History/PixelMutator/mutatorBlendPaintMask';\nexport * from './History/PixelMutator/mutatorBlendPixel';\nexport * from './History/PixelMutator/mutatorBlendPixelData';\nexport * from './History/PixelMutator/mutatorBlendPixelDataAlphaMask';\nexport * from './History/PixelMutator/mutatorBlendPixelDataBinaryMask';\nexport * from './History/PixelMutator/mutatorClear';\nexport * from './History/PixelMutator/mutatorFill';\nexport * from './History/PixelMutator/mutatorFillBinaryMask';\nexport * from './History/PixelMutator/mutatorInvert';\nexport * from './ImageData/copyImageData';\nexport * from './ImageData/extractImageDataBuffer';\nexport * from './ImageData/ImageDataLike';\nexport * from './ImageData/imageDataToAlphaMaskBuffer';\nexport * from './ImageData/imageDataToDataUrl';\nexport * from './ImageData/imageDataToImgBlob';\nexport * from './ImageData/imageDataToUInt32Array';\nexport * from './ImageData/imgBlobToImageData';\nexport * from './ImageData/invertImageData';\nexport * from './ImageData/resampleImageData';\nexport * from './ImageData/resizeImageData';\nexport * from './ImageData/ReusableImageData';\nexport * from './ImageData/serialization';\nexport * from './ImageData/uInt32ArrayToImageData';\nexport * from './ImageData/writeImageData';\nexport * from './ImageData/writeImageDataBuffer';\nexport * from './IndexedImage/getIndexedImageColorCounts';\nexport * from './IndexedImage/IndexedImage';\nexport * from './IndexedImage/indexedImageToAverageColor';\nexport * from './IndexedImage/indexedImageToImageData';\nexport * from './IndexedImage/resampleIndexedImage';\nexport * from './Input/fileInputChangeToImageData';\nexport * from './Input/fileToImageData';\nexport * from './Input/getSupportedRasterFormats';\nexport * from './Mask/AlphaMask';\nexport * from './Mask/BinaryMask';\nexport * from './Mask/applyBinaryMaskToAlphaMask';\nexport * from './Mask/copyMask';\nexport * from './Mask/extractMask';\nexport * from './Mask/extractMaskBuffer';\nexport * from './Mask/invertMask';\nexport * from './Mask/mergeAlphaMasks';\nexport * from './Mask/mergeBinaryMasks';\nexport * from './Mask/setMaskData';\nexport * from './MaskRect/merge2BinaryMaskRects';\nexport * from './MaskRect/mergeBinaryMaskRects';\nexport * from './MaskRect/subtractBinaryMaskRects';\nexport * from './PixelData/applyAlphaMaskToPixelData';\nexport * from './PixelData/applyBinaryMaskToPixelData';\nexport * from './PixelData/PixelData';\nexport * from './PixelData/blendColorPixelData';\nexport * from './PixelData/blendColorPixelDataAlphaMask';\nexport * from './PixelData/blendColorPixelDataBinaryMask';\nexport * from './PixelData/blendPixelData';\nexport * from './PixelData/blendPixelDataAlphaMask';\nexport * from './PixelData/blendPixelDataBinaryMask';\nexport * from './PixelData/blendPixel';\nexport * from './PixelData/blendPixelDataPaintBuffer';\nexport * from './PixelData/clearPixelData';\nexport * from './PixelData/extractPixelData';\nexport * from './PixelData/extractPixelDataBuffer';\nexport * from './PixelData/fillPixelData';\nexport * from './PixelData/fillPixelDataBinaryMask';\nexport * from './PixelData/fillPixelDataFast';\nexport * from './PixelData/invertPixelData';\nexport * from './PixelData/PixelBuffer32';\nexport * from './PixelData/pixelDataToAlphaMask';\nexport * from './PixelData/reflectPixelData';\nexport * from './PixelData/resamplePixelData';\nexport * from './PixelData/rotatePixelData';\nexport * from './PixelData/writePaintBufferToPixelData';\nexport * from './PixelData/writePixelDataBuffer';\nexport * from './Rect/getRectsBounds';\nexport * from './Rect/trimMaskRectBounds';\nexport * from './Rect/trimRectBounds';\nexport * from './Paint/makeCirclePaintAlphaMask';\nexport * from './Paint/makeCirclePaintBinaryMask';\nexport * from './Paint/makePaintMask';\nexport * from './Paint/makeRectFalloffPaintAlphaMask';\nexport * from './Paint/PaintBuffer';\nexport * from './Paint/PaintBufferCanvasRenderer';\nexport * from './PixelTile/PixelTile';\nexport * from './PixelTile/PixelTilePool';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHNvcnQtYWxsXG5leHBvcnQgKiBmcm9tICcuL190eXBlcydcbmV4cG9ydCAqIGZyb20gJy4vY29sb3InXG5cbmV4cG9ydCAqIGZyb20gJy4vQWxnb3JpdGhtL2Zsb29kRmlsbFNlbGVjdGlvbidcbmV4cG9ydCAqIGZyb20gJy4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnXG5cbmV4cG9ydCAqIGZyb20gJy4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1mYXN0J1xuZXhwb3J0ICogZnJvbSAnLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMnXG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvQmxlbmRNb2RlUmVnaXN0cnknXG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvdG9CbGVuZE1vZGVJbmRleEFuZE5hbWUnXG5cbmV4cG9ydCAqIGZyb20gJy4vQ2FudmFzL19jb25zdGFudHMnXG5leHBvcnQgKiBmcm9tICcuL0NhbnZhcy9jYW52YXMtYmxlbmQtbW9kZXMnXG5leHBvcnQgKiBmcm9tICcuL0NhbnZhcy9DYW52YXNGcmFtZVJlbmRlcmVyJ1xuZXhwb3J0ICogZnJvbSAnLi9DYW52YXMvUGl4ZWxDYW52YXMnXG5leHBvcnQgKiBmcm9tICcuL0NhbnZhcy9SZXVzYWJsZUNhbnZhcydcblxuZXhwb3J0ICogZnJvbSAnLi9DbGlwYm9hcmQvZ2V0SW1hZ2VEYXRhRnJvbUNsaXBib2FyZCdcbmV4cG9ydCAqIGZyb20gJy4vQ2xpcGJvYXJkL3dyaXRlSW1hZ2VEYXRhVG9DbGlwYm9hcmQnXG5leHBvcnQgKiBmcm9tICcuL0NsaXBib2FyZC93cml0ZUltZ0Jsb2JUb0NsaXBib2FyZCdcblxuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L0hpc3RvcnlBY3Rpb24nXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvSGlzdG9yeU1hbmFnZXInXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxBY2N1bXVsYXRvcidcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbEVuZ2luZUNvbmZpZydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3InXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxQYXRjaFRpbGVzJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsV3JpdGVyJ1xuXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUFscGhhTWFzaydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckFwcGx5QmluYXJ5TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3InXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZFBhaW50TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWwnXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZFBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQ2xlYXInXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JGaWxsJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbEJpbmFyeU1hc2snXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JJbnZlcnQnXG5cbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2NvcHlJbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9leHRyYWN0SW1hZ2VEYXRhQnVmZmVyJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvSW1hZ2VEYXRhTGlrZSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvQWxwaGFNYXNrQnVmZmVyJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvaW1hZ2VEYXRhVG9EYXRhVXJsJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvaW1hZ2VEYXRhVG9JbWdCbG9iJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvaW1hZ2VEYXRhVG9VSW50MzJBcnJheSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltZ0Jsb2JUb0ltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ludmVydEltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3Jlc2FtcGxlSW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvcmVzaXplSW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvUmV1c2FibGVJbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9zZXJpYWxpemF0aW9uJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvdUludDMyQXJyYXlUb0ltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3dyaXRlSW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvd3JpdGVJbWFnZURhdGFCdWZmZXInXG5cbmV4cG9ydCAqIGZyb20gJy4vSW5kZXhlZEltYWdlL2dldEluZGV4ZWRJbWFnZUNvbG9yQ291bnRzJ1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvSW5kZXhlZEltYWdlJ1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvaW5kZXhlZEltYWdlVG9BdmVyYWdlQ29sb3InXG5leHBvcnQgKiBmcm9tICcuL0luZGV4ZWRJbWFnZS9pbmRleGVkSW1hZ2VUb0ltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW5kZXhlZEltYWdlL3Jlc2FtcGxlSW5kZXhlZEltYWdlJ1xuXG5leHBvcnQgKiBmcm9tICcuL0lucHV0L2ZpbGVJbnB1dENoYW5nZVRvSW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dC9maWxlVG9JbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0lucHV0L2dldFN1cHBvcnRlZFJhc3RlckZvcm1hdHMnXG5cbmV4cG9ydCAqIGZyb20gJy4vTWFzay9BbHBoYU1hc2snXG5leHBvcnQgKiBmcm9tICcuL01hc2svQmluYXJ5TWFzaydcblxuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2FwcGx5QmluYXJ5TWFza1RvQWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2NvcHlNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2V4dHJhY3RNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2V4dHJhY3RNYXNrQnVmZmVyJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2ludmVydE1hc2snXG5leHBvcnQgKiBmcm9tICcuL01hc2svbWVyZ2VBbHBoYU1hc2tzJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL21lcmdlQmluYXJ5TWFza3MnXG5leHBvcnQgKiBmcm9tICcuL01hc2svc2V0TWFza0RhdGEnXG5cbmV4cG9ydCAqIGZyb20gJy4vTWFza1JlY3QvbWVyZ2UyQmluYXJ5TWFza1JlY3RzJ1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrUmVjdC9tZXJnZUJpbmFyeU1hc2tSZWN0cydcbmV4cG9ydCAqIGZyb20gJy4vTWFza1JlY3Qvc3VidHJhY3RCaW5hcnlNYXNrUmVjdHMnXG5cbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2FwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEnXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9hcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL1BpeGVsRGF0YSdcblxuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFBbHBoYU1hc2snXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2snXG5cbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWwnXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YVBhaW50QnVmZmVyJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvY2xlYXJQaXhlbERhdGEnXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9leHRyYWN0UGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcidcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGEnXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhQmluYXJ5TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGFGYXN0J1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvaW52ZXJ0UGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvUGl4ZWxCdWZmZXIzMidcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3BpeGVsRGF0YVRvQWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvcmVmbGVjdFBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3Jlc2FtcGxlUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvcm90YXRlUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvd3JpdGVQYWludEJ1ZmZlclRvUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvd3JpdGVQaXhlbERhdGFCdWZmZXInXG5cbmV4cG9ydCAqIGZyb20gJy4vUmVjdC9nZXRSZWN0c0JvdW5kcydcbmV4cG9ydCAqIGZyb20gJy4vUmVjdC90cmltTWFza1JlY3RCb3VuZHMnXG5leHBvcnQgKiBmcm9tICcuL1JlY3QvdHJpbVJlY3RCb3VuZHMnXG5cbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvbWFrZUNpcmNsZVBhaW50QWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9tYWtlQ2lyY2xlUGFpbnRCaW5hcnlNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9tYWtlUGFpbnRNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9tYWtlUmVjdEZhbGxvZmZQYWludEFscGhhTWFzaydcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvUGFpbnRCdWZmZXInXG5leHBvcnQgKiBmcm9tICcuL1BhaW50L1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXInXG5cbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxUaWxlL1BpeGVsVGlsZSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxUaWxlL1BpeGVsVGlsZVBvb2wnXG5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/** 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 BasePaintMask {\n readonly centerOffsetX: number;\n readonly centerOffsetY: number;\n}\nexport interface PaintAlphaMask extends BasePaintMask, AlphaMask {}\nexport interface PaintBinaryMask extends BasePaintMask, BinaryMask {}\nexport type PaintMask = PaintAlphaMask | PaintBinaryMask;\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 MaskRect<T extends MaskType> = Rect & {\n type: T;\n data: Uint8Array;\n};\nexport type BinaryMaskRect = MaskRect<MaskType.BINARY>;\nexport type AlphaMaskRect = MaskRect<MaskType.ALPHA>;\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 HistoryMutator<T extends {}, D extends {}> = (writer: PixelWriter<any>, deps?: Partial<D>) => T;\nexport interface IPixelData32 {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n}\nexport interface IPixelData<T extends ImageDataLike = ImageData> extends IPixelData32 {\n readonly imageData: T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxXcml0ZXIsIHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi9pbmRleCdcblxuLyoqIEFMTCB2YWx1ZXMgYXJlIDAtMjU1IChpbmNsdWRpbmcgYWxwaGEgd2hpY2ggaW4gQ1NTIGlzIDAtMSkgKi9cbmV4cG9ydCB0eXBlIFJHQkEgPSB7IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciB9XG5cbi8qKiBSZXByZXNlbnRzIGEgMzItYml0IGNvbG9yIGluIDB4QUFCQkdHUlIgKExpdHRsZSBlbmRpYW4pICovXG5leHBvcnQgdHlwZSBDb2xvcjMyID0gbnVtYmVyICYgeyByZWFkb25seSBfX2JyYW5kQ29sb3IzMjogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIGNvbWJpbmUgYSBzb3VyY2UgY29sb3Igd2l0aCBhIGRlc3RpbmF0aW9uIGNvbG9yLlxuICogQHBhcmFtIHNyYyAtIFRoZSBpbmNvbWluZyBjb2xvciAoc291cmNlKS5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZXhpc3RpbmcgY29sb3IgaW4gdGhlIGJ1ZmZlciAoZGVzdGluYXRpb24pLlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyAzMi1iaXQgY29sb3IgdG8gYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyLlxuICovXG5leHBvcnQgdHlwZSBCbGVuZENvbG9yMzIgPSB7XG4gIChzcmM6IENvbG9yMzIsIGRzdDogQ29sb3IzMik6IENvbG9yMzIsXG4gIGlzT3ZlcndyaXRlPzogdHJ1ZVxufVxuXG5leHBvcnQgdHlwZSBJbWFnZURhdGFMaWtlID0ge1xuICB3aWR0aDogbnVtYmVyXG4gIGhlaWdodDogbnVtYmVyXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyTGlrZT5cbn1cblxuZXhwb3J0IHR5cGUgSW1hZ2VEYXRhTGlrZUNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBJbWFnZURhdGFMaWtlID0gSW1hZ2VEYXRhTGlrZT4gPSB7XG4gIG5ldyhcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBUXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRJbWFnZURhdGEgPSB7XG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbiAgZGF0YTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEJhc2U2NEVuY29kZWRVSW50OEFycmF5ID0gc3RyaW5nICYgeyByZWFkb25seSBfX2JyYW5kQmFzZTY0VUludDhBcnJheTogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKiBSZWN0YW5nbGUgZGVmaW5pdGlvbiAqL1xuZXhwb3J0IHR5cGUgUmVjdCA9IHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxuICB3OiBudW1iZXJcbiAgaDogbnVtYmVyXG59XG5cbi8qKlxuICogRGVmaW5lcyBob3cgbWFzayB2YWx1ZXMgc2hvdWxkIGJlIGludGVycHJldGVkIGR1cmluZyBhIGRyYXcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBNYXNrVHlwZSB7XG4gIC8qKlxuICAgKiBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYWxwaGEgd2VpZ2h0cy5cbiAgICogMCBpcyBza2lwcGVkLCB2YWx1ZXMgPiAwIGFyZSBwcm9jZXNzZWQuXG4gICAqL1xuICBBTFBIQSxcbiAgLyoqXG4gICAqICBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgb24vb2ZmLlxuICAgKiAwIGlzIGZ1bGx5IHRyYW5zcGFyZW50IChza2lwcGVkKSwgYW55IG90aGVyIHZhbHVlIGlzIGZ1bGx5IG9wYXF1ZS5cbiAgICovXG4gIEJJTkFSWVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hc2sge1xuICByZWFkb25seSB0eXBlOiBNYXNrVHlwZVxuICByZWFkb25seSBkYXRhOiBVaW50OEFycmF5XG4gIHJlYWRvbmx5IHc6IG51bWJlclxuICByZWFkb25seSBoOiBudW1iZXJcbn1cblxuLyoqIFN0cmljdGx5IDAgb3IgMSAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5hcnlNYXNrIGV4dGVuZHMgTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlLkJJTkFSWVxufVxuXG4vKiogU3RyaWN0bHkgMC0yNTUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxwaGFNYXNrIGV4dGVuZHMgTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlLkFMUEhBXG59XG5cbmludGVyZmFjZSBCYXNlUGFpbnRNYXNrIHtcbiAgcmVhZG9ubHkgY2VudGVyT2Zmc2V0WDogbnVtYmVyXG4gIHJlYWRvbmx5IGNlbnRlck9mZnNldFk6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhaW50QWxwaGFNYXNrIGV4dGVuZHMgQmFzZVBhaW50TWFzaywgQWxwaGFNYXNrIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWludEJpbmFyeU1hc2sgZXh0ZW5kcyBCYXNlUGFpbnRNYXNrLCBCaW5hcnlNYXNrIHtcbn1cblxuZXhwb3J0IHR5cGUgUGFpbnRNYXNrID0gUGFpbnRBbHBoYU1hc2sgfCBQYWludEJpbmFyeU1hc2tcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwaXhlbCBtYW5pcHVsYXRpb24gb3BlcmF0aW9ucy5cbiAqIERlc2lnbmVkIHRvIGJlIHVzZWQgYnkgc3ByZWFkaW5nIGEgUmVjdCBvYmplY3QgKHt4LCB5LCB3LCBofSkgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxSZWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzdGFydGluZyBYIGNvb3JkaW5hdGUgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgeD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgc3RhcnRpbmcgWSBjb29yZGluYXRlIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHk/OiBudW1iZXJcblxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgU291cmNlIHdpZHRoLlxuICAgKi9cbiAgdz86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgU291cmNlIGhlaWdodC5cbiAgICovXG4gIGg/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXNrT2Zmc2V0IHtcbiAgLyoqXG4gICAqIFggb2Zmc2V0IGludG8gdGhlIG1hc2sgYnVmZmVyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBteD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBZIG9mZnNldCBpbnRvIHRoZSBtYXNrIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgbXk/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZlcnRNYXNrIHtcblxuICAvKipcbiAgICogSWYgdHJ1ZSB0aGUgaW52ZXJzZSBvZiB0aGUgbWFzayB3aWxsIGJlIGFwcGxpZWRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGludmVydE1hc2s/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBBbHBoYSB7XG4gIC8qKlxuICAgKiBPdmVyYWxsIGxheWVyIG9wYWNpdHkgMC0yNTUuXG4gICAqIEBkZWZhdWx0IDI1NVxuICAgKi9cbiAgYWxwaGE/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXJnZUFscGhhTWFza3NPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgTWFza09mZnNldCwgSW52ZXJ0TWFzayB7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXhlbE11dGF0ZU9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIE1hc2tPZmZzZXQsIEludmVydE1hc2sge1xuICAvKiogQW4gb3B0aW9uYWwgbWFzayB0byByZXN0cmljdCB3aGVyZSBwaXhlbHMgYXJlIG11dGF0ZWQuICovXG4gIG1hc2s/OiBCaW5hcnlNYXNrIHwgbnVsbFxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGJsaXR0aW5nIChjb3B5aW5nL2JsZW5kaW5nKSBvbmUgaW1hZ2UgaW50byBhbm90aGVyLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVBpeGVsQmxlbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcmVjdGFuZ2xlIHgtY29vcmRpbmF0ZVxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBzeD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHJlY3RhbmdsZSB5LWNvb3JkaW5hdGVcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgc3k/OiBudW1iZXJcblxuICAvKipcbiAgICogVGhlIGJsZW5kaW5nIGFsZ29yaXRobSB0byB1c2UgZm9yIGJsZW5kaW5nIHBpeGVscy5cbiAgICogQGRlZmF1bHQge0BsaW5rIHNvdXJjZU92ZXJQZXJmZWN0fVxuICAgKi9cbiAgYmxlbmRGbj86IEJsZW5kQ29sb3IzMlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsQmxlbmRPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgQmFzZVBpeGVsQmxlbmRPcHRpb25zIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXhlbEJsZW5kTWFza09wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrLCBCYXNlUGl4ZWxCbGVuZE9wdGlvbnMge1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGNvbG9yIGJsZW5kaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yQmxlbmRPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSB7XG4gIC8qKlxuICAgKiBUaGUgYmxlbmRpbmcgYWxnb3JpdGhtIHRvIHVzZSBmb3IgYmxlbmRpbmcgcGl4ZWxzLlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgc291cmNlT3ZlclBlcmZlY3R9XG4gICAqL1xuICBibGVuZEZuPzogQmxlbmRDb2xvcjMyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JCbGVuZE1hc2tPcHRpb25zIGV4dGVuZHMgQ29sb3JCbGVuZE9wdGlvbnMsIE1hc2tPZmZzZXQsIEludmVydE1hc2sge1xufVxuXG5leHBvcnQgdHlwZSBNYXNrUmVjdDxUIGV4dGVuZHMgTWFza1R5cGU+ID0gUmVjdCAmIHtcbiAgdHlwZTogVFxuICBkYXRhOiBVaW50OEFycmF5XG59XG5cbmV4cG9ydCB0eXBlIEJpbmFyeU1hc2tSZWN0ID0gTWFza1JlY3Q8TWFza1R5cGUuQklOQVJZPlxuXG5leHBvcnQgdHlwZSBBbHBoYU1hc2tSZWN0ID0gTWFza1JlY3Q8TWFza1R5cGUuQUxQSEE+XG5cbmV4cG9ydCB0eXBlIE51bGxhYmxlQmluYXJ5TWFza1JlY3QgPSBSZWN0ICYgKHtcbiAgdHlwZTogTWFza1R5cGUuQklOQVJZXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbn0gfCB7XG4gIHR5cGU/OiBudWxsXG4gIGRhdGE/OiBudWxsXG59KVxuXG5leHBvcnQgdHlwZSBOdWxsYWJsZU1hc2tSZWN0ID0gUmVjdCAmICh7XG4gIHR5cGU6IE1hc2tUeXBlXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbn0gfCB7XG4gIHR5cGU/OiBudWxsXG4gIGRhdGE/OiBudWxsXG59KVxuXG5leHBvcnQgdHlwZSBIaXN0b3J5TXV0YXRvcjxUIGV4dGVuZHMge30sIEQgZXh0ZW5kcyB7fT4gPSAod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzPzogUGFydGlhbDxEPikgPT4gVFxuXG5leHBvcnQgaW50ZXJmYWNlIElQaXhlbERhdGEzMiB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXlcbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlclxuICByZWFkb25seSBoZWlnaHQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQaXhlbERhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgPSBJbWFnZURhdGE+IGV4dGVuZHMgSVBpeGVsRGF0YTMyIHtcbiAgcmVhZG9ubHkgaW1hZ2VEYXRhOiBUXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 trimMaskRectBounds<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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZU1hc2tSZWN0LCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hc2tCdWZmZXIgfSBmcm9tICcuLi9NYXNrL2V4dHJhY3RNYXNrQnVmZmVyJ1xuXG4vKipcbiAqIEludGVyc2VjdHMgYSB0YXJnZXQgcmVjdGFuZ2xlIHdpdGggYSBib3VuZGFyeSwgdHJpbW1pbmcgZGltZW5zaW9ucyBhbmQgbWFza3MgaW4tcGxhY2UuXG4gKiBUaGlzIHV0aWxpdHkgY2FsY3VsYXRlcyB0aGUgYXhpcy1hbGlnbmVkIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSBgdGFyZ2V0YCBhbmQgYGJvdW5kc2AuXG4gKiBJZiB0aGUgYHRhcmdldGAgaW5jbHVkZXMgYSBgbWFza2AgKGFzIGluIGEge0BsaW5rIE51bGxhYmxlTWFza1JlY3R9KSwgdGhlIG1hc2sgaXMgcGh5c2ljYWxseVxuICogY3JvcHBlZCBhbmQgcmUtYWxpZ25lZCB1c2luZyBgZXh0cmFjdE1hc2tCdWZmZXJgIHRvIG1hdGNoIHRoZSBuZXcgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgcmVjdGFuZ2xlIG9yIHNlbGVjdGlvbiBvYmplY3QgdG8gYmUgdHJpbW1lZC4gKipOb3RlOioqIFRoaXMgb2JqZWN0IGlzIG11dGF0ZWQgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYm91bmRzIC0gVGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBkZWZpbmluZyB0aGUgbWF4aW11bSBhbGxvd2FibGUgYXJlYSAoZS5nLiwgY2FudmFzIGRpbWVuc2lvbnMpLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlbGVjdGlvbiA9IHsgeDogLTEwLCB5OiAtMTAsIHc6IDUwLCBoOiA1MCwgbWFzazogbmV3IFVpbnQ4QXJyYXkoMjUwMCkgfTtcbiAqIGNvbnN0IGNhbnZhcyA9IHsgeDogMCwgeTogMCwgdzogMTAwLCBoOiAxMDAgfTtcbiAqIC8vIFNlbGVjdGlvbiB3aWxsIGJlIG1vdmVkIHRvICgwLDApIGFuZCByZXNpemVkIHRvIDQweDQwLlxuICogLy8gVGhlIG1hc2sgaXMgY3JvcHBlZCBieSAxMCBweCBvbiB0aGUgdG9wIGFuZCBsZWZ0LlxuICogdHJpbVJlY3RCb3VuZHMoc2VsZWN0aW9uLCBjYW52YXMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbU1hc2tSZWN0Qm91bmRzPFQgZXh0ZW5kcyBOdWxsYWJsZU1hc2tSZWN0PihcbiAgdGFyZ2V0OiBULFxuICBib3VuZHM6IFJlY3QsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxYID0gdGFyZ2V0LnhcbiAgY29uc3Qgb3JpZ2luYWxZID0gdGFyZ2V0LnlcbiAgY29uc3Qgb3JpZ2luYWxXID0gdGFyZ2V0LndcblxuICBjb25zdCBpbnRlcnNlY3RlZFggPSBNYXRoLm1heCh0YXJnZXQueCwgYm91bmRzLngpXG4gIGNvbnN0IGludGVyc2VjdGVkWSA9IE1hdGgubWF4KHRhcmdldC55LCBib3VuZHMueSlcblxuICBjb25zdCBpbnRlcnNlY3RlZE1heFggPSBNYXRoLm1pbihcbiAgICB0YXJnZXQueCArIHRhcmdldC53LFxuICAgIGJvdW5kcy54ICsgYm91bmRzLncsXG4gIClcbiAgY29uc3QgaW50ZXJzZWN0ZWRNYXhZID0gTWF0aC5taW4oXG4gICAgdGFyZ2V0LnkgKyB0YXJnZXQuaCxcbiAgICBib3VuZHMueSArIGJvdW5kcy5oLFxuICApXG5cbiAgLy8gSW50ZXJzZWN0aW9uIGNoZWNrXG4gIGlmIChpbnRlcnNlY3RlZE1heFggPD0gaW50ZXJzZWN0ZWRYIHx8IGludGVyc2VjdGVkTWF4WSA8PSBpbnRlcnNlY3RlZFkpIHtcbiAgICB0YXJnZXQudyA9IDBcbiAgICB0YXJnZXQuaCA9IDBcblxuICAgIGlmICgnZGF0YScgaW4gdGFyZ2V0ICYmIHRhcmdldC5kYXRhKSB7XG4gICAgICB0YXJnZXQuZGF0YSA9IG5ldyBVaW50OEFycmF5KDApXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBpbnRlcnNlY3RlZFcgPSBpbnRlcnNlY3RlZE1heFggLSBpbnRlcnNlY3RlZFhcbiAgY29uc3QgaW50ZXJzZWN0ZWRIID0gaW50ZXJzZWN0ZWRNYXhZIC0gaW50ZXJzZWN0ZWRZXG4gIGNvbnN0IG9mZnNldFggPSBpbnRlcnNlY3RlZFggLSBvcmlnaW5hbFhcbiAgY29uc3Qgb2Zmc2V0WSA9IGludGVyc2VjdGVkWSAtIG9yaWdpbmFsWVxuXG4gIHRhcmdldC54ID0gaW50ZXJzZWN0ZWRYXG4gIHRhcmdldC55ID0gaW50ZXJzZWN0ZWRZXG4gIHRhcmdldC53ID0gaW50ZXJzZWN0ZWRXXG4gIHRhcmdldC5oID0gaW50ZXJzZWN0ZWRIXG5cbiAgaWYgKCdkYXRhJyBpbiB0YXJnZXQgJiYgdGFyZ2V0LmRhdGEpIHtcbiAgICBjb25zdCBjdXJyZW50TWFza0J1ZmZlciA9IGV4dHJhY3RNYXNrQnVmZmVyKFxuICAgICAgdGFyZ2V0LmRhdGEsXG4gICAgICBvcmlnaW5hbFcsXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGludGVyc2VjdGVkVyxcbiAgICAgIGludGVyc2VjdGVkSCxcbiAgICApXG5cbiAgICBsZXQgbWluWCA9IGludGVyc2VjdGVkV1xuICAgIGxldCBtYXhYID0gLTFcbiAgICBsZXQgbWluWSA9IGludGVyc2VjdGVkSFxuICAgIGxldCBtYXhZID0gLTFcblxuICAgIC8vIFNjYW4gZm9yIGNvbnRlbnRcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGludGVyc2VjdGVkSDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGludGVyc2VjdGVkVzsgeCsrKSB7XG4gICAgICAgIGlmIChjdXJyZW50TWFza0J1ZmZlclt5ICogaW50ZXJzZWN0ZWRXICsgeF0gIT09IDApIHtcbiAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4XG4gICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geFxuICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHlcbiAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBubyBjb250ZW50IGlzIGZvdW5kIChhbGwgemVyb3MpXG4gICAgaWYgKG1heFggPT09IC0xKSB7XG4gICAgICB0YXJnZXQudyA9IDBcbiAgICAgIHRhcmdldC5oID0gMFxuICAgICAgdGFyZ2V0LmRhdGEgPSBuZXcgVWludDhBcnJheSgwKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFcgPSBtYXhYIC0gbWluWCArIDFcbiAgICBjb25zdCBmaW5hbEggPSBtYXhZIC0gbWluWSArIDFcblxuICAgIC8vIE9ubHkgc2hpZnQgYW5kIGNyb3AgaWYgdGhlIGNvbnRlbnQgaXMgc21hbGxlciB0aGFuIHRoZSBpbnRlcnNlY3Rpb25cbiAgICBpZiAoZmluYWxXICE9PSBpbnRlcnNlY3RlZFcgfHwgZmluYWxIICE9PSBpbnRlcnNlY3RlZEgpIHtcbiAgICAgIGNvbnN0IG5ld01hc2tCdWZmZXIgPSBleHRyYWN0TWFza0J1ZmZlcihcbiAgICAgICAgY3VycmVudE1hc2tCdWZmZXIsXG4gICAgICAgIGludGVyc2VjdGVkVyxcbiAgICAgICAgbWluWCxcbiAgICAgICAgbWluWSxcbiAgICAgICAgZmluYWxXLFxuICAgICAgICBmaW5hbEgsXG4gICAgICApXG5cbiAgICAgIHRhcmdldC54ICs9IG1pblhcbiAgICAgIHRhcmdldC55ICs9IG1pbllcbiAgICAgIHRhcmdldC53ID0gZmluYWxXXG4gICAgICB0YXJnZXQuaCA9IGZpbmFsSFxuICAgICAgdGFyZ2V0LmRhdGEgPSBuZXdNYXNrQnVmZmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC53ID0gZmluYWxXXG4gICAgICB0YXJnZXQuaCA9IGZpbmFsSFxuICAgICAgdGFyZ2V0LmRhdGEgPSBjdXJyZW50TWFza0J1ZmZlclxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type Color32, MaskType } from '../_types';\nimport { colorDistance } from '../color';\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer';\nimport { trimMaskRectBounds } from '../Rect/trimMaskRectBounds';\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 trimMaskRectBounds(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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBCaW5hcnlNYXNrUmVjdCwgdHlwZSBDb2xvcjMyLCB0eXBlIEltYWdlRGF0YUxpa2UsIE1hc2tUeXBlLCB0eXBlIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBjb2xvckRpc3RhbmNlIH0gZnJvbSAnLi4vY29sb3InXG5pbXBvcnQgeyBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2V4dHJhY3RJbWFnZURhdGFCdWZmZXInXG5pbXBvcnQgdHlwZSB7IFBpeGVsRGF0YSB9IGZyb20gJy4uL1BpeGVsRGF0YS9QaXhlbERhdGEnXG5pbXBvcnQgeyB0cmltTWFza1JlY3RCb3VuZHMgfSBmcm9tICcuLi9SZWN0L3RyaW1NYXNrUmVjdEJvdW5kcydcblxuZXhwb3J0IHR5cGUgRmxvb2RGaWxsSW1hZ2VEYXRhT3B0aW9ucyA9IHtcbiAgY29udGlndW91cz86IGJvb2xlYW5cbiAgdG9sZXJhbmNlPzogbnVtYmVyXG4gIGJvdW5kcz86IFJlY3Rcbn1cblxuZXhwb3J0IHR5cGUgRmxvb2RGaWxsUmVzdWx0ID0ge1xuICBzdGFydFg6IG51bWJlclxuICBzdGFydFk6IG51bWJlclxuICBzZWxlY3Rpb25SZWN0OiBCaW5hcnlNYXNrUmVjdFxuICBwaXhlbHM6IFVpbnQ4Q2xhbXBlZEFycmF5XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBjb2xvci1iYXNlZCBmbG9vZCBmaWxsIHNlbGVjdGlvbiBvbiB7QGxpbmsgSW1hZ2VEYXRhfSBvciB7QGxpbmsgUGl4ZWxEYXRhfS5cbiAqIFRoaXMgdXRpbGl0eSBpZGVudGlmaWVzIHBpeGVscyBzdGFydGluZyBmcm9tIGEgc3BlY2lmaWMgY29vcmRpbmF0ZSB0aGF0IGZhbGwgd2l0aGluIGFcbiAqIGNvbG9yIHRvbGVyYW5jZS4gSXQgY2FuIG9wZXJhdGUgaW4gXCJjb250aWd1b3VzXCIgbW9kZSAoY2xhc3NpYyBidWNrZXQgZmlsbCkgb3JcbiAqIFwibm9uLWNvbnRpZ3VvdXNcIiBtb2RlIChzZWxlY3RzIGFsbCBtYXRjaGluZyBwaXhlbHMgaW4gdGhlIGJ1ZmZlcikuXG4gKlxuICogQHBhcmFtIGltZyAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byBwcm9jZXNzLlxuICogQHBhcmFtIHN0YXJ0WCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gc3RhcnRZIC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBmaWxsIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvcHRpb25zLmNvbnRpZ3VvdXMgLSBJZiB0cnVlLCBvbmx5IGNvbm5lY3RlZCBwaXhlbHMgYXJlXG4gKiBzZWxlY3RlZC4gSWYgZmFsc2UsIGFsbCBwaXhlbHMgd2l0aGluIHRvbGVyYW5jZSBhcmUgc2VsZWN0ZWQgcmVnYXJkbGVzcyBvZiBwb3NpdGlvbi5cbiAqIEBwYXJhbSBvcHRpb25zLnRvbGVyYW5jZSAtIFRoZSBtYXhpbXVtIGFsbG93ZWQgZGlmZmVyZW5jZSBpbiBjb2xvclxuICogZGlzdGFuY2UgKDAtMjU1KSBmb3IgYSBwaXhlbCB0byBiZSBpbmNsdWRlZC5cbiAqIEBwYXJhbSBvcHRpb25zLmJvdW5kcyAtIE9wdGlvbmFsIGJvdW5kaW5nIGJveCB0byByZXN0cmljdCB0aGUgc2VhcmNoIGFyZWEuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgRmxvb2RGaWxsUmVzdWx0fSBjb250YWluaW5nIHRoZSBtYXNrIGFuZCBib3VuZHMgb2YgdGhlIHNlbGVjdGlvbixcbiAqIG9yIGBudWxsYCBpZiB0aGUgc3RhcnRpbmcgY29vcmRpbmF0ZXMgYXJlIG91dCBvZiBib3VuZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGZsb29kRmlsbEltYWdlRGF0YVNlbGVjdGlvbihcbiAqIGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMTAwLCAxMDApLFxuICogNTAsXG4gKiA1MCxcbiAqIHtcbiAqIHRvbGVyYW5jZTogMjAsXG4gKiBjb250aWd1b3VzOiB0cnVlXG4gKiB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG9vZEZpbGxTZWxlY3Rpb24oXG4gIGltZzogSW1hZ2VEYXRhTGlrZSB8IFBpeGVsRGF0YSxcbiAgc3RhcnRYOiBudW1iZXIsXG4gIHN0YXJ0WTogbnVtYmVyLFxuICB7XG4gICAgY29udGlndW91cyA9IHRydWUsXG4gICAgdG9sZXJhbmNlID0gMCxcbiAgICBib3VuZHMsXG4gIH06IEZsb29kRmlsbEltYWdlRGF0YU9wdGlvbnMgPSB7fSxcbik6IEZsb29kRmlsbFJlc3VsdCB8IG51bGwge1xuXG4gIGxldCBpbWFnZURhdGE6IEltYWdlRGF0YUxpa2VcbiAgbGV0IGRhdGEzMjogVWludDMyQXJyYXlcbiAgaWYgKCdkYXRhMzInIGluIGltZykge1xuICAgIGRhdGEzMiA9IGltZy5kYXRhMzJcbiAgICBpbWFnZURhdGEgPSBpbWcuaW1hZ2VEYXRhXG4gIH0gZWxzZSB7XG4gICAgZGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KFxuICAgICAgaW1nLmRhdGEuYnVmZmVyLFxuICAgICAgaW1nLmRhdGEuYnl0ZU9mZnNldCxcbiAgICAgIGltZy5kYXRhLmJ5dGVMZW5ndGggPj4gMixcbiAgICApXG4gICAgaW1hZ2VEYXRhID0gaW1nXG4gIH1cbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfSA9IGltZ1xuXG4gIGNvbnN0IGxpbWl0ID0gYm91bmRzIHx8IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogd2lkdGgsXG4gICAgaDogaGVpZ2h0LFxuICB9XG5cbiAgY29uc3QgeE1pbiA9IE1hdGgubWF4KDAsIGxpbWl0LngpXG4gIGNvbnN0IHhNYXggPSBNYXRoLm1pbih3aWR0aCAtIDEsIGxpbWl0LnggKyBsaW1pdC53IC0gMSlcbiAgY29uc3QgeU1pbiA9IE1hdGgubWF4KDAsIGxpbWl0LnkpXG4gIGNvbnN0IHlNYXggPSBNYXRoLm1pbihoZWlnaHQgLSAxLCBsaW1pdC55ICsgbGltaXQuaCAtIDEpXG5cbiAgaWYgKHN0YXJ0WCA8IHhNaW4gfHwgc3RhcnRYID4geE1heCB8fCBzdGFydFkgPCB5TWluIHx8IHN0YXJ0WSA+IHlNYXgpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgYmFzZUNvbG9yID0gZGF0YTMyW3N0YXJ0WSAqIHdpZHRoICsgc3RhcnRYXSBhcyBDb2xvcjMyXG5cbiAgbGV0IG1hdGNoQ291bnQgPSAwXG4gIGNvbnN0IG1hdGNoWCA9IG5ldyBVaW50MTZBcnJheSh3aWR0aCAqIGhlaWdodClcbiAgY29uc3QgbWF0Y2hZID0gbmV3IFVpbnQxNkFycmF5KHdpZHRoICogaGVpZ2h0KVxuXG4gIGxldCBtaW5YID0gc3RhcnRYXG4gIGxldCBtYXhYID0gc3RhcnRYXG4gIGxldCBtaW5ZID0gc3RhcnRZXG4gIGxldCBtYXhZID0gc3RhcnRZXG5cbiAgaWYgKGNvbnRpZ3VvdXMpIHtcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgVWludDMyQXJyYXkod2lkdGggKiBoZWlnaHQpXG4gICAgbGV0IHN0YWNrUHRyID0gMFxuXG4gICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoc3RhcnRZIDw8IDE2KSB8IHN0YXJ0WFxuICAgIHZpc2l0ZWRbc3RhcnRZICogd2lkdGggKyBzdGFydFhdID0gMVxuXG4gICAgd2hpbGUgKHN0YWNrUHRyID4gMCkge1xuICAgICAgY29uc3QgdmFsID0gc3RhY2tbLS1zdGFja1B0cl1cbiAgICAgIGNvbnN0IHggPSB2YWwgJiAweEZGRkZcbiAgICAgIGNvbnN0IHkgPSB2YWwgPj4+IDE2XG5cbiAgICAgIG1hdGNoWFttYXRjaENvdW50XSA9IHhcbiAgICAgIG1hdGNoWVttYXRjaENvdW50XSA9IHlcbiAgICAgIG1hdGNoQ291bnQrK1xuXG4gICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4XG4gICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4XG4gICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5XG4gICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5XG5cbiAgICAgIC8vIFJpZ2h0XG4gICAgICBpZiAoeCArIDEgPD0geE1heCkge1xuICAgICAgICBjb25zdCBpZHggPSB5ICogd2lkdGggKyAoeCArIDEpXG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxXG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoeSA8PCAxNikgfCAoeCArIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIExlZnRcbiAgICAgIGlmICh4IC0gMSA+PSB4TWluKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiB3aWR0aCArICh4IC0gMSlcbiAgICAgICAgaWYgKCF2aXNpdGVkW2lkeF0gJiYgY29sb3JEaXN0YW5jZShkYXRhMzJbaWR4XSBhcyBDb2xvcjMyLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHZpc2l0ZWRbaWR4XSA9IDFcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9ICh5IDw8IDE2KSB8ICh4IC0gMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG93blxuICAgICAgaWYgKHkgKyAxIDw9IHlNYXgpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gKHkgKyAxKSAqIHdpZHRoICsgeFxuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMVxuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0gKCh5ICsgMSkgPDwgMTYpIHwgeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBVcFxuICAgICAgaWYgKHkgLSAxID49IHlNaW4pIHtcbiAgICAgICAgY29uc3QgaWR4ID0gKHkgLSAxKSAqIHdpZHRoICsgeFxuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMVxuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0gKCh5IC0gMSkgPDwgMTYpIHwgeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IHkgPSB5TWluOyB5IDw9IHlNYXg7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPD0geE1heDsgeCsrKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gZGF0YTMyW3kgKiB3aWR0aCArIHhdIGFzIENvbG9yMzJcbiAgICAgICAgaWYgKGNvbG9yRGlzdGFuY2UoY29sb3IsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgbWF0Y2hYW21hdGNoQ291bnRdID0geFxuICAgICAgICAgIG1hdGNoWVttYXRjaENvdW50XSA9IHlcbiAgICAgICAgICBtYXRjaENvdW50KytcblxuICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHhcbiAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4XG4gICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geVxuICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCB3ID0gbWF4WCAtIG1pblggKyAxXG4gIGNvbnN0IGggPSBtYXhZIC0gbWluWSArIDFcbiAgY29uc3Qgc2VsZWN0aW9uUmVjdDogQmluYXJ5TWFza1JlY3QgPSB7XG4gICAgeDogbWluWCxcbiAgICB5OiBtaW5ZLFxuICAgIHcsXG4gICAgaCxcbiAgICBkYXRhOiBuZXcgVWludDhBcnJheSh3ICogaCksXG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICB9XG5cbiAgY29uc3Qgc3cgPSBzZWxlY3Rpb25SZWN0LndcbiAgY29uc3Qgc2ggPSBzZWxlY3Rpb25SZWN0LmhcbiAgY29uc3QgZmluYWxNYXNrID0gc2VsZWN0aW9uUmVjdC5kYXRhXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaENvdW50OyBpKyspIHtcbiAgICBjb25zdCBteCA9IG1hdGNoWFtpXSAtIHNlbGVjdGlvblJlY3QueFxuICAgIGNvbnN0IG15ID0gbWF0Y2hZW2ldIC0gc2VsZWN0aW9uUmVjdC55XG5cbiAgICBpZiAobXggPj0gMCAmJiBteCA8IHN3ICYmIG15ID49IDAgJiYgbXkgPCBzaCkge1xuICAgICAgZmluYWxNYXNrW215ICogc3cgKyBteF0gPSAxXG4gICAgfVxuICB9XG5cbiAgdHJpbU1hc2tSZWN0Qm91bmRzKFxuICAgIHNlbGVjdGlvblJlY3QsXG4gICAgeyB4OiAwLCB5OiAwLCB3OiB3aWR0aCwgaDogaGVpZ2h0IH0sXG4gIClcblxuICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKFxuICAgIGltYWdlRGF0YSxcbiAgICBzZWxlY3Rpb25SZWN0LngsXG4gICAgc2VsZWN0aW9uUmVjdC55LFxuICAgIHNlbGVjdGlvblJlY3QudyxcbiAgICBzZWxlY3Rpb25SZWN0LmgsXG4gIClcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0WCxcbiAgICBzdGFydFksXG4gICAgc2VsZWN0aW9uUmVjdCxcbiAgICBwaXhlbHM6IGV4dHJhY3RlZCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 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 { BaseBlendMode } from '../BlendModes/blend-modes';\nexport const CANVAS_COMPOSITE_MAP = {\n [BaseBlendMode.overwrite]: 'copy',\n [BaseBlendMode.sourceOver]: 'source-over',\n [BaseBlendMode.darken]: 'darken',\n [BaseBlendMode.multiply]: 'multiply',\n [BaseBlendMode.colorBurn]: 'color-burn',\n [BaseBlendMode.lighten]: 'lighten',\n [BaseBlendMode.screen]: 'screen',\n [BaseBlendMode.colorDodge]: 'color-dodge',\n [BaseBlendMode.linearDodge]: 'lighter',\n [BaseBlendMode.overlay]: 'overlay',\n [BaseBlendMode.softLight]: 'soft-light',\n [BaseBlendMode.hardLight]: 'hard-light',\n [BaseBlendMode.difference]: 'difference',\n [BaseBlendMode.exclusion]: 'exclusion'\n} as const;\nexport type CanvasBlendModeIndex = keyof typeof CANVAS_COMPOSITE_MAP;\nexport type CanvasCompositeOperation = typeof CANVAS_COMPOSITE_MAP[CanvasBlendModeIndex];\n\n/**\n * example\n * function getCanvasCompositeOperation(mode: CanvasBlendModeIndex): CanvasCompositeOperation {\n * return CANVAS_COMPOSITE_MAP[mode]\n * }\n */\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUJsZW5kTW9kZSB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMnXG5cbmV4cG9ydCBjb25zdCBDQU5WQVNfQ09NUE9TSVRFX01BUCA9IHtcbiAgW0Jhc2VCbGVuZE1vZGUub3ZlcndyaXRlXTogJ2NvcHknLFxuICBbQmFzZUJsZW5kTW9kZS5zb3VyY2VPdmVyXTogJ3NvdXJjZS1vdmVyJyxcbiAgW0Jhc2VCbGVuZE1vZGUuZGFya2VuXTogJ2RhcmtlbicsXG4gIFtCYXNlQmxlbmRNb2RlLm11bHRpcGx5XTogJ211bHRpcGx5JyxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JCdXJuXTogJ2NvbG9yLWJ1cm4nLFxuICBbQmFzZUJsZW5kTW9kZS5saWdodGVuXTogJ2xpZ2h0ZW4nLFxuICBbQmFzZUJsZW5kTW9kZS5zY3JlZW5dOiAnc2NyZWVuJyxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JEb2RnZV06ICdjb2xvci1kb2RnZScsXG4gIFtCYXNlQmxlbmRNb2RlLmxpbmVhckRvZGdlXTogJ2xpZ2h0ZXInLFxuICBbQmFzZUJsZW5kTW9kZS5vdmVybGF5XTogJ292ZXJsYXknLFxuICBbQmFzZUJsZW5kTW9kZS5zb2Z0TGlnaHRdOiAnc29mdC1saWdodCcsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRMaWdodF06ICdoYXJkLWxpZ2h0JyxcbiAgW0Jhc2VCbGVuZE1vZGUuZGlmZmVyZW5jZV06ICdkaWZmZXJlbmNlJyxcbiAgW0Jhc2VCbGVuZE1vZGUuZXhjbHVzaW9uXTogJ2V4Y2x1c2lvbicsXG59IGFzIGNvbnN0XG5cbmV4cG9ydCB0eXBlIENhbnZhc0JsZW5kTW9kZUluZGV4ID0ga2V5b2YgdHlwZW9mIENBTlZBU19DT01QT1NJVEVfTUFQXG5leHBvcnQgdHlwZSBDYW52YXNDb21wb3NpdGVPcGVyYXRpb24gPSB0eXBlb2YgQ0FOVkFTX0NPTVBPU0lURV9NQVBbQ2FudmFzQmxlbmRNb2RlSW5kZXhdXG5cbi8qKlxuICogZXhhbXBsZVxuICogZnVuY3Rpb24gZ2V0Q2FudmFzQ29tcG9zaXRlT3BlcmF0aW9uKG1vZGU6IENhbnZhc0JsZW5kTW9kZUluZGV4KTogQ2FudmFzQ29tcG9zaXRlT3BlcmF0aW9uIHtcbiAqICAgcmV0dXJuIENBTlZBU19DT01QT1NJVEVfTUFQW21vZGVdXG4gKiB9XG4gKi9cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { CANVAS_CTX_FAILED } from './_constants';\nexport type CanvasContext<T> = T extends HTMLCanvasElement ? CanvasRenderingContext2D : OffscreenCanvasRenderingContext2D;\nexport type ReusableCanvas<T extends HTMLCanvasElement | OffscreenCanvas> = {\n readonly canvas: T;\n readonly ctx: CanvasContext<T>;\n};\n\n/**\n * Creates a reusable HTMLCanvasElement 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 return makeReusableCanvasMeta<HTMLCanvasElement>((w, h) => {\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n return canvas;\n });\n}\n\n/**\n * Creates a reusable OffscreenCanvas and context.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link OffscreenCanvasRenderingContext2D} context cannot be initialized.\n */\nexport function makeReusableOffscreenCanvas() {\n return makeReusableCanvasMeta<OffscreenCanvas>((w, h) => new OffscreenCanvas(w, h));\n}\nfunction makeReusableCanvasMeta<T extends HTMLCanvasElement | OffscreenCanvas>(factory: (w: number, h: number) => T) {\n let canvas: T | null = null;\n let ctx: CanvasContext<T> | null = null;\n const result: ReusableCanvas<T> = {\n canvas: null as any,\n ctx: null as any\n };\n function get(width: number, height: number): ReusableCanvas<T> {\n if (canvas === null) {\n canvas = factory(width, height);\n ctx = canvas.getContext('2d') as CanvasContext<T> | null;\n if (!ctx) {\n throw new Error(CANVAS_CTX_FAILED);\n }\n\n // Initialize the fresh context state\n ctx.imageSmoothingEnabled = false;\n (result as any).canvas = canvas;\n (result as any).ctx = ctx;\n\n // Early return to skip resize/clear checks for brand new canvases\n return result;\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 // Always reset transform before clearing to ensure the whole buffer is wiped\n ctx!.setTransform(1, 0, 0, 1, 0, 0);\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height);\n }\n return result;\n }\n get.reset = () => {\n canvas = null;\n ctx = null;\n (result as any).canvas = null;\n (result as any).ctx = null;\n };\n return get;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuL19jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIENhbnZhc0NvbnRleHQ8VD4gPSBUIGV4dGVuZHMgSFRNTENhbnZhc0VsZW1lbnRcbiAgPyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgOiBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcblxuZXhwb3J0IHR5cGUgUmV1c2FibGVDYW52YXM8VCBleHRlbmRzIEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzPiA9IHtcbiAgcmVhZG9ubHkgY2FudmFzOiBUXG4gIHJlYWRvbmx5IGN0eDogQ2FudmFzQ29udGV4dDxUPlxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXVzYWJsZSBIVE1MQ2FudmFzRWxlbWVudCBhbmQgY29udGV4dCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgRE9NLlxuICogRW5zdXJlcyBpdCBpcyBhbHdheXMgc2V0IHRvIGBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlYFxuICogQHNlZSBtYWtlUGl4ZWxDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXVzYWJsZUNhbnZhcygpIHtcbiAgcmV0dXJuIG1ha2VSZXVzYWJsZUNhbnZhc01ldGE8SFRNTENhbnZhc0VsZW1lbnQ+KCh3LCBoKSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcblxuICAgIGNhbnZhcy53aWR0aCA9IHdcbiAgICBjYW52YXMuaGVpZ2h0ID0gaFxuXG4gICAgcmV0dXJuIGNhbnZhc1xuICB9KVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXVzYWJsZSBPZmZzY3JlZW5DYW52YXMgYW5kIGNvbnRleHQuXG4gKiBFbnN1cmVzIGl0IGlzIGFsd2F5cyBzZXQgdG8gYGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2VgXG4gKiBAc2VlIG1ha2VQaXhlbENhbnZhc1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXVzYWJsZU9mZnNjcmVlbkNhbnZhcygpIHtcbiAgcmV0dXJuIG1ha2VSZXVzYWJsZUNhbnZhc01ldGE8T2Zmc2NyZWVuQ2FudmFzPigodywgaCkgPT4gbmV3IE9mZnNjcmVlbkNhbnZhcyh3LCBoKSlcbn1cblxuZnVuY3Rpb24gbWFrZVJldXNhYmxlQ2FudmFzTWV0YTxUIGV4dGVuZHMgSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM+KFxuICBmYWN0b3J5OiAodzogbnVtYmVyLCBoOiBudW1iZXIpID0+IFQsXG4pIHtcbiAgbGV0IGNhbnZhczogVCB8IG51bGwgPSBudWxsXG4gIGxldCBjdHg6IENhbnZhc0NvbnRleHQ8VD4gfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0IHJlc3VsdDogUmV1c2FibGVDYW52YXM8VD4gPSB7XG4gICAgY2FudmFzOiBudWxsIGFzIGFueSxcbiAgICBjdHg6IG51bGwgYXMgYW55LFxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUmV1c2FibGVDYW52YXM8VD4ge1xuICAgIGlmIChjYW52YXMgPT09IG51bGwpIHtcbiAgICAgIGNhbnZhcyA9IGZhY3Rvcnkod2lkdGgsIGhlaWdodClcbiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzIENhbnZhc0NvbnRleHQ8VD4gfCBudWxsXG5cbiAgICAgIGlmICghY3R4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRClcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJlc2ggY29udGV4dCBzdGF0ZVxuICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG5cbiAgICAgIDsocmVzdWx0IGFzIGFueSkuY2FudmFzID0gY2FudmFzXG4gICAgICA7KHJlc3VsdCBhcyBhbnkpLmN0eCA9IGN0eFxuXG4gICAgICAvLyBFYXJseSByZXR1cm4gdG8gc2tpcCByZXNpemUvY2xlYXIgY2hlY2tzIGZvciBicmFuZCBuZXcgY2FudmFzZXNcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgaWYgbmVlZGVkIChyZXNpemluZyBhdXRvLWNsZWFycylcbiAgICBpZiAoY2FudmFzLndpZHRoICE9PSB3aWR0aCB8fCBjYW52YXMuaGVpZ2h0ICE9PSBoZWlnaHQpIHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgICBjdHghLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFsd2F5cyByZXNldCB0cmFuc2Zvcm0gYmVmb3JlIGNsZWFyaW5nIHRvIGVuc3VyZSB0aGUgd2hvbGUgYnVmZmVyIGlzIHdpcGVkXG4gICAgICBjdHghLnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgICAgLy8gU2FtZSBzaXplIOKGkiBtYW51YWxseSBjbGVhclxuICAgICAgY3R4IS5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBnZXQucmVzZXQgPSAoKSA9PiB7XG4gICAgY2FudmFzID0gbnVsbFxuICAgIGN0eCA9IG51bGxcblxuICAgIDsocmVzdWx0IGFzIGFueSkuY2FudmFzID0gbnVsbFxuICAgIDsocmVzdWx0IGFzIGFueSkuY3R4ID0gbnVsbFxuICB9XG5cbiAgcmV0dXJuIGdldFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeReusableCanvas } from './ReusableCanvas';\nexport type DrawPixelLayer = (ctx: CanvasRenderingContext2D) => void;\nexport type DrawScreenLayer = (ctx: CanvasRenderingContext2D, scale: number) => void;\nexport type CanvasFrameRenderer = ReturnType<typeof makeCanvasFrameRenderer>;\nconst defaults = {\n makeReusableCanvas\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport function makeCanvasFrameRenderer(deps: Deps = defaults) {\n const {\n makeReusableCanvas = defaults.makeReusableCanvas\n } = deps;\n const bufferCanvas = makeReusableCanvas();\n return function renderCanvasFrame(pixelCanvas: PixelCanvas, scale: number, getImageData: () => ImageData | undefined | null, drawPixelLayer?: DrawPixelLayer, drawScreenLayer?: DrawScreenLayer) {\n const {\n canvas,\n ctx\n } = pixelCanvas;\n\n // 1. Clear pixel buffer (unscaled)\n const {\n ctx: pxCtx,\n canvas: pxCanvas\n } = bufferCanvas(canvas.width, canvas.height);\n\n // 2. Draw pixel data into pixel buffer\n const img = getImageData();\n if (img) {\n pxCtx.putImageData(img, 0, 0);\n }\n\n // draw transient pixel data\n drawPixelLayer?.(pxCtx);\n\n // clear target canvas\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Draw pixel buffer scaled onto screen\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n ctx.drawImage(pxCanvas, 0, 0);\n\n // Draw overlays in screen space\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n drawScreenLayer?.(ctx, scale);\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQaXhlbENhbnZhcyB9IGZyb20gJy4vUGl4ZWxDYW52YXMnXG5pbXBvcnQgeyBtYWtlUmV1c2FibGVDYW52YXMgfSBmcm9tICcuL1JldXNhYmxlQ2FudmFzJ1xuXG5leHBvcnQgdHlwZSBEcmF3UGl4ZWxMYXllciA9IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkgPT4gdm9pZFxuZXhwb3J0IHR5cGUgRHJhd1NjcmVlbkxheWVyID0gKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBzY2FsZTogbnVtYmVyKSA9PiB2b2lkXG5leHBvcnQgdHlwZSBDYW52YXNGcmFtZVJlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUNhbnZhc0ZyYW1lUmVuZGVyZXI+XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBtYWtlUmV1c2FibGVDYW52YXMsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNhbnZhc0ZyYW1lUmVuZGVyZXIoZGVwczogRGVwcyA9IGRlZmF1bHRzKSB7XG4gIGNvbnN0IHtcbiAgICBtYWtlUmV1c2FibGVDYW52YXMgPSBkZWZhdWx0cy5tYWtlUmV1c2FibGVDYW52YXMsXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYnVmZmVyQ2FudmFzID0gbWFrZVJldXNhYmxlQ2FudmFzKClcblxuICByZXR1cm4gZnVuY3Rpb24gcmVuZGVyQ2FudmFzRnJhbWUoXG4gICAgcGl4ZWxDYW52YXM6IFBpeGVsQ2FudmFzLFxuICAgIHNjYWxlOiBudW1iZXIsXG4gICAgZ2V0SW1hZ2VEYXRhOiAoKSA9PiBJbWFnZURhdGEgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIGRyYXdQaXhlbExheWVyPzogRHJhd1BpeGVsTGF5ZXIsXG4gICAgZHJhd1NjcmVlbkxheWVyPzogRHJhd1NjcmVlbkxheWVyLFxuICApIHtcbiAgICBjb25zdCB7IGNhbnZhcywgY3R4IH0gPSBwaXhlbENhbnZhc1xuXG4gICAgLy8gMS4gQ2xlYXIgcGl4ZWwgYnVmZmVyICh1bnNjYWxlZClcbiAgICBjb25zdCB7IGN0eDogcHhDdHgsIGNhbnZhczogcHhDYW52YXMgfSA9IGJ1ZmZlckNhbnZhcyhjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpXG5cbiAgICAvLyAyLiBEcmF3IHBpeGVsIGRhdGEgaW50byBwaXhlbCBidWZmZXJcbiAgICBjb25zdCBpbWcgPSBnZXRJbWFnZURhdGEoKVxuICAgIGlmIChpbWcpIHtcbiAgICAgIHB4Q3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApXG4gICAgfVxuXG4gICAgLy8gZHJhdyB0cmFuc2llbnQgcGl4ZWwgZGF0YVxuICAgIGRyYXdQaXhlbExheWVyPy4ocHhDdHgpXG5cbiAgICAvLyBjbGVhciB0YXJnZXQgY2FudmFzXG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KVxuXG4gICAgLy8gRHJhdyBwaXhlbCBidWZmZXIgc2NhbGVkIG9udG8gc2NyZWVuXG4gICAgY3R4LnNldFRyYW5zZm9ybShzY2FsZSwgMCwgMCwgc2NhbGUsIDAsIDApXG4gICAgY3R4LmRyYXdJbWFnZShweENhbnZhcywgMCwgMClcblxuICAgIC8vIERyYXcgb3ZlcmxheXMgaW4gc2NyZWVuIHNwYWNlXG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIGRyYXdTY3JlZW5MYXllcj8uKGN0eCwgc2NhbGUpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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==","/**\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 type PixelPatchTiles = {\n beforeTiles: PixelTile[];\n afterTiles: PixelTile[];\n};\nexport function applyPatchTiles(target: IPixelData32, tiles: PixelTile[], tileSize: number) {\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) continue;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBQaXhlbFRpbGUgfSBmcm9tICcuLi9QaXhlbFRpbGUvUGl4ZWxUaWxlJ1xuXG5leHBvcnQgdHlwZSBQaXhlbFBhdGNoVGlsZXMgPSB7XG4gIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXVxuICBhZnRlclRpbGVzOiBQaXhlbFRpbGVbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXRjaFRpbGVzKHRhcmdldDogSVBpeGVsRGF0YTMyLCB0aWxlczogUGl4ZWxUaWxlW10sIHRpbGVTaXplOiBudW1iZXIpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRpbGUgPSB0aWxlc1tpXVxuXG4gICAgaWYgKCF0aWxlKSBjb250aW51ZVxuXG4gICAgY29uc3QgZHN0ID0gdGFyZ2V0LmRhdGEzMlxuICAgIGNvbnN0IHNyYyA9IHRpbGUuZGF0YTMyXG4gICAgY29uc3QgZHN0V2lkdGggPSB0YXJnZXQud2lkdGhcbiAgICBjb25zdCBkc3RIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0XG4gICAgY29uc3Qgc3RhcnRYID0gdGlsZS50eCAqIHRpbGVTaXplXG4gICAgY29uc3Qgc3RhcnRZID0gdGlsZS50eSAqIHRpbGVTaXplXG5cbiAgICAvLyBDYWxjdWxhdGUgY2xhbXBpbmcgdG8gcHJldmVudCB3cmFwcGluZyBhcnRpZmFjdHMgb24gaW1hZ2UgZWRnZXNcbiAgICBjb25zdCBjb3B5V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aWxlU2l6ZSwgZHN0V2lkdGggLSBzdGFydFgpKVxuXG4gICAgaWYgKGNvcHlXaWR0aCA8PSAwKSBjb250aW51ZVxuXG4gICAgZm9yIChsZXQgbHkgPSAwOyBseSA8IHRpbGVTaXplOyBseSsrKSB7XG4gICAgICBjb25zdCBnbG9iYWxZID0gc3RhcnRZICsgbHlcblxuICAgICAgLy8gU3RvcCBpZiB3ZSBnbyBiZWxvdyB0aGUgaW1hZ2VcbiAgICAgIGlmIChnbG9iYWxZID49IGRzdEhlaWdodCkgYnJlYWtcblxuICAgICAgY29uc3QgZHN0SW5kZXggPSBnbG9iYWxZICogZHN0V2lkdGggKyBzdGFydFhcbiAgICAgIGNvbnN0IHNyY0luZGV4ID0gbHkgKiB0aWxlU2l6ZVxuICAgICAgY29uc3Qgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpXG5cbiAgICAgIGRzdC5zZXQocm93RGF0YSwgZHN0SW5kZXgpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { applyPatchTiles } from './PixelPatchTiles';\nexport interface HistoryAction {\n undo: () => void;\n redo: () => void;\n dispose?: () => void;\n}\nexport type HistoryActionFactory = typeof makeHistoryAction;\nexport function makeHistoryAction(writer: PixelWriter<any>, patch: PixelPatchTiles, after?: () => void, afterUndo?: () => void, afterRedo?: () => void, applyPatchTilesFn = applyPatchTiles): HistoryAction {\n const target = writer.config.target;\n const tileSize = writer.config.tileSize;\n const accumulator = writer.accumulator;\n return {\n undo: () => {\n applyPatchTilesFn(target, patch.beforeTiles, tileSize);\n afterUndo?.();\n after?.();\n },\n redo: () => {\n applyPatchTilesFn(target, patch.afterTiles, tileSize);\n afterRedo?.();\n after?.();\n },\n dispose: () => accumulator.recyclePatch(patch)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBwbHlQYXRjaFRpbGVzLCB0eXBlIFBpeGVsUGF0Y2hUaWxlcyB9IGZyb20gJy4vUGl4ZWxQYXRjaFRpbGVzJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4vUGl4ZWxXcml0ZXInXG5cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yeUFjdGlvbiB7XG4gIHVuZG86ICgpID0+IHZvaWRcbiAgcmVkbzogKCkgPT4gdm9pZFxuICBkaXNwb3NlPzogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgdHlwZSBIaXN0b3J5QWN0aW9uRmFjdG9yeSA9IHR5cGVvZiBtYWtlSGlzdG9yeUFjdGlvblxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUhpc3RvcnlBY3Rpb24oXG4gIHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PixcbiAgcGF0Y2g6IFBpeGVsUGF0Y2hUaWxlcyxcbiAgYWZ0ZXI/OiAoKSA9PiB2b2lkLFxuICBhZnRlclVuZG8/OiAoKSA9PiB2b2lkLFxuICBhZnRlclJlZG8/OiAoKSA9PiB2b2lkLFxuICBhcHBseVBhdGNoVGlsZXNGbiA9IGFwcGx5UGF0Y2hUaWxlcyxcbik6IEhpc3RvcnlBY3Rpb24ge1xuXG4gIGNvbnN0IHRhcmdldCA9IHdyaXRlci5jb25maWcudGFyZ2V0XG4gIGNvbnN0IHRpbGVTaXplID0gd3JpdGVyLmNvbmZpZy50aWxlU2l6ZVxuICBjb25zdCBhY2N1bXVsYXRvciA9IHdyaXRlci5hY2N1bXVsYXRvclxuXG4gIHJldHVybiB7XG4gICAgdW5kbzogKCkgPT4ge1xuICAgICAgYXBwbHlQYXRjaFRpbGVzRm4odGFyZ2V0LCBwYXRjaC5iZWZvcmVUaWxlcywgdGlsZVNpemUpXG4gICAgICBhZnRlclVuZG8/LigpXG4gICAgICBhZnRlcj8uKClcbiAgICB9LFxuICAgIHJlZG86ICgpID0+IHtcbiAgICAgIGFwcGx5UGF0Y2hUaWxlc0ZuKHRhcmdldCwgcGF0Y2guYWZ0ZXJUaWxlcywgdGlsZVNpemUpXG4gICAgICBhZnRlclJlZG8/LigpXG4gICAgICBhZnRlcj8uKClcbiAgICB9LFxuICAgIGRpc3Bvc2U6ICgpID0+IGFjY3VtdWxhdG9yLnJlY3ljbGVQYXRjaChwYXRjaCksXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export class HistoryManager {\n readonly undoStack: HistoryAction[];\n readonly redoStack: HistoryAction[];\n readonly 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5QWN0aW9uIH0gZnJvbSAnLi9IaXN0b3J5QWN0aW9uJ1xuXG5leHBvcnQgY2xhc3MgSGlzdG9yeU1hbmFnZXIge1xuICByZWFkb25seSB1bmRvU3RhY2s6IEhpc3RvcnlBY3Rpb25bXVxuICByZWFkb25seSByZWRvU3RhY2s6IEhpc3RvcnlBY3Rpb25bXVxuICByZWFkb25seSBsaXN0ZW5lcnM6IFNldDwoKSA9PiB2b2lkPlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtYXhTdGVwcyA9IDUwLFxuICApIHtcbiAgICB0aGlzLnVuZG9TdGFjayA9IFtdXG4gICAgdGhpcy5yZWRvU3RhY2sgPSBbXVxuICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IFNldCgpXG4gIH1cblxuICBnZXQgY2FuVW5kbygpIHtcbiAgICByZXR1cm4gdGhpcy51bmRvU3RhY2subGVuZ3RoID4gMFxuICB9XG5cbiAgZ2V0IGNhblJlZG8oKSB7XG4gICAgcmV0dXJuIHRoaXMucmVkb1N0YWNrLmxlbmd0aCA+IDBcbiAgfVxuXG4gIHN1YnNjcmliZShmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMubGlzdGVuZXJzLmFkZChmbilcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGZuKVxuICB9XG5cbiAgbm90aWZ5KCkge1xuICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGZuKSA9PiBmbigpKVxuICB9XG5cbiAgY29tbWl0KGFjdGlvbjogSGlzdG9yeUFjdGlvbikge1xuICAgIHRoaXMudW5kb1N0YWNrLnB1c2goYWN0aW9uKVxuICAgIHRoaXMuY2xlYXJSZWRvU3RhY2soKVxuXG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMubWF4U3RlcHMpIHtcbiAgICAgIHRoaXMudW5kb1N0YWNrLnNoaWZ0KCk/LmRpc3Bvc2U/LigpXG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZnkoKVxuICB9XG5cbiAgdW5kbygpIHtcbiAgICBsZXQgYWN0aW9uID0gdGhpcy51bmRvU3RhY2sucG9wKClcblxuICAgIGlmICghYWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMucmVkb1N0YWNrLnB1c2goYWN0aW9uKVxuICAgIGFjdGlvbi51bmRvKClcblxuICAgIHRoaXMubm90aWZ5KClcbiAgfVxuXG4gIHJlZG8oKSB7XG4gICAgbGV0IGFjdGlvbiA9IHRoaXMucmVkb1N0YWNrLnBvcCgpXG5cbiAgICBpZiAoIWFjdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLnVuZG9TdGFjay5wdXNoKGFjdGlvbilcbiAgICBhY3Rpb24ucmVkbygpXG5cbiAgICB0aGlzLm5vdGlmeSgpXG4gIH1cblxuICBjbGVhclJlZG9TdGFjaygpIHtcbiAgICBsZXQgbGVuZ3RoID0gdGhpcy5yZWRvU3RhY2subGVuZ3RoXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYWN0aW9uID0gdGhpcy5yZWRvU3RhY2tbaV1cblxuICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICBhY3Rpb24uZGlzcG9zZT8uKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlZG9TdGFjay5sZW5ndGggPSAwXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { applyPatchTiles } from './PixelPatchTiles';\nexport type DidChangeFn = (didChange: boolean) => boolean;\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[];\n public beforeTiles: PixelTile[];\n constructor(readonly config: PixelEngineConfig, readonly tilePool: PixelTilePool) {\n this.lookup = [];\n this.beforeTiles = [];\n }\n recyclePatch(patch: PixelPatchTiles) {\n this.tilePool.releaseTiles(patch.beforeTiles);\n this.tilePool.releaseTiles(patch.afterTiles);\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storePixelBeforeState(x: number, y: number): DidChangeFn {\n const shift = this.config.tileShift;\n const columns = this.config.targetColumns;\n const tx = x >> shift;\n const ty = y >> shift;\n const id = ty * columns + tx;\n let tile = this.lookup[id];\n let added = false;\n if (!tile) {\n tile = this.tilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n added = true;\n }\n return (didChange: boolean) => {\n if (!didChange && added) {\n this.beforeTiles.pop();\n this.lookup[id] = undefined;\n this.tilePool.releaseTile(tile!);\n }\n return didChange;\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): DidChangeFn {\n const shift = this.config.tileShift;\n const columns = this.config.targetColumns;\n const startX = x >> shift;\n const startY = y >> shift;\n const endX = x + w - 1 >> shift;\n const endY = y + h - 1 >> shift;\n const startIndex = this.beforeTiles.length;\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n const id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.tilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n }\n return (didChange: boolean) => {\n if (!didChange) {\n const length = this.beforeTiles.length;\n for (let i = startIndex; i < length; i++) {\n let t = this.beforeTiles[i];\n if (t) {\n this.lookup[t.id] = undefined;\n this.tilePool.releaseTile(t);\n }\n }\n this.beforeTiles.length = startIndex;\n }\n return didChange;\n };\n }\n storeTileBeforeState(id: number, tx: number, ty: number): DidChangeFn {\n let tile = this.lookup[id];\n let added = false;\n if (!tile) {\n tile = this.tilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n added = true;\n }\n return (didChange: boolean) => {\n if (!didChange && added) {\n this.beforeTiles.pop();\n this.lookup[id] = undefined;\n this.tilePool.releaseTile(tile!);\n }\n return didChange;\n };\n }\n extractState(tile: PixelTile) {\n const target = this.config.target;\n const TILE_SIZE = this.config.tileSize;\n const dst = tile.data32;\n const src = target.data32;\n const startX = tile.tx * TILE_SIZE;\n const startY = tile.ty * TILE_SIZE;\n const targetWidth = target.width;\n const targetHeight = target.height;\n\n // If the tile is completely outside the canvas, zero it out.\n if (startX >= targetWidth || startX + TILE_SIZE <= 0 || startY >= targetHeight || startY + TILE_SIZE <= 0) {\n dst.fill(0);\n return;\n }\n\n // Calculate offset if tile starts off the left side of the screen\n let srcOffsetX = Math.max(0, -startX);\n let copyWidth = Math.max(0, Math.min(TILE_SIZE - srcOffsetX, targetWidth - Math.max(0, startX)));\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly;\n let dstIndex = ly * TILE_SIZE;\n\n // Check negative bounds accurately\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE);\n continue;\n }\n let srcIndex = globalY * targetWidth + Math.max(0, startX);\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n\n // Shift the paste over by the offset\n dst.set(rowData, dstIndex + srcOffsetX);\n\n // Pad the left edge with 0s if we hung off the left side\n if (srcOffsetX > 0) {\n dst.fill(0, dstIndex, dstIndex + srcOffsetX);\n }\n\n // Pad the right edge with 0s if we hung off the right side\n if (srcOffsetX + copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + srcOffsetX + copyWidth, dstIndex + TILE_SIZE);\n }\n }\n }\n extractPatch(): PixelPatchTiles {\n const afterTiles: PixelTile[] = [];\n const 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.tilePool.getTile(beforeTile.id, beforeTile.tx, beforeTile.ty);\n this.extractState(afterTile);\n afterTiles.push(afterTile);\n }\n }\n const beforeTiles = this.beforeTiles;\n this.beforeTiles = [];\n this.lookup.length = 0;\n return {\n beforeTiles,\n afterTiles\n };\n }\n rollbackAfterError() {\n const target = this.config.target;\n const tileSize = this.config.tileSize;\n const length = this.beforeTiles.length;\n applyPatchTiles(target, this.beforeTiles, tileSize);\n for (let i = 0; i < length; i++) {\n let tile = this.beforeTiles[i];\n if (tile) {\n this.lookup[tile.id] = undefined;\n this.tilePool.releaseTile(tile);\n }\n }\n this.beforeTiles.length = 0;\n this.lookup.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxUaWxlIH0gZnJvbSAnLi4vUGl4ZWxUaWxlL1BpeGVsVGlsZSdcbmltcG9ydCB0eXBlIHsgUGl4ZWxUaWxlUG9vbCB9IGZyb20gJy4uL1BpeGVsVGlsZS9QaXhlbFRpbGVQb29sJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vUGl4ZWxFbmdpbmVDb25maWcnXG5pbXBvcnQgeyBhcHBseVBhdGNoVGlsZXMsIHR5cGUgUGl4ZWxQYXRjaFRpbGVzIH0gZnJvbSAnLi9QaXhlbFBhdGNoVGlsZXMnXG5cbmV4cG9ydCB0eXBlIERpZENoYW5nZUZuID0gKGRpZENoYW5nZTogYm9vbGVhbikgPT4gYm9vbGVhblxuXG5leHBvcnQgY2xhc3MgUGl4ZWxBY2N1bXVsYXRvciB7XG4gIHB1YmxpYyBsb29rdXA6IChQaXhlbFRpbGUgfCB1bmRlZmluZWQpW11cbiAgcHVibGljIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsXG4gICAgcmVhZG9ubHkgdGlsZVBvb2w6IFBpeGVsVGlsZVBvb2wsXG4gICkge1xuICAgIHRoaXMubG9va3VwID0gW11cbiAgICB0aGlzLmJlZm9yZVRpbGVzID0gW11cbiAgfVxuXG4gIHJlY3ljbGVQYXRjaChwYXRjaDogUGl4ZWxQYXRjaFRpbGVzKSB7XG4gICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYmVmb3JlVGlsZXMpXG4gICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYWZ0ZXJUaWxlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geCBwaXhlbCB4IGNvb3JkaW5hdGVcbiAgICogQHBhcmFtIHkgcGl4ZWwgeSBjb29yZGluYXRlXG4gICAqL1xuICBzdG9yZVBpeGVsQmVmb3JlU3RhdGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBEaWRDaGFuZ2VGbiB7XG4gICAgY29uc3Qgc2hpZnQgPSB0aGlzLmNvbmZpZy50aWxlU2hpZnRcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWcudGFyZ2V0Q29sdW1uc1xuICAgIGNvbnN0IHR4ID0geCA+PiBzaGlmdFxuICAgIGNvbnN0IHR5ID0geSA+PiBzaGlmdFxuICAgIGNvbnN0IGlkID0gdHkgKiBjb2x1bW5zICsgdHhcblxuICAgIGxldCB0aWxlID0gdGhpcy5sb29rdXBbaWRdXG4gICAgbGV0IGFkZGVkID0gZmFsc2VcblxuICAgIGlmICghdGlsZSkge1xuICAgICAgdGlsZSA9IHRoaXMudGlsZVBvb2wuZ2V0VGlsZShpZCwgdHgsIHR5KVxuXG4gICAgICB0aGlzLmV4dHJhY3RTdGF0ZSh0aWxlKVxuICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZVxuICAgICAgdGhpcy5iZWZvcmVUaWxlcy5wdXNoKHRpbGUpXG4gICAgICBhZGRlZCA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gKGRpZENoYW5nZTogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKCFkaWRDaGFuZ2UgJiYgYWRkZWQpIHtcbiAgICAgICAgdGhpcy5iZWZvcmVUaWxlcy5wb3AoKVxuICAgICAgICB0aGlzLmxvb2t1cFtpZF0gPSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZSh0aWxlISlcbiAgICAgIH1cbiAgICAgIHJldHVybiBkaWRDaGFuZ2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHggcGl4ZWwgeCBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB5IHBpeGVsIHkgY29vcmRpbmF0ZVxuICAgKiBAcGFyYW0gdyBwaXhlbCB3aWR0aFxuICAgKiBAcGFyYW0gaCBwaXhlbCBoZWlnaHRcbiAgICovXG4gIHN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB3OiBudW1iZXIsXG4gICAgaDogbnVtYmVyLFxuICApOiBEaWRDaGFuZ2VGbiB7XG4gICAgY29uc3Qgc2hpZnQgPSB0aGlzLmNvbmZpZy50aWxlU2hpZnRcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWcudGFyZ2V0Q29sdW1uc1xuXG4gICAgY29uc3Qgc3RhcnRYID0geCA+PiBzaGlmdFxuICAgIGNvbnN0IHN0YXJ0WSA9IHkgPj4gc2hpZnRcbiAgICBjb25zdCBlbmRYID0gKHggKyB3IC0gMSkgPj4gc2hpZnRcbiAgICBjb25zdCBlbmRZID0gKHkgKyBoIC0gMSkgPj4gc2hpZnRcblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgZm9yIChsZXQgdHkgPSBzdGFydFk7IHR5IDw9IGVuZFk7IHR5KyspIHtcbiAgICAgIGZvciAobGV0IHR4ID0gc3RhcnRYOyB0eCA8PSBlbmRYOyB0eCsrKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdHkgKiBjb2x1bW5zICsgdHhcbiAgICAgICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICB0aWxlID0gdGhpcy50aWxlUG9vbC5nZXRUaWxlKGlkLCB0eCwgdHkpXG5cbiAgICAgICAgICB0aGlzLmV4dHJhY3RTdGF0ZSh0aWxlKVxuICAgICAgICAgIHRoaXMubG9va3VwW2lkXSA9IHRpbGVcbiAgICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoZGlkQ2hhbmdlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWRpZENoYW5nZSkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBsZXQgdCA9IHRoaXMuYmVmb3JlVGlsZXNbaV1cblxuICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0aGlzLmxvb2t1cFt0LmlkXSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZSh0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmVmb3JlVGlsZXMubGVuZ3RoID0gc3RhcnRJbmRleFxuICAgICAgfVxuICAgICAgcmV0dXJuIGRpZENoYW5nZVxuICAgIH1cbiAgfVxuXG4gIHN0b3JlVGlsZUJlZm9yZVN0YXRlKGlkOiBudW1iZXIsIHR4OiBudW1iZXIsIHR5OiBudW1iZXIpOiBEaWRDaGFuZ2VGbiB7XG4gICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cbiAgICBsZXQgYWRkZWQgPSBmYWxzZVxuXG4gICAgaWYgKCF0aWxlKSB7XG4gICAgICB0aWxlID0gdGhpcy50aWxlUG9vbC5nZXRUaWxlKGlkLCB0eCwgdHkpXG5cbiAgICAgIHRoaXMuZXh0cmFjdFN0YXRlKHRpbGUpXG4gICAgICB0aGlzLmxvb2t1cFtpZF0gPSB0aWxlXG4gICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSlcbiAgICAgIGFkZGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiAoZGlkQ2hhbmdlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWRpZENoYW5nZSAmJiBhZGRlZCkge1xuICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnBvcCgpXG4gICAgICAgIHRoaXMubG9va3VwW2lkXSA9IHVuZGVmaW5lZFxuICAgICAgICB0aGlzLnRpbGVQb29sLnJlbGVhc2VUaWxlKHRpbGUhKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRpZENoYW5nZVxuICAgIH1cbiAgfVxuXG4gIGV4dHJhY3RTdGF0ZSh0aWxlOiBQaXhlbFRpbGUpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbmZpZy50YXJnZXRcbiAgICBjb25zdCBUSUxFX1NJWkUgPSB0aGlzLmNvbmZpZy50aWxlU2l6ZVxuICAgIGNvbnN0IGRzdCA9IHRpbGUuZGF0YTMyXG4gICAgY29uc3Qgc3JjID0gdGFyZ2V0LmRhdGEzMlxuICAgIGNvbnN0IHN0YXJ0WCA9IHRpbGUudHggKiBUSUxFX1NJWkVcbiAgICBjb25zdCBzdGFydFkgPSB0aWxlLnR5ICogVElMRV9TSVpFXG4gICAgY29uc3QgdGFyZ2V0V2lkdGggPSB0YXJnZXQud2lkdGhcbiAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0XG5cbiAgICAvLyBJZiB0aGUgdGlsZSBpcyBjb21wbGV0ZWx5IG91dHNpZGUgdGhlIGNhbnZhcywgemVybyBpdCBvdXQuXG4gICAgaWYgKHN0YXJ0WCA+PSB0YXJnZXRXaWR0aCB8fCBzdGFydFggKyBUSUxFX1NJWkUgPD0gMCB8fCBzdGFydFkgPj0gdGFyZ2V0SGVpZ2h0IHx8IHN0YXJ0WSArIFRJTEVfU0laRSA8PSAwKSB7XG4gICAgICBkc3QuZmlsbCgwKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIG9mZnNldCBpZiB0aWxlIHN0YXJ0cyBvZmYgdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2NyZWVuXG4gICAgbGV0IHNyY09mZnNldFggPSBNYXRoLm1heCgwLCAtc3RhcnRYKVxuICAgIGxldCBjb3B5V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihUSUxFX1NJWkUgLSBzcmNPZmZzZXRYLCB0YXJnZXRXaWR0aCAtIE1hdGgubWF4KDAsIHN0YXJ0WCkpKVxuXG4gICAgZm9yIChsZXQgbHkgPSAwOyBseSA8IFRJTEVfU0laRTsgbHkrKykge1xuICAgICAgbGV0IGdsb2JhbFkgPSBzdGFydFkgKyBseVxuICAgICAgbGV0IGRzdEluZGV4ID0gbHkgKiBUSUxFX1NJWkVcblxuICAgICAgLy8gQ2hlY2sgbmVnYXRpdmUgYm91bmRzIGFjY3VyYXRlbHlcbiAgICAgIGlmIChnbG9iYWxZIDwgMCB8fCBnbG9iYWxZID49IHRhcmdldEhlaWdodCB8fCBjb3B5V2lkdGggPT09IDApIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXgsIGRzdEluZGV4ICsgVElMRV9TSVpFKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgc3JjSW5kZXggPSBnbG9iYWxZICogdGFyZ2V0V2lkdGggKyBNYXRoLm1heCgwLCBzdGFydFgpXG4gICAgICBsZXQgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpXG5cbiAgICAgIC8vIFNoaWZ0IHRoZSBwYXN0ZSBvdmVyIGJ5IHRoZSBvZmZzZXRcbiAgICAgIGRzdC5zZXQocm93RGF0YSwgZHN0SW5kZXggKyBzcmNPZmZzZXRYKVxuXG4gICAgICAvLyBQYWQgdGhlIGxlZnQgZWRnZSB3aXRoIDBzIGlmIHdlIGh1bmcgb2ZmIHRoZSBsZWZ0IHNpZGVcbiAgICAgIGlmIChzcmNPZmZzZXRYID4gMCkge1xuICAgICAgICBkc3QuZmlsbCgwLCBkc3RJbmRleCwgZHN0SW5kZXggKyBzcmNPZmZzZXRYKVxuICAgICAgfVxuXG4gICAgICAvLyBQYWQgdGhlIHJpZ2h0IGVkZ2Ugd2l0aCAwcyBpZiB3ZSBodW5nIG9mZiB0aGUgcmlnaHQgc2lkZVxuICAgICAgaWYgKHNyY09mZnNldFggKyBjb3B5V2lkdGggPCBUSUxFX1NJWkUpIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXggKyBzcmNPZmZzZXRYICsgY29weVdpZHRoLCBkc3RJbmRleCArIFRJTEVfU0laRSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHRyYWN0UGF0Y2goKTogUGl4ZWxQYXRjaFRpbGVzIHtcbiAgICBjb25zdCBhZnRlclRpbGVzOiBQaXhlbFRpbGVbXSA9IFtdXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5iZWZvcmVUaWxlcy5sZW5ndGhcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBiZWZvcmVUaWxlID0gdGhpcy5iZWZvcmVUaWxlc1tpXVxuXG4gICAgICBpZiAoYmVmb3JlVGlsZSkge1xuICAgICAgICBsZXQgYWZ0ZXJUaWxlID0gdGhpcy50aWxlUG9vbC5nZXRUaWxlKGJlZm9yZVRpbGUuaWQsIGJlZm9yZVRpbGUudHgsIGJlZm9yZVRpbGUudHkpXG5cbiAgICAgICAgdGhpcy5leHRyYWN0U3RhdGUoYWZ0ZXJUaWxlKVxuICAgICAgICBhZnRlclRpbGVzLnB1c2goYWZ0ZXJUaWxlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJlZm9yZVRpbGVzID0gdGhpcy5iZWZvcmVUaWxlc1xuICAgIHRoaXMuYmVmb3JlVGlsZXMgPSBbXVxuICAgIHRoaXMubG9va3VwLmxlbmd0aCA9IDBcblxuICAgIHJldHVybiB7XG4gICAgICBiZWZvcmVUaWxlcyxcbiAgICAgIGFmdGVyVGlsZXMsXG4gICAgfVxuICB9XG5cbiAgcm9sbGJhY2tBZnRlckVycm9yKCkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29uZmlnLnRhcmdldFxuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5jb25maWcudGlsZVNpemVcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgYXBwbHlQYXRjaFRpbGVzKHRhcmdldCwgdGhpcy5iZWZvcmVUaWxlcywgdGlsZVNpemUpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdGlsZSA9IHRoaXMuYmVmb3JlVGlsZXNbaV1cblxuICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5sb29rdXBbdGlsZS5pZF0gPSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZSh0aWxlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlVGlsZXMubGVuZ3RoID0gMFxuICAgIHRoaXMubG9va3VwLmxlbmd0aCA9IDBcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export class PixelEngineConfig {\n readonly tileSize: number;\n // pixelX = tileX << tileShift\n // pixelY = tileY << tileShift\n readonly tileShift: number;\n readonly tileMask: number;\n readonly tileArea: number;\n readonly target!: PixelData;\n readonly targetColumns: number = 0;\n readonly targetRows: number = 0;\n constructor(tileSize: number, target: PixelData) {\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 = 31 - Math.clz32(tileSize);\n this.tileMask = tileSize - 1;\n this.tileArea = tileSize * tileSize;\n this.target = target;\n this.targetColumns = target.width + this.tileMask >> this.tileShift;\n this.targetRows = target.height + this.tileMask >> this.tileShift;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQaXhlbERhdGEgfSBmcm9tICcuLi9QaXhlbERhdGEvUGl4ZWxEYXRhJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxFbmdpbmVDb25maWcge1xuICByZWFkb25seSB0aWxlU2l6ZTogbnVtYmVyXG4gIC8vIHBpeGVsWCA9IHRpbGVYIDw8IHRpbGVTaGlmdFxuICAvLyBwaXhlbFkgPSB0aWxlWSA8PCB0aWxlU2hpZnRcbiAgcmVhZG9ubHkgdGlsZVNoaWZ0OiBudW1iZXJcbiAgcmVhZG9ubHkgdGlsZU1hc2s6IG51bWJlclxuICByZWFkb25seSB0aWxlQXJlYTogbnVtYmVyXG4gIHJlYWRvbmx5IHRhcmdldCE6IFBpeGVsRGF0YVxuICByZWFkb25seSB0YXJnZXRDb2x1bW5zOiBudW1iZXIgPSAwXG4gIHJlYWRvbmx5IHRhcmdldFJvd3M6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3Rvcih0aWxlU2l6ZTogbnVtYmVyLCB0YXJnZXQ6IFBpeGVsRGF0YSkge1xuICAgIC8vIEVuc3VyZSBpdCdzIGEgcG93ZXIgb2YgMiB0byBndWFyYW50ZWUgYml0d2lzZSBtYXRoIHdvcmtzXG4gICAgaWYgKCh0aWxlU2l6ZSAmICh0aWxlU2l6ZSAtIDEpKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlU2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMicpXG4gICAgfVxuXG4gICAgdGhpcy50aWxlU2l6ZSA9IHRpbGVTaXplXG4gICAgdGhpcy50aWxlU2hpZnQgPSAzMSAtIE1hdGguY2x6MzIodGlsZVNpemUpXG4gICAgdGhpcy50aWxlTWFzayA9IHRpbGVTaXplIC0gMVxuICAgIHRoaXMudGlsZUFyZWEgPSB0aWxlU2l6ZSAqIHRpbGVTaXplXG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXRcbiAgICB0aGlzLnRhcmdldENvbHVtbnMgPSAodGFyZ2V0LndpZHRoICsgdGhpcy50aWxlTWFzaykgPj4gdGhpcy50aWxlU2hpZnRcbiAgICB0aGlzLnRhcmdldFJvd3MgPSAodGFyZ2V0LmhlaWdodCArIHRoaXMudGlsZU1hc2spID4+IHRoaXMudGlsZVNoaWZ0XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blends a solid color into a target pixel buffer.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelData(dst: IPixelData32, color: Color32, opts: ColorBlendOptions = {}): boolean {\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 false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\n\n // 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 const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return false;\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 false;\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 let didChange = false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const current = dst32[dIdx] as Color32;\n const next = blendFn(finalSrcColor, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n }\n dIdx += dStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIENvbG9yQmxlbmRPcHRpb25zLCB0eXBlIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG4vKipcbiAqIEJsZW5kcyBhIHNvbGlkIGNvbG9yIGludG8gYSB0YXJnZXQgcGl4ZWwgYnVmZmVyLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgY29sb3I6IENvbG9yMzIsXG4gIG9wdHM6IENvbG9yQmxlbmRPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGJhc2VTcmNBbHBoYSA9IChjb2xvciA+Pj4gMjQpXG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gKGJsZW5kRm4gYXMgYW55KS5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuXG4gIGlmIChiYXNlU3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2VcblxuICAvLyBDbGlwcGluZ1xuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG5cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIC8vIFNpbmdsZS1jb2xvciBmaWxscyBjYW4gcHJlLWNhbGN1bGF0ZSB0aGUgc291cmNlIGNvbG9yIG9uY2VcbiAgbGV0IGZpbmFsU3JjQ29sb3IgPSBjb2xvclxuXG4gIGlmIChnbG9iYWxBbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGEgPSAoYmFzZVNyY0FscGhhICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVybiBmYWxzZVxuICAgIGZpbmFsU3JjQ29sb3IgPSAoKGNvbG9yICYgMHgwMGZmZmZmZikgfCAoYSA8PCAyNCkpID4+PiAwIGFzIENvbG9yMzJcbiAgfVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3QgbmV4dCA9IGJsZW5kRm4oZmluYWxTcmNDb2xvciwgY3VycmVudClcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZVxuICB9XG5cbiAgcmV0dXJuIGRpZENoYW5nZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 = {}): boolean {\n const target = writer.config.target;\n const {\n x = 0,\n y = 0,\n w = target.width,\n h = target.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendColorPixelData(target, color, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBDb2xvckJsZW5kT3B0aW9ucywgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHsgYmxlbmRDb2xvclBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JCbGVuZENvbG9yID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YSA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBibGVuZENvbG9yKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBvcHRzOiBDb2xvckJsZW5kT3B0aW9ucyA9IHt9LFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gdGFyZ2V0LndpZHRoLFxuICAgICAgICBoID0gdGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuICAgICAgcmV0dXJuIGRpZENoYW5nZShcbiAgICAgICAgYmxlbmRDb2xvclBpeGVsRGF0YSh0YXJnZXQsIGNvbG9yLCBvcHRzKSxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixel(target: IPixelData32, x: number, y: number, color: Color32, alpha: number = 255, blendFn: BlendColor32 = sourceOverPerfect): boolean {\n if (alpha === 0) return false;\n let width = target.width;\n let height = target.height;\n if (x < 0 || x >= width || y < 0 || y >= height) return false;\n let srcAlpha = color >>> 24;\n let isOverwrite = blendFn.isOverwrite;\n\n // Early exit for transparent source unless we are in an overwrite mode\n if (srcAlpha === 0 && !isOverwrite) return false;\n let dst32 = target.data32;\n let index = y * width + x;\n let finalColor = color;\n if (alpha !== 255) {\n let finalAlpha = srcAlpha * alpha + 128 >> 8;\n if (finalAlpha === 0 && !isOverwrite) return false;\n finalColor = (color & 0x00ffffff | finalAlpha << 24) >>> 0 as Color32;\n }\n let current = dst32[index] as Color32;\n let next = blendFn(finalColor, current);\n if (current !== next) {\n dst32[index] = next;\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbChcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhMzIsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBjb2xvcjogQ29sb3IzMixcbiAgYWxwaGE6IG51bWJlciA9IDI1NSxcbiAgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QsXG4pOiBib29sZWFuIHtcbiAgaWYgKGFscGhhID09PSAwKSByZXR1cm4gZmFsc2VcblxuICBsZXQgd2lkdGggPSB0YXJnZXQud2lkdGhcbiAgbGV0IGhlaWdodCA9IHRhcmdldC5oZWlnaHRcblxuICBpZiAoeCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5IDwgMCB8fCB5ID49IGhlaWdodCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHNyY0FscGhhID0gY29sb3IgPj4+IDI0XG4gIGxldCBpc092ZXJ3cml0ZSA9IGJsZW5kRm4uaXNPdmVyd3JpdGVcblxuICAvLyBFYXJseSBleGl0IGZvciB0cmFuc3BhcmVudCBzb3VyY2UgdW5sZXNzIHdlIGFyZSBpbiBhbiBvdmVyd3JpdGUgbW9kZVxuICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2VcblxuICBsZXQgZHN0MzIgPSB0YXJnZXQuZGF0YTMyXG4gIGxldCBpbmRleCA9IHkgKiB3aWR0aCArIHhcbiAgbGV0IGZpbmFsQ29sb3IgPSBjb2xvclxuXG4gIGlmIChhbHBoYSAhPT0gMjU1KSB7XG4gICAgbGV0IGZpbmFsQWxwaGEgPSAoc3JjQWxwaGEgKiBhbHBoYSArIDEyOCkgPj4gOFxuXG4gICAgaWYgKGZpbmFsQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2VcblxuICAgIGZpbmFsQ29sb3IgPSAoKChjb2xvciAmIDB4MDBmZmZmZmYpIHwgKGZpbmFsQWxwaGEgPDwgMjQpKSA+Pj4gMCkgYXMgQ29sb3IzMlxuICB9XG5cbiAgbGV0IGN1cnJlbnQgPSBkc3QzMltpbmRleF0gYXMgQ29sb3IzMlxuICBsZXQgbmV4dCA9IGJsZW5kRm4oZmluYWxDb2xvciwgY3VycmVudClcblxuICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgIGRzdDMyW2luZGV4XSA9IG5leHRcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { HistoryMutator } from '../../_types';\nimport { blendPixel } from '../../PixelData/blendPixel';\nconst defaults = {\n blendPixel\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixel = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixel = defaults.blendPixel\n } = deps;\n return {\n blendPixel(x: number, y: number, color: Color32, alpha?: number, blendFn?: BlendColor32): boolean {\n const didChange = writer.accumulator.storePixelBeforeState(x, y);\n return didChange(blendPixel(writer.config.target, x, y, color, alpha, blendFn));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYmxlbmRQaXhlbCB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGJsZW5kUGl4ZWwgfVxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRQaXhlbCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBQYXJ0aWFsPERlcHM+ID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kUGl4ZWwgPSBkZWZhdWx0cy5ibGVuZFBpeGVsLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYmxlbmRQaXhlbChcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlcixcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgYWxwaGE/OiBudW1iZXIsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICk6IGJvb2xlYW4ge1xuXG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVQaXhlbEJlZm9yZVN0YXRlKHgsIHkpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGJsZW5kUGl4ZWwod3JpdGVyLmNvbmZpZy50YXJnZXQsIHgsIHksIGNvbG9yLCBhbHBoYSwgYmxlbmRGbiksXG4gICAgICApXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cblxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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: IPixelData32, src: IPixelData32, opts: PixelBlendOptions = {}): boolean {\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 false;\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 false;\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 let didChange = false;\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 const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIElQaXhlbERhdGEzMiwgdHlwZSBQaXhlbEJsZW5kT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG4vKipcbiAqIEJsaXRzIHNvdXJjZSBQaXhlbERhdGEgaW50byBhIGRlc3RpbmF0aW9uIFBpeGVsRGF0YSB1c2luZyAzMi1iaXQgaW50ZWdlciBiaXR3aXNlIGJsZW5kaW5nLlxuICogVGhpcyBmdW5jdGlvbiBieXBhc3NlcyBzdGFuZGFyZCBJbWFnZURhdGEgbGltaXRhdGlvbnMgYnkgb3BlcmF0aW5nIGRpcmVjdGx5IG9uXG4gKiBVaW50MzJBcnJheSB2aWV3cy4gSXQgc3VwcG9ydHMgdmFyaW91cyBibGVuZCBtb2RlcywgYmluYXJ5L2FscGhhIG1hc2tpbmcsIGFuZFxuICogYXV0b21hdGljIGNsaXBwaW5nIG9mIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBib3VuZHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRzdCA9IG5ldyBQaXhlbERhdGEoY3R4LmdldEltYWdlRGF0YSgwLDAsMTAwLDEwMCkpXG4gKiBibGVuZEltYWdlRGF0YTMyKGRzdCwgc3ByaXRlLCB7XG4gKiAgIGJsZW5kRm46IENPTE9SXzMyX0JMRU5EX01PREVTLm11bHRpcGx5LFxuICogICBtYXNrOiBicnVzaE1hc2ssXG4gKiAgIG1hc2tUeXBlOiBNYXNrVHlwZS5BTFBIQVxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIHNyYzogSVBpeGVsRGF0YTMyLFxuICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyA9IHt9LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICB4OiB0YXJnZXRYID0gMCxcbiAgICB5OiB0YXJnZXRZID0gMCxcbiAgICBzeDogc291cmNlWCA9IDAsXG4gICAgc3k6IHNvdXJjZVkgPSAwLFxuICAgIHc6IHdpZHRoID0gc3JjLndpZHRoLFxuICAgIGg6IGhlaWdodCA9IHNyYy5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZVxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHN4ID0gc291cmNlWFxuICBsZXQgc3kgPSBzb3VyY2VZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeFxuICAgIHcgKz0gc3hcbiAgICBzeCA9IDBcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeVxuICAgIGggKz0gc3lcbiAgICBzeSA9IDBcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpXG4gIGggPSBNYXRoLm1pbihoLCBzcmMuaGVpZ2h0IC0gc3kpXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBzcmMzMiA9IHNyYy5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgY29uc3Qgc3cgPSBzcmMud2lkdGhcblxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IHNJZHggPSAoc3kgKiBzdyArIHN4KSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNTdHJpZGUgPSAoc3cgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZVxuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IChzcmNDb2wgPj4+IDI0KVxuXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sXG4gICAgICBpZiAoIWlzT3BhcXVlKSB7XG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3QgbmV4dCA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dFxuICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZVxuICAgIHNJZHggKz0gc1N0cmlkZVxuICB9XG5cbiAgcmV0dXJuIGRpZENoYW5nZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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: IPixelData32, opts: PixelBlendOptions = {}): boolean {\n const {\n x = 0,\n y = 0,\n w = src.width,\n h = src.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelData(writer.config.target, src, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgSVBpeGVsRGF0YTMyLCBQaXhlbEJsZW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGJsZW5kUGl4ZWxEYXRhIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kUGl4ZWxEYXRhID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGEgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YSxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGJsZW5kUGl4ZWxEYXRhKFxuICAgICAgc3JjOiBJUGl4ZWxEYXRhMzIsXG4gICAgICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyA9IHt9LFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHcgPSBzcmMud2lkdGgsXG4gICAgICAgIGggPSBzcmMuaGVpZ2h0LFxuICAgICAgfSA9IG9wdHNcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGJsZW5kUGl4ZWxEYXRhKHdyaXRlci5jb25maWcudGFyZ2V0LCBzcmMsIG9wdHMpLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataAlphaMask(dst: IPixelData32, src: IPixelData32, alphaMask: AlphaMask, opts: PixelBlendMaskOptions = {}): boolean {\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 false;\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 false;\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 let didChange = 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 const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQ29sb3IzMiwgdHlwZSBJUGl4ZWxEYXRhMzIsIHR5cGUgUGl4ZWxCbGVuZE1hc2tPcHRpb25zIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBibGVuZFBpeGVsRGF0YUFscGhhTWFzayhcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIHNyYzogSVBpeGVsRGF0YTMyLFxuICBhbHBoYU1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogUGl4ZWxCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHN4OiBzb3VyY2VYID0gMCxcbiAgICBzeTogc291cmNlWSA9IDAsXG4gICAgdzogd2lkdGggPSBzcmMud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gc3JjLmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgc3ggPSBzb3VyY2VYXG4gIGxldCBzeSA9IHNvdXJjZVlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIC8vIDEuIENsaXBwaW5nIChNYXRjaGVzIG1haW4gYnJhbmNoIGJlaGF2aW9yKVxuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeFxuICAgIHcgKz0gc3hcbiAgICBzeCA9IDBcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeVxuICAgIGggKz0gc3lcbiAgICBzeSA9IDBcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpXG4gIGggPSBNYXRoLm1pbihoLCBzcmMuaGVpZ2h0IC0gc3kpXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIC8vIDIuIEluZGV4IFNldHVwXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IGFscGhhTWFzay53XG4gIGNvbnN0IG1hc2tEYXRhID0gYWxwaGFNYXNrLmRhdGFcblxuICAvLyBkeC9keSBpcyB0aGUgZGlzcGxhY2VtZW50IGZyb20gcmVxdWVzdGVkIHN0YXJ0IHRvIGNsaXBwZWQgc3RhcnQuXG4gIC8vIFRoaXMga2VlcHMgdGhlIG1hc2sgbG9ja2VkIHRvIHRoZSBzb3VyY2UgY29udGVudCBkdXJpbmcgY3Jvc3MtY2xpcHBpbmcuXG4gIGNvbnN0IGR4ID0gKHggLSB0YXJnZXRYKSB8IDBcbiAgY29uc3QgZHkgPSAoeSAtIHRhcmdldFkpIHwgMFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBzcmMzMiA9IHNyYy5kYXRhMzJcblxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IHNJZHggPSAoc3kgKiBzdyArIHN4KSB8IDBcbiAgbGV0IG1JZHggPSAoKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpKSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNTdHJpZGUgPSAoc3cgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcblxuICBjb25zdCBpc09wYXF1ZSA9IGdsb2JhbEFscGhhID09PSAyNTVcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSBibGVuZEZuLmlzT3ZlcndyaXRlIHx8IGZhbHNlXG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBtYXNrRGF0YVttSWR4XVxuICAgICAgY29uc3QgZWZmTSA9IGludmVydE1hc2sgPyAyNTUgLSBtVmFsIDogbVZhbFxuXG4gICAgICAvLyBFYXJseSBleGl0IGlmIG1hc2sgaXMgZnVsbHkgdHJhbnNwYXJlbnRcbiAgICAgIGlmIChlZmZNID09PSAwKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNyY0NvbCA9IHNyYzMyW3NJZHhdIGFzIENvbG9yMzJcbiAgICAgIGNvbnN0IHNyY0FscGhhID0gc3JjQ29sID4+PiAyNFxuXG4gICAgICAvLyBFYXJseSBleGl0IGlmIHNvdXJjZSBpcyBmdWxseSB0cmFuc3BhcmVudCAodW5sZXNzIG92ZXJ3cml0aW5nKVxuICAgICAgaWYgKHNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgd2VpZ2h0IHVzaW5nIGxpbmVhciBsb2dpYyAoRWFzaWVyIGZvciBKSVQgdGhhbiBuZXN0ZWQgdGVybmFyaWVzKVxuICAgICAgbGV0IHdlaWdodCA9IGdsb2JhbEFscGhhXG4gICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZWZmTVxuICAgICAgfSBlbHNlIGlmIChlZmZNICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gKGVmZk0gKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgfVxuXG4gICAgICAvLyBaZXJvLXdlaWdodCBzYWZldHkgY2hlY2tcbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIHNJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sXG4gICAgICBpZiAod2VpZ2h0IDwgMjU1KSB7XG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiB3ZWlnaHQgKyAxMjgpID4+IDhcbiAgICAgICAgLy8gRmluYWwgY2hlY2s6IHdlaWdodCBtaWdodCBoYXZlIHJlc3VsdGVkIGluIGEgdHJhbnNwYXJlbnQgcGl4ZWxcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrXG4gICAgICAgICAgc0lkeCsrXG4gICAgICAgICAgbUlkeCsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9ICgoc3JjQ29sICYgMHgwMGZmZmZmZikgfCAoYSA8PCAyNCkpID4+PiAwIGFzIENvbG9yMzJcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBuZXh0ID0gYmxlbmRGbihmaW5hbENvbCwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBzSWR4KytcbiAgICAgIG1JZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBzSWR4ICs9IHNTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxuXG4gIHJldHVybiBkaWRDaGFuZ2Vcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { HistoryMutator } from '../../_types';\nimport { blendPixelDataAlphaMask } from '../../PixelData/blendPixelDataAlphaMask';\nconst defaults = {\n blendPixelDataAlphaMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixelDataAlphaMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataAlphaMask = defaults.blendPixelDataAlphaMask\n } = deps;\n return {\n blendPixelDataAlphaMask(src: IPixelData32, mask: AlphaMask, opts: PixelBlendMaskOptions = {}): boolean {\n const x = opts.x ?? 0;\n const y = opts.y ?? 0;\n const w = opts.w ?? src.width;\n const h = opts.h ?? src.height;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelDataAlphaMask(writer.config.target, src, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIEhpc3RvcnlNdXRhdG9yLCBJUGl4ZWxEYXRhMzIsIFBpeGVsQmxlbmRNYXNrT3B0aW9ucyB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YUFscGhhTWFzayxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrKFxuICAgICAgc3JjOiBJUGl4ZWxEYXRhMzIsXG4gICAgICBtYXNrOiBBbHBoYU1hc2ssXG4gICAgICBvcHRzOiBQaXhlbEJsZW5kTWFza09wdGlvbnMgPSB7fSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzLnggPz8gMFxuICAgICAgY29uc3QgeSA9IG9wdHMueSA/PyAwXG4gICAgICBjb25zdCB3ID0gb3B0cy53ID8/IHNyYy53aWR0aFxuICAgICAgY29uc3QgaCA9IG9wdHMuaCA/PyBzcmMuaGVpZ2h0XG5cbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBzcmMsIG1hc2ssIG9wdHMpLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataBinaryMask(dst: IPixelData32, src: IPixelData32, binaryMask: BinaryMask, opts: PixelBlendMaskOptions = {}): boolean {\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 false;\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 false;\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 let didChange = 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 const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBJUGl4ZWxEYXRhMzIsIFBpeGVsQmxlbmRNYXNrT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgc3JjOiBJUGl4ZWxEYXRhMzIsXG4gIGJpbmFyeU1hc2s6IEJpbmFyeU1hc2ssXG4gIG9wdHM6IFBpeGVsQmxlbmRNYXNrT3B0aW9ucyA9IHt9LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICB4OiB0YXJnZXRYID0gMCxcbiAgICB5OiB0YXJnZXRZID0gMCxcbiAgICBzeDogc291cmNlWCA9IDAsXG4gICAgc3k6IHNvdXJjZVkgPSAwLFxuICAgIHc6IHdpZHRoID0gc3JjLndpZHRoLFxuICAgIGg6IGhlaWdodCA9IHNyYy5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBteCA9IDAsXG4gICAgbXkgPSAwLFxuICAgIGludmVydE1hc2sgPSBmYWxzZSxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZVxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHN4ID0gc291cmNlWFxuICBsZXQgc3kgPSBzb3VyY2VZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICAvLyAxLiBTb3VyY2UgQ2xpcHBpbmdcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3hcbiAgICB3ICs9IHN4XG4gICAgc3ggPSAwXG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3lcbiAgICBoICs9IHN5XG4gICAgc3kgPSAwXG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyYy53aWR0aCAtIHN4KVxuICBoID0gTWF0aC5taW4oaCwgc3JjLmhlaWdodCAtIHN5KVxuXG4gIC8vIDIuIERlc3RpbmF0aW9uIENsaXBwaW5nXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgLy8gMy4gQ29vcmRpbmF0ZSBEaXNwbGFjZW1lbnQgZm9yIE1hc2sgU3luY1xuICAvLyBkeC9keSByZXByZXNlbnRzIGhvdyBmYXIgdGhlIGNsaXBwZWQgc3RhcnQgaXMgZnJvbSB0aGUgcmVxdWVzdGVkIHN0YXJ0LlxuICAvLyBUaGlzIGlzIHRoZSBzdGFibGUgd2F5IHRvIGFsaWduIHRoZSBtYXNrIGFjcm9zcyBhbGwgY2xpcHBpbmcgcGVybXV0YXRpb25zLlxuICBjb25zdCBkeCA9ICh4IC0gdGFyZ2V0WCkgfCAwXG4gIGNvbnN0IGR5ID0gKHkgLSB0YXJnZXRZKSB8IDBcblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IGJpbmFyeU1hc2sud1xuICBjb25zdCBtYXNrRGF0YSA9IGJpbmFyeU1hc2suZGF0YVxuXG4gIGxldCBkSWR4ID0gKHkgKiBkdyArIHgpIHwgMFxuICBsZXQgc0lkeCA9IChzeSAqIHN3ICsgc3gpIHwgMFxuICBsZXQgbUlkeCA9ICgobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkpIHwgMFxuXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3Qgc1N0cmlkZSA9IChzdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBtU3RyaWRlID0gKG1QaXRjaCAtIGFjdHVhbFcpIHwgMFxuXG4gIGNvbnN0IHNraXBWYWwgPSBpbnZlcnRNYXNrID8gMSA6IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICAvLyBCaW5hcnkgTWFzayBDaGVjayAoRWFybGllc3QgZXhpdClcbiAgICAgIGlmIChtYXNrRGF0YVttSWR4XSA9PT0gc2tpcFZhbCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IHNyY0NvbCA+Pj4gMjRcblxuICAgICAgLy8gU291cmNlIEFscGhhIENoZWNrXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbENvbCA9IHNyY0NvbFxuICAgICAgaWYgKCFpc09wYXF1ZSkge1xuICAgICAgICAvLyBSb3VuZGluZy1jb3JyZWN0ZWQgZ2xvYmFsIGFscGhhIGFwcGxpY2F0aW9uXG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBtSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3QgbmV4dCA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dFxuICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgc0lkeCArPSBzU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cblxuICByZXR1cm4gZGlkQ2hhbmdlXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { blendPixelDataBinaryMask } from '../../PixelData/blendPixelDataBinaryMask';\nconst defaults = {\n blendPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixelDataBinaryMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataBinaryMask = defaults.blendPixelDataBinaryMask\n } = deps;\n return {\n blendPixelDataBinaryMask(src: IPixelData32, mask: BinaryMask, opts: PixelBlendMaskOptions = {}): boolean {\n const x = opts.x ?? 0;\n const y = opts.y ?? 0;\n const w = opts.w ?? src.width;\n const h = opts.h ?? src.height;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelDataBinaryMask(writer.config.target, src, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBIaXN0b3J5TXV0YXRvciwgSVBpeGVsRGF0YTMyLCBQaXhlbEJsZW5kTWFza09wdGlvbnMgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JCbGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2soXG4gICAgICBzcmM6IElQaXhlbERhdGEzMixcbiAgICAgIG1hc2s6IEJpbmFyeU1hc2ssXG4gICAgICBvcHRzOiBQaXhlbEJsZW5kTWFza09wdGlvbnMgPSB7fSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzLnggPz8gMFxuICAgICAgY29uc3QgeSA9IG9wdHMueSA/PyAwXG4gICAgICBjb25zdCB3ID0gb3B0cy53ID8/IHNyYy53aWR0aFxuICAgICAgY29uc3QgaCA9IG9wdHMuaCA/PyBzcmMuaGVpZ2h0XG5cbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgc3JjLCBtYXNrLCBvcHRzKSxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link IPixelData32} buffer with a solid color.\n * This function is faster than {@link fillPixelData} but does not\n * return a boolean value indicating changes were made.\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 fillPixelDataFast(dst: IPixelData32, 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 fillPixelDataFast(dst: IPixelData32, color: Color32, x: number, y: number, w: number, h: number): void;\nexport function fillPixelDataFast(dst: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBJUGl4ZWxEYXRhMzIsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfUkVDVCA9IG1ha2VDbGlwcGVkUmVjdCgpXG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb3IgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHtAbGluayBmaWxsUGl4ZWxEYXRhfSBidXQgZG9lcyBub3RcbiAqIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBjaGFuZ2VzIHdlcmUgbWFkZS5cbiAqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gcmVjdCAtIERlZmluZXMgdGhlIGFyZWEgdG8gZmlsbC4gSWYgb21pdHRlZCwgdGhlIGVudGlyZVxuICogYnVmZmVyIGlzIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGFGYXN0KFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgY29sb3I6IENvbG9yMzIsXG4gIHJlY3Q/OiBQYXJ0aWFsPFJlY3Q+LFxuKTogdm9pZFxuLyoqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gV2lkdGggb2YgdGhlIGZpbGwgYXJlYS5cbiAqIEBwYXJhbSBoIC0gSGVpZ2h0IG9mIHRoZSBmaWxsIGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhRmFzdChcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YUZhc3QoXG4gIGRzdDogSVBpeGVsRGF0YTMyLFxuICBjb2xvcjogQ29sb3IzMixcbiAgX3g/OiBQYXJ0aWFsPFJlY3Q+IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGxldCB4OiBudW1iZXJcbiAgbGV0IHk6IG51bWJlclxuICBsZXQgdzogbnVtYmVyXG4gIGxldCBoOiBudW1iZXJcblxuICBpZiAodHlwZW9mIF94ID09PSAnb2JqZWN0Jykge1xuICAgIHggPSBfeC54ID8/IDBcbiAgICB5ID0gX3gueSA/PyAwXG4gICAgdyA9IF94LncgPz8gZHN0LndpZHRoXG4gICAgaCA9IF94LmggPz8gZHN0LmhlaWdodFxuICB9IGVsc2UgaWYgKHR5cGVvZiBfeCA9PT0gJ251bWJlcicpIHtcbiAgICB4ID0gX3hcbiAgICB5ID0gX3khXG4gICAgdyA9IF93IVxuICAgIGggPSBfaCFcbiAgfSBlbHNlIHtcbiAgICB4ID0gMFxuICAgIHkgPSAwXG4gICAgdyA9IGRzdC53aWR0aFxuICAgIGggPSBkc3QuaGVpZ2h0XG4gIH1cblxuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh4LCB5LCB3LCBoLCBkc3Qud2lkdGgsIGRzdC5oZWlnaHQsIFNDUkFUQ0hfUkVDVClcblxuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVyblxuXG4gIC8vIFVzZSB0aGUgY2xpcHBlZCB2YWx1ZXNcbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuXG4gIC8vIE9wdGltaXphdGlvbjogSWYgZmlsbGluZyB0aGUgZW50aXJlIGJ1ZmZlciwgdXNlIHRoZSBuYXRpdmUgLmZpbGwoKVxuICBpZiAoYWN0dWFsVyA9PT0gZHcgJiYgYWN0dWFsSCA9PT0gZHN0LmhlaWdodCAmJiBmaW5hbFggPT09IDAgJiYgZmluYWxZID09PSAwKSB7XG4gICAgZHN0MzIuZmlsbChjb2xvcilcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFJvdy1ieS1yb3cgZmlsbCBmb3IgcGFydGlhbCByZWN0YW5nbGVzXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3Qgc3RhcnQgPSAoZmluYWxZICsgaXkpICogZHcgKyBmaW5hbFhcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGFjdHVhbFdcbiAgICBkc3QzMi5maWxsKGNvbG9yLCBzdGFydCwgZW5kKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32, HistoryMutator } from '../../_types';\nimport { fillPixelDataFast } from '../../PixelData/fillPixelDataFast';\nconst defaults = {\n fillPixelData: fillPixelDataFast\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<Rect> = {}) {\n const target = writer.config.target;\n const x = rect.x ?? 0;\n const y = rect.y ?? 0;\n const w = rect.w ?? target.width;\n const h = rect.h ?? target.height;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n fillPixelData(target, 0 as Color32, x, y, w, h);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciwgUmVjdCB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGFGYXN0IH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGFGYXN0J1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGZpbGxQaXhlbERhdGE6IGZpbGxQaXhlbERhdGFGYXN0IH1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQ2xlYXIgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YSxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGNsZWFyKFxuICAgICAgcmVjdDogUGFydGlhbDxSZWN0PiA9IHt9LFxuICAgICkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcbiAgICAgIGNvbnN0IHggPSByZWN0LnggPz8gMFxuICAgICAgY29uc3QgeSA9IHJlY3QueSA/PyAwXG4gICAgICBjb25zdCB3ID0gcmVjdC53ID8/IHRhcmdldC53aWR0aFxuICAgICAgY29uc3QgaCA9IHJlY3QuaCA/PyB0YXJnZXQuaGVpZ2h0XG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBmaWxsUGl4ZWxEYXRhKHRhcmdldCwgMCBhcyBDb2xvcjMyLCB4LCB5LCB3LCBoKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link IPixelData32} 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 * @returns true if any pixels were actually modified.\n */\nexport function fillPixelData(dst: IPixelData32, color: Color32, rect?: Partial<Rect>): boolean;\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: IPixelData32, color: Color32, x: number, y: number, w: number, h: number): boolean;\nexport function fillPixelData(dst: IPixelData32, color: Color32, _x?: Partial<Rect> | number, _y?: number, _w?: number, _h?: number): boolean {\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 false;\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 let hasChanged = false;\n for (let iy = 0; iy < actualH; iy++) {\n const rowOffset = (finalY + iy) * dw;\n const start = rowOffset + finalX;\n const end = start + actualW;\n for (let i = start; i < end; i++) {\n if (dst32[i] !== color) {\n dst32[i] = color;\n hasChanged = true;\n }\n }\n }\n return hasChanged;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBJUGl4ZWxEYXRhMzIsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfUkVDVCA9IG1ha2VDbGlwcGVkUmVjdCgpXG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb3IgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHJlY3QgLSBEZWZpbmVzIHRoZSBhcmVhIHRvIGZpbGwuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmVcbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICByZWN0PzogUGFydGlhbDxSZWN0Pixcbik6IGJvb2xlYW5cbi8qKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHggLSBTdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gdyAtIFdpZHRoIG9mIHRoZSBmaWxsIGFyZWEuXG4gKiBAcGFyYW0gaCAtIEhlaWdodCBvZiB0aGUgZmlsbCBhcmVhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiBib29sZWFuXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICBfeD86IFBhcnRpYWw8UmVjdD4gfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiBib29sZWFuIHtcbiAgbGV0IHg6IG51bWJlclxuICBsZXQgeTogbnVtYmVyXG4gIGxldCB3OiBudW1iZXJcbiAgbGV0IGg6IG51bWJlclxuXG4gIGlmICh0eXBlb2YgX3ggPT09ICdvYmplY3QnKSB7XG4gICAgeCA9IF94LnggPz8gMFxuICAgIHkgPSBfeC55ID8/IDBcbiAgICB3ID0gX3gudyA/PyBkc3Qud2lkdGhcbiAgICBoID0gX3guaCA/PyBkc3QuaGVpZ2h0XG4gIH0gZWxzZSBpZiAodHlwZW9mIF94ID09PSAnbnVtYmVyJykge1xuICAgIHggPSBfeFxuICAgIHkgPSBfeSFcbiAgICB3ID0gX3chXG4gICAgaCA9IF9oIVxuICB9IGVsc2Uge1xuICAgIHggPSAwXG4gICAgeSA9IDBcbiAgICB3ID0gZHN0LndpZHRoXG4gICAgaCA9IGRzdC5oZWlnaHRcbiAgfVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlUmVjdENsaXBwaW5nKFxuICAgIHgsXG4gICAgeSxcbiAgICB3LFxuICAgIGgsXG4gICAgZHN0LndpZHRoLFxuICAgIGRzdC5oZWlnaHQsXG4gICAgU0NSQVRDSF9SRUNULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCB7XG4gICAgeDogZmluYWxYLFxuICAgIHk6IGZpbmFsWSxcbiAgICB3OiBhY3R1YWxXLFxuICAgIGg6IGFjdHVhbEgsXG4gIH0gPSBjbGlwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGxldCBoYXNDaGFuZ2VkID0gZmFsc2VcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IChmaW5hbFkgKyBpeSkgKiBkd1xuICAgIGNvbnN0IHN0YXJ0ID0gcm93T2Zmc2V0ICsgZmluYWxYXG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyBhY3R1YWxXXG5cbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgaWYgKGRzdDMyW2ldICE9PSBjb2xvcikge1xuICAgICAgICBkc3QzMltpXSA9IGNvbG9yXG4gICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc0NoYW5nZWRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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, x = 0, y = 0, w = writer.config.target.width, h = writer.config.target.height) {\n const target = writer.config.target;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(fillPixelData(target, color, x, y, w, h));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFillRect = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n fillRect(color: Color32, rect: Rect) {\n const target = writer.config.target;\n const didChange = writer.accumulator.storeRegionBeforeState(rect.x, rect.y, rect.w, rect.h);\n return didChange(fillPixelData(target, color, rect.x, rect.y, rect.w, rect.h));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciwgUmVjdCB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvZmlsbFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBmaWxsUGl4ZWxEYXRhIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YSxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGZpbGwoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHggPSAwLFxuICAgICAgeSA9IDAsXG4gICAgICB3ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQud2lkdGgsXG4gICAgICBoID0gd3JpdGVyLmNvbmZpZy50YXJnZXQuaGVpZ2h0LFxuICAgICkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcblxuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaClcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGZpbGxQaXhlbERhdGEodGFyZ2V0LCBjb2xvciwgeCwgeSwgdywgaCksXG4gICAgICApXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JGaWxsUmVjdCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZpbGxQaXhlbERhdGEgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgZmlsbFJlY3QoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHJlY3Q6IFJlY3QsXG4gICAgKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3cml0ZXIuY29uZmlnLnRhcmdldFxuXG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZShyZWN0LngsIHJlY3QueSwgcmVjdC53LCByZWN0LmgpXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKFxuICAgICAgICBmaWxsUGl4ZWxEYXRhKHRhcmdldCwgY29sb3IsIHJlY3QueCwgcmVjdC55LCByZWN0LncsIHJlY3QuaClcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region of the {@link IPixelData32} 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: IPixelData32, color: Color32, mask: BinaryMask, alpha = 255, x = 0, y = 0): boolean {\n if (alpha === 0) return false;\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 false;\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 let hasChanged = false;\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 const current = dst32[dstRowOffset + currentX];\n if (current !== finalCol) {\n dst32[dstRowOffset + currentX] = finalCol;\n hasChanged = true;\n }\n }\n }\n }\n return hasChanged;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfUkVDVCA9IG1ha2VDbGlwcGVkUmVjdCgpXG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb2YgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IgdXNpbmcgYSBtYXNrLlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIG1hc2sgLSBUaGUgbWFzayBkZWZpbmluZyB0aGUgYXJlYSB0byBmaWxsLlxuICogQHBhcmFtIGFscGhhIC0gVGhlIG92ZXJhbGwgb3BhY2l0eSBvZiB0aGUgZmlsbCAoMC0yNTUpLlxuICogQHBhcmFtIHggLSBTdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUgZm9yIHRoZSBtYXNrIHBsYWNlbWVudC5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZSBmb3IgdGhlIG1hc2sgcGxhY2VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2soXG4gIGRzdDogSVBpeGVsRGF0YTMyLFxuICBjb2xvcjogQ29sb3IzMixcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgYWxwaGEgPSAyNTUsXG4gIHggPSAwLFxuICB5ID0gMCxcbik6IGJvb2xlYW4ge1xuICBpZiAoYWxwaGEgPT09IDApIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IG1hc2tXID0gbWFzay53XG4gIGNvbnN0IG1hc2tIID0gbWFzay5oXG5cbiAgY29uc3QgY2xpcCA9IHJlc29sdmVSZWN0Q2xpcHBpbmcoXG4gICAgeCxcbiAgICB5LFxuICAgIG1hc2tXLFxuICAgIG1hc2tILFxuICAgIGRzdC53aWR0aCxcbiAgICBkc3QuaGVpZ2h0LFxuICAgIFNDUkFUQ0hfUkVDVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuXG4gIC8vIFByZS1jYWxjdWxhdGUgdGhlIGFscGhhLWFkanVzdGVkIGNvbG9yIG9uY2Ugb3V0c2lkZSB0aGUgbG9vcFxuICBsZXQgZmluYWxDb2wgPSBjb2xvclxuXG4gIGlmIChhbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGJhc2VTcmNBbHBoYSA9IGNvbG9yID4+PiAyNFxuICAgIGNvbnN0IGNvbG9yUkdCID0gY29sb3IgJiAweDAwZmZmZmZmXG4gICAgY29uc3QgYSA9IChiYXNlU3JjQWxwaGEgKiBhbHBoYSArIDEyOCkgPj4gOFxuXG4gICAgZmluYWxDb2wgPSAoKGNvbG9yUkdCIHwgKGEgPDwgMjQpKSA+Pj4gMCkgYXMgQ29sb3IzMlxuICB9XG5cbiAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3QgY3VycmVudFkgPSBmaW5hbFkgKyBpeVxuICAgIGNvbnN0IG1hc2tZID0gY3VycmVudFkgLSB5XG4gICAgY29uc3QgbWFza09mZnNldCA9IG1hc2tZICogbWFza1dcblxuICAgIGNvbnN0IGRzdFJvd09mZnNldCA9IGN1cnJlbnRZICogZHdcblxuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50WCA9IGZpbmFsWCArIGl4XG4gICAgICBjb25zdCBtYXNrWCA9IGN1cnJlbnRYIC0geFxuICAgICAgY29uc3QgbWFza0luZGV4ID0gbWFza09mZnNldCArIG1hc2tYXG5cbiAgICAgIGlmIChtYXNrRGF0YVttYXNrSW5kZXhdKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkc3RSb3dPZmZzZXQgKyBjdXJyZW50WF1cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IGZpbmFsQ29sKSB7XG4gICAgICAgICAgZHN0MzJbZHN0Um93T2Zmc2V0ICsgY3VycmVudFhdID0gZmluYWxDb2xcbiAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc0NoYW5nZWRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 const didChange = writer.accumulator.storeRegionBeforeState(x, y, mask.w, mask.h);\n return didChange(fillPixelDataBinaryMask(writer.config.target, color, mask, alpha, x, y));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7IGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGxCaW5hcnlNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayxcbiAgfSA9IGRlcHNcblxuICByZXR1cm4ge1xuICAgIGZpbGxCaW5hcnlNYXNrKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBtYXNrOiBCaW5hcnlNYXNrLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICB4ID0gMCxcbiAgICAgIHkgPSAwLFxuICAgICkge1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgbWFzay53LCBtYXNrLmgpXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKFxuICAgICAgICBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgY29sb3IsIG1hc2ssIGFscGhhLCB4LCB5KSxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\nexport function invertPixelData(pixelData: IPixelData32, opts: PixelMutateOptions = {}): boolean {\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 false;\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 return true;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhMzIsIHR5cGUgUGl4ZWxNdXRhdGVPcHRpb25zIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRSZWN0LCByZXNvbHZlUmVjdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX1JFQ1QgPSBtYWtlQ2xpcHBlZFJlY3QoKVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0UGl4ZWxEYXRhKFxuICBwaXhlbERhdGE6IElQaXhlbERhdGEzMixcbiAgb3B0czogUGl4ZWxNdXRhdGVPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZHN0ID0gcGl4ZWxEYXRhXG4gIGNvbnN0IHtcbiAgICB4OiB0YXJnZXRYID0gMCxcbiAgICB5OiB0YXJnZXRZID0gMCxcbiAgICB3OiB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aCxcbiAgICBoOiBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0LFxuICAgIG1hc2ssXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgY29uc3QgY2xpcCA9IHJlc29sdmVSZWN0Q2xpcHBpbmcodGFyZ2V0WCwgdGFyZ2V0WSwgd2lkdGgsIGhlaWdodCwgZHN0LndpZHRoLCBkc3QuaGVpZ2h0LCBTQ1JBVENIX1JFQ1QpXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHc6IGFjdHVhbFcsXG4gICAgaDogYWN0dWFsSCxcbiAgfSA9IGNsaXBcblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgY29uc3QgbVBpdGNoID0gbWFzaz8udyA/PyB3aWR0aFxuXG4gIGNvbnN0IGR4ID0geCAtIHRhcmdldFhcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WVxuXG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeFxuICBsZXQgbUlkeCA9IChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KVxuXG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGFjdHVhbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGFjdHVhbFdcblxuICAvLyBPcHRpbWl6YXRpb246IFNwbGl0IGxvb3BzIHRvIGF2b2lkIGNoZWNraW5nIGBpZiAobWFzaylgIGZvciBldmVyeSBwaXhlbC5cbiAgaWYgKG1hc2spIHtcbiAgICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuICAgIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF1cbiAgICAgICAgY29uc3QgaXNIaXQgPSBpbnZlcnRNYXNrXG4gICAgICAgICAgPyBtVmFsID09PSAwXG4gICAgICAgICAgOiBtVmFsID09PSAxXG5cbiAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgLy8gWE9SIHdpdGggMHgwMEZGRkZGRiBmbGlwcyBSR0IgYml0cyBhbmQgaWdub3JlcyBBbHBoYSAodGhlIHRvcCA4IGJpdHMpXG4gICAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkZcbiAgICAgICAgfVxuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICAgIG1JZHggKz0gbVN0cmlkZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkZcbiAgICAgICAgZElkeCsrXG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 target = writer.config.target;\n const {\n x = 0,\n y = 0,\n w = target.width,\n h = target.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(invertPixelData(target, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgUGl4ZWxNdXRhdGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgaW52ZXJ0UGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ludmVydFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBpbnZlcnRQaXhlbERhdGEgfVxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9ySW52ZXJ0ID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgaW52ZXJ0UGl4ZWxEYXRhID0gZGVmYXVsdHMuaW52ZXJ0UGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgaW52ZXJ0KG9wdHM6IFBpeGVsTXV0YXRlT3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3cml0ZXIuY29uZmlnLnRhcmdldFxuICAgICAgY29uc3Qge1xuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHcgPSB0YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB0YXJnZXQuaGVpZ2h0LFxuICAgICAgfSA9IG9wdHNcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgIGludmVydFBpeGVsRGF0YSh0YXJnZXQsIG9wdHMpLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { mutatorBlendColor } from './PixelMutator/mutatorBlendColor';\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel';\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData';\nimport { mutatorBlendPixelDataAlphaMask } from './PixelMutator/mutatorBlendPixelDataAlphaMask';\nimport { mutatorBlendPixelDataBinaryMask } from './PixelMutator/mutatorBlendPixelDataBinaryMask';\nimport { mutatorClear } from './PixelMutator/mutatorClear';\nimport { mutatorFill, mutatorFillRect } from './PixelMutator/mutatorFill';\nimport { mutatorFillBinaryMask } from './PixelMutator/mutatorFillBinaryMask';\nimport { mutatorInvert } from './PixelMutator/mutatorInvert';\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n // @sort\n ...mutatorBlendColor(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorBlendPixelDataAlphaMask(writer),\n ...mutatorBlendPixelDataBinaryMask(writer),\n ...mutatorClear(writer),\n ...mutatorFill(writer),\n ...mutatorFillBinaryMask(writer),\n ...mutatorFillRect(writer),\n ...mutatorInvert(writer)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbXV0YXRvckJsZW5kQ29sb3IgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRDb2xvcidcbmltcG9ydCB7IG11dGF0b3JCbGVuZFBpeGVsIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWwnXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGEnXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGFBbHBoYU1hc2snXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzaydcbmltcG9ydCB7IG11dGF0b3JDbGVhciB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JDbGVhcidcbmltcG9ydCB7IG11dGF0b3JGaWxsLCBtdXRhdG9yRmlsbFJlY3QgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbCdcbmltcG9ydCB7IG11dGF0b3JGaWxsQmluYXJ5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JGaWxsQmluYXJ5TWFzaydcbmltcG9ydCB7IG11dGF0b3JJbnZlcnQgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9ySW52ZXJ0J1xuaW1wb3J0IHR5cGUgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4vUGl4ZWxXcml0ZXInXG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRnVsbFBpeGVsTXV0YXRvcih3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4pIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBAc29ydFxuICAgIC4uLm11dGF0b3JCbGVuZENvbG9yKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kUGl4ZWwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGEod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGFBbHBoYU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckNsZWFyKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckZpbGwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yRmlsbEJpbmFyeU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yRmlsbFJlY3Qod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9ySW52ZXJ0KHdyaXRlciksXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\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 function trimRectBounds(x: number, y: number, w: number, h: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const left = Math.max(0, x);\n const top = Math.max(0, y);\n const right = Math.min(targetWidth, x + w);\n const bottom = Math.min(targetHeight, y + h);\n res.x = left;\n res.y = top;\n res.w = Math.max(0, right - left);\n res.h = Math.max(0, bottom - top);\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdHJpbVJlY3RCb3VuZHMoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbiAgdGFyZ2V0V2lkdGg6IG51bWJlcixcbiAgdGFyZ2V0SGVpZ2h0OiBudW1iZXIsXG4gIG91dD86IFJlY3QsXG4pOiBSZWN0IHtcbiAgY29uc3QgcmVzID0gb3V0ID8/IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGgubWF4KDAsIHgpXG4gIGNvbnN0IHRvcCA9IE1hdGgubWF4KDAsIHkpXG4gIGNvbnN0IHJpZ2h0ID0gTWF0aC5taW4odGFyZ2V0V2lkdGgsIHggKyB3KVxuICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih0YXJnZXRIZWlnaHQsIHkgKyBoKVxuXG4gIHJlcy54ID0gbGVmdFxuICByZXMueSA9IHRvcFxuICByZXMudyA9IE1hdGgubWF4KDAsIHJpZ2h0IC0gbGVmdClcbiAgcmVzLmggPSBNYXRoLm1heCgwLCBib3R0b20gLSB0b3ApXG5cbiAgcmV0dXJuIHJlc1xufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { forEachLinePoint } from '../Algorithm/forEachLinePoint';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nexport class PaintBuffer {\n readonly lookup: (PixelTile | undefined)[];\n private readonly scratchBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n constructor(readonly config: PixelEngineConfig, readonly tilePool: PixelTilePool) {\n this.lookup = [];\n }\n private eachTileInBounds(bounds: Rect, callback: (tile: PixelTile, bX: number, bY: number, bW: number, bH: number) => void): void {\n const {\n tileShift,\n targetColumns,\n targetRows,\n tileSize\n } = this.config;\n const x1 = Math.max(0, bounds.x >> tileShift);\n const y1 = Math.max(0, bounds.y >> tileShift);\n const x2 = Math.min(targetColumns - 1, bounds.x + bounds.w - 1 >> tileShift);\n const y2 = Math.min(targetRows - 1, bounds.y + bounds.h - 1 >> tileShift);\n if (x1 > x2 || y1 > y2) return;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n for (let ty = y1; ty <= y2; ty++) {\n const rowOffset = ty * targetColumns;\n const tileTop = ty << tileShift;\n for (let tx = x1; tx <= x2; tx++) {\n const id = rowOffset + tx;\n const tile = lookup[id] ?? (lookup[id] = tilePool.getTile(id, tx, ty));\n const tileLeft = tx << tileShift;\n const startX = bounds.x > tileLeft ? bounds.x : tileLeft;\n const startY = bounds.y > tileTop ? bounds.y : tileTop;\n const maskEndX = bounds.x + bounds.w;\n const tileEndX = tileLeft + tileSize;\n const endX = maskEndX < tileEndX ? maskEndX : tileEndX;\n const maskEndY = bounds.y + bounds.h;\n const tileEndY = tileTop + tileSize;\n const endY = maskEndY < tileEndY ? maskEndY : tileEndY;\n callback(tile, startX, startY, endX - startX, endY - startY);\n }\n }\n }\n writePaintAlphaMaskStroke(color: Color32, brush: PaintAlphaMask, x0: number, y0: number, x1: number, y1: number): boolean {\n const cA = color >>> 24;\n if (cA === 0) return false;\n const {\n tileShift,\n tileMask,\n target\n } = this.config;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n const cRGB = color & 0x00ffffff;\n const scratch = this.scratchBounds;\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, bW, bH, target.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n const brushA = bD[bOff + (canvasX - topLeftX)];\n if (brushA === 0) continue;\n const t = cA * brushA + 128;\n const blendedA = t + (t >> 8) >> 8;\n const idx = dS + j;\n const cur = d32[idx];\n if (brushA > cur >>> 24) {\n const next = (cRGB | blendedA << 24) >>> 0;\n if (cur !== next) {\n d32[idx] = next as Color32;\n tileChanged = true;\n }\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n writePaintBinaryMaskStroke(color: Color32, brush: PaintBinaryMask, x0: number, y0: number, x1: number, y1: number): boolean {\n const alphaIsZero = color >>> 24 === 0;\n if (alphaIsZero) return false;\n const {\n tileShift,\n tileMask,\n target\n } = this.config;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n const scratch = this.scratchBounds;\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, bW, bH, target.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n if (bD[bOff + (canvasX - topLeftX)]) {\n const idx = dS + j;\n if (d32[idx] !== color) {\n d32[idx] = color;\n tileChanged = true;\n }\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n writeRectStroke(color: Color32, brushWidth: number, brushHeight: number, x0: number, y0: number, x1: number, y1: number): boolean {\n const alphaIsZero = color >>> 24 === 0;\n if (alphaIsZero) return false;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const scratch = this.scratchBounds;\n const centerOffsetX = ((brushWidth - 1) >> 1);\n const centerOffsetY = ((brushHeight - 1) >> 1);\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, brushWidth, brushHeight, target.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const idx = dS + j;\n if (d32[idx] !== color) {\n d32[idx] = color;\n tileChanged = true;\n }\n }\n }\n if (tileChanged) {\n changed = true;\n }\n });\n });\n return changed;\n }\n clear(): void {\n this.tilePool.releaseTiles(this.lookup);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBQYWludEFscGhhTWFzaywgUGFpbnRCaW5hcnlNYXNrLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZm9yRWFjaExpbmVQb2ludCB9IGZyb20gJy4uL0FsZ29yaXRobS9mb3JFYWNoTGluZVBvaW50J1xuaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4uL0hpc3RvcnkvUGl4ZWxFbmdpbmVDb25maWcnXG5pbXBvcnQgeyBtYWNyb19oYWxmQW5kRmxvb3IgfSBmcm9tICcuLi9JbnRlcm5hbC9oZWxwZXJzJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbFRpbGUgfSBmcm9tICcuLi9QaXhlbFRpbGUvUGl4ZWxUaWxlJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbFRpbGVQb29sIH0gZnJvbSAnLi4vUGl4ZWxUaWxlL1BpeGVsVGlsZVBvb2wnXG5pbXBvcnQgeyB0cmltUmVjdEJvdW5kcyB9IGZyb20gJy4uL1JlY3QvdHJpbVJlY3RCb3VuZHMnXG5cbmV4cG9ydCBjbGFzcyBQYWludEJ1ZmZlciB7XG4gIHJlYWRvbmx5IGxvb2t1cDogKFBpeGVsVGlsZSB8IHVuZGVmaW5lZClbXVxuICBwcml2YXRlIHJlYWRvbmx5IHNjcmF0Y2hCb3VuZHM6IFJlY3QgPSB7IHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsXG4gICAgcmVhZG9ubHkgdGlsZVBvb2w6IFBpeGVsVGlsZVBvb2wsXG4gICkge1xuICAgIHRoaXMubG9va3VwID0gW11cbiAgfVxuXG4gIHByaXZhdGUgZWFjaFRpbGVJbkJvdW5kcyhcbiAgICBib3VuZHM6IFJlY3QsXG4gICAgY2FsbGJhY2s6ICh0aWxlOiBQaXhlbFRpbGUsIGJYOiBudW1iZXIsIGJZOiBudW1iZXIsIGJXOiBudW1iZXIsIGJIOiBudW1iZXIpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgdGlsZVNoaWZ0LCB0YXJnZXRDb2x1bW5zLCB0YXJnZXRSb3dzLCB0aWxlU2l6ZSB9ID0gdGhpcy5jb25maWdcblxuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoMCwgYm91bmRzLnggPj4gdGlsZVNoaWZ0KVxuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoMCwgYm91bmRzLnkgPj4gdGlsZVNoaWZ0KVxuICAgIGNvbnN0IHgyID0gTWF0aC5taW4odGFyZ2V0Q29sdW1ucyAtIDEsIChib3VuZHMueCArIGJvdW5kcy53IC0gMSkgPj4gdGlsZVNoaWZ0KVxuICAgIGNvbnN0IHkyID0gTWF0aC5taW4odGFyZ2V0Um93cyAtIDEsIChib3VuZHMueSArIGJvdW5kcy5oIC0gMSkgPj4gdGlsZVNoaWZ0KVxuXG4gICAgaWYgKHgxID4geDIgfHwgeTEgPiB5MikgcmV0dXJuXG5cbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cFxuICAgIGNvbnN0IHRpbGVQb29sID0gdGhpcy50aWxlUG9vbFxuXG4gICAgZm9yIChsZXQgdHkgPSB5MTsgdHkgPD0geTI7IHR5KyspIHtcbiAgICAgIGNvbnN0IHJvd09mZnNldCA9IHR5ICogdGFyZ2V0Q29sdW1uc1xuICAgICAgY29uc3QgdGlsZVRvcCA9IHR5IDw8IHRpbGVTaGlmdFxuXG4gICAgICBmb3IgKGxldCB0eCA9IHgxOyB0eCA8PSB4MjsgdHgrKykge1xuICAgICAgICBjb25zdCBpZCA9IHJvd09mZnNldCArIHR4XG4gICAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaWRdID8/IChsb29rdXBbaWRdID0gdGlsZVBvb2wuZ2V0VGlsZShpZCwgdHgsIHR5KSlcbiAgICAgICAgY29uc3QgdGlsZUxlZnQgPSB0eCA8PCB0aWxlU2hpZnRcblxuICAgICAgICBjb25zdCBzdGFydFggPSBib3VuZHMueCA+IHRpbGVMZWZ0ID8gYm91bmRzLnggOiB0aWxlTGVmdFxuICAgICAgICBjb25zdCBzdGFydFkgPSBib3VuZHMueSA+IHRpbGVUb3AgPyBib3VuZHMueSA6IHRpbGVUb3BcblxuICAgICAgICBjb25zdCBtYXNrRW5kWCA9IGJvdW5kcy54ICsgYm91bmRzLndcbiAgICAgICAgY29uc3QgdGlsZUVuZFggPSB0aWxlTGVmdCArIHRpbGVTaXplXG4gICAgICAgIGNvbnN0IGVuZFggPSBtYXNrRW5kWCA8IHRpbGVFbmRYID8gbWFza0VuZFggOiB0aWxlRW5kWFxuXG4gICAgICAgIGNvbnN0IG1hc2tFbmRZID0gYm91bmRzLnkgKyBib3VuZHMuaFxuICAgICAgICBjb25zdCB0aWxlRW5kWSA9IHRpbGVUb3AgKyB0aWxlU2l6ZVxuICAgICAgICBjb25zdCBlbmRZID0gbWFza0VuZFkgPCB0aWxlRW5kWSA/IG1hc2tFbmRZIDogdGlsZUVuZFlcblxuICAgICAgICBjYWxsYmFjayh0aWxlLCBzdGFydFgsIHN0YXJ0WSwgZW5kWCAtIHN0YXJ0WCwgZW5kWSAtIHN0YXJ0WSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3cml0ZVBhaW50QWxwaGFNYXNrU3Ryb2tlKFxuICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgIGJydXNoOiBQYWludEFscGhhTWFzayxcbiAgICB4MDogbnVtYmVyLFxuICAgIHkwOiBudW1iZXIsXG4gICAgeDE6IG51bWJlcixcbiAgICB5MTogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBjQSA9IGNvbG9yID4+PiAyNFxuICAgIGlmIChjQSA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCB7IHRpbGVTaGlmdCwgdGlsZU1hc2ssIHRhcmdldCB9ID0gdGhpcy5jb25maWdcbiAgICBjb25zdCB7IHc6IGJXLCBoOiBiSCwgZGF0YTogYkQsIGNlbnRlck9mZnNldFgsIGNlbnRlck9mZnNldFkgfSA9IGJydXNoXG4gICAgY29uc3QgY1JHQiA9IGNvbG9yICYgMHgwMGZmZmZmZlxuICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLnNjcmF0Y2hCb3VuZHNcblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcblxuICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcblxuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WClcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpXG4gICAgICB0cmltUmVjdEJvdW5kcyhcbiAgICAgICAgdG9wTGVmdFgsXG4gICAgICAgIHRvcExlZnRZLFxuICAgICAgICBiVyxcbiAgICAgICAgYkgsXG4gICAgICAgIHRhcmdldC53aWR0aCxcbiAgICAgICAgdGFyZ2V0LmhlaWdodCxcbiAgICAgICAgc2NyYXRjaCxcbiAgICAgIClcblxuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm5cblxuICAgICAgdGhpcy5lYWNoVGlsZUluQm91bmRzKHNjcmF0Y2gsICh0aWxlLCBiWCwgYlksIGJXX3QsIGJIX3QpID0+IHtcbiAgICAgICAgY29uc3QgZDMyID0gdGlsZS5kYXRhMzJcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2VcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJIX3Q7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNhbnZhc1kgPSBiWSArIGlcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiV1xuICAgICAgICAgIGNvbnN0IHRPZmYgPSAoY2FudmFzWSAmIHRpbGVNYXNrKSA8PCB0aWxlU2hpZnRcbiAgICAgICAgICBjb25zdCBkUyA9IHRPZmYgKyAoYlggJiB0aWxlTWFzaylcblxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYldfdDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNYID0gYlggKyBqXG4gICAgICAgICAgICBjb25zdCBicnVzaEEgPSBiRFtiT2ZmICsgKGNhbnZhc1ggLSB0b3BMZWZ0WCldXG4gICAgICAgICAgICBpZiAoYnJ1c2hBID09PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjb25zdCB0ID0gY0EgKiBicnVzaEEgKyAxMjhcbiAgICAgICAgICAgIGNvbnN0IGJsZW5kZWRBID0gKHQgKyAodCA+PiA4KSkgPj4gOFxuXG4gICAgICAgICAgICBjb25zdCBpZHggPSBkUyArIGpcbiAgICAgICAgICAgIGNvbnN0IGN1ciA9IGQzMltpZHhdXG4gICAgICAgICAgICBpZiAoYnJ1c2hBID4gKGN1ciA+Pj4gMjQpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHQgPSAoY1JHQiB8IChibGVuZGVkQSA8PCAyNCkpID4+PiAwXG4gICAgICAgICAgICAgIGlmIChjdXIgIT09IG5leHQpIHtcbiAgICAgICAgICAgICAgICBkMzJbaWR4XSA9IG5leHQgYXMgQ29sb3IzMlxuICAgICAgICAgICAgICAgIHRpbGVDaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkgY2hhbmdlZCA9IHRydWVcbiAgICAgIH0pXG4gICAgfSlcbiAgICByZXR1cm4gY2hhbmdlZFxuICB9XG5cbiAgd3JpdGVQYWludEJpbmFyeU1hc2tTdHJva2UoXG4gICAgY29sb3I6IENvbG9yMzIsXG4gICAgYnJ1c2g6IFBhaW50QmluYXJ5TWFzayxcbiAgICB4MDogbnVtYmVyLFxuICAgIHkwOiBudW1iZXIsXG4gICAgeDE6IG51bWJlcixcbiAgICB5MTogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBhbHBoYUlzWmVybyA9IChjb2xvciA+Pj4gMjQpID09PSAwXG4gICAgaWYgKGFscGhhSXNaZXJvKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHsgdGlsZVNoaWZ0LCB0aWxlTWFzaywgdGFyZ2V0IH0gPSB0aGlzLmNvbmZpZ1xuICAgIGNvbnN0IHsgdzogYlcsIGg6IGJILCBkYXRhOiBiRCwgY2VudGVyT2Zmc2V0WCwgY2VudGVyT2Zmc2V0WSB9ID0gYnJ1c2hcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WClcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpXG5cbiAgICAgIHRyaW1SZWN0Qm91bmRzKFxuICAgICAgICB0b3BMZWZ0WCxcbiAgICAgICAgdG9wTGVmdFksXG4gICAgICAgIGJXLFxuICAgICAgICBiSCxcbiAgICAgICAgdGFyZ2V0LndpZHRoLFxuICAgICAgICB0YXJnZXQuaGVpZ2h0LFxuICAgICAgICBzY3JhdGNoLFxuICAgICAgKVxuXG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVyblxuXG4gICAgICB0aGlzLmVhY2hUaWxlSW5Cb3VuZHMoc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkMzIgPSB0aWxlLmRhdGEzMlxuICAgICAgICBsZXQgdGlsZUNoYW5nZWQgPSBmYWxzZVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaVxuICAgICAgICAgIGNvbnN0IGJPZmYgPSAoY2FudmFzWSAtIHRvcExlZnRZKSAqIGJXXG4gICAgICAgICAgY29uc3QgdE9mZiA9IChjYW52YXNZICYgdGlsZU1hc2spIDw8IHRpbGVTaGlmdFxuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKVxuXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBiV190OyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhc1ggPSBiWCArIGpcbiAgICAgICAgICAgIGlmIChiRFtiT2ZmICsgKGNhbnZhc1ggLSB0b3BMZWZ0WCldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgalxuICAgICAgICAgICAgICBpZiAoZDMyW2lkeF0gIT09IGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgZDMyW2lkeF0gPSBjb2xvclxuICAgICAgICAgICAgICAgIHRpbGVDaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkgY2hhbmdlZCA9IHRydWVcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiBjaGFuZ2VkXG4gIH1cblxuICB3cml0ZVJlY3RTdHJva2UoXG4gICAgY29sb3I6IENvbG9yMzIsXG4gICAgYnJ1c2hXaWR0aDogbnVtYmVyLFxuICAgIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gICAgeDA6IG51bWJlcixcbiAgICB5MDogbnVtYmVyLFxuICAgIHgxOiBudW1iZXIsXG4gICAgeTE6IG51bWJlcixcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWxwaGFJc1plcm8gPSAoY29sb3IgPj4+IDI0KSA9PT0gMFxuICAgIGlmIChhbHBoYUlzWmVybykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnRcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFza1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXRcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzXG5cbiAgICBjb25zdCBjZW50ZXJPZmZzZXRYID0gbWFjcm9faGFsZkFuZEZsb29yKGJydXNoV2lkdGggLSAxKVxuICAgIGNvbnN0IGNlbnRlck9mZnNldFkgPSBtYWNyb19oYWxmQW5kRmxvb3IoYnJ1c2hIZWlnaHQgLSAxKVxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgZm9yRWFjaExpbmVQb2ludChcbiAgICAgIHgwLFxuICAgICAgeTAsXG4gICAgICB4MSxcbiAgICAgIHkxLFxuICAgICAgKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCB0b3BMZWZ0WCA9IE1hdGguZmxvb3IocHggKyBjZW50ZXJPZmZzZXRYKVxuICAgICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKVxuXG4gICAgICAgIHRyaW1SZWN0Qm91bmRzKFxuICAgICAgICAgIHRvcExlZnRYLFxuICAgICAgICAgIHRvcExlZnRZLFxuICAgICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0LndpZHRoLFxuICAgICAgICAgIHRhcmdldC5oZWlnaHQsXG4gICAgICAgICAgc2NyYXRjaCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChzY3JhdGNoLncgPD0gMCB8fCBzY3JhdGNoLmggPD0gMCkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5lYWNoVGlsZUluQm91bmRzKFxuICAgICAgICAgIHNjcmF0Y2gsXG4gICAgICAgICAgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZDMyID0gdGlsZS5kYXRhMzJcbiAgICAgICAgICAgIGxldCB0aWxlQ2hhbmdlZCA9IGZhbHNlXG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbnZhc1kgPSBiWSArIGlcbiAgICAgICAgICAgICAgY29uc3QgdE9mZiA9IChjYW52YXNZICYgdGlsZU1hc2spIDw8IHRpbGVTaGlmdFxuICAgICAgICAgICAgICBjb25zdCBkUyA9IHRPZmYgKyAoYlggJiB0aWxlTWFzaylcblxuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgalxuXG4gICAgICAgICAgICAgICAgaWYgKGQzMltpZHhdICE9PSBjb2xvcikge1xuICAgICAgICAgICAgICAgICAgZDMyW2lkeF0gPSBjb2xvclxuICAgICAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aWxlQ2hhbmdlZCkge1xuICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgcmV0dXJuIGNoYW5nZWRcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudGlsZVBvb2wucmVsZWFzZVRpbGVzKHRoaXMubG9va3VwKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { IPixelData } from '../_types';\nexport class PixelTile implements IPixelData {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n readonly imageData: ImageData;\n constructor(public id: number, public tx: number, public ty: number, tileSize: number, tileArea: number) {\n this.width = this.height = tileSize;\n this.data32 = new Uint32Array(tileArea);\n const data8 = new Uint8ClampedArray(this.data32.buffer) as Uint8ClampedArray<ArrayBuffer>;\n this.imageData = new ImageData(data8, tileSize, tileSize);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxUaWxlIGltcGxlbWVudHMgSVBpeGVsRGF0YSB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXlcbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlclxuICByZWFkb25seSBoZWlnaHQ6IG51bWJlclxuICByZWFkb25seSBpbWFnZURhdGE6IEltYWdlRGF0YVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpZDogbnVtYmVyLFxuICAgIHB1YmxpYyB0eDogbnVtYmVyLFxuICAgIHB1YmxpYyB0eTogbnVtYmVyLFxuICAgIHRpbGVTaXplOiBudW1iZXIsXG4gICAgdGlsZUFyZWE6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gdGlsZVNpemVcbiAgICB0aGlzLmRhdGEzMiA9IG5ldyBVaW50MzJBcnJheSh0aWxlQXJlYSlcbiAgICBjb25zdCBkYXRhOCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLmRhdGEzMi5idWZmZXIpIGFzIFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyPlxuICAgIHRoaXMuaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShkYXRhOCwgdGlsZVNpemUsIHRpbGVTaXplKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { PixelTile } from './PixelTile';\nexport class PixelTilePool {\n public pool: PixelTile[];\n private tileSize: number;\n private tileArea: number;\n constructor(config: PixelEngineConfig) {\n this.pool = [];\n this.tileSize = config.tileSize;\n this.tileArea = config.tileArea;\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\n // Wipe dirty memory from previous uses before handing it out\n tile.data32.fill(0);\n return tile;\n }\n return new PixelTile(id, tx, ty, this.tileSize, this.tileArea);\n }\n releaseTile(tile: PixelTile): void {\n this.pool.push(tile);\n }\n releaseTiles(tiles: (PixelTile | undefined)[]): void {\n let length = tiles.length;\n for (let i = 0; i < length; i++) {\n let tile = tiles[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n tiles.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4uL0hpc3RvcnkvUGl4ZWxFbmdpbmVDb25maWcnXG5cbmltcG9ydCB7IFBpeGVsVGlsZSB9IGZyb20gJy4vUGl4ZWxUaWxlJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxUaWxlUG9vbCB7XG4gIHB1YmxpYyBwb29sOiBQaXhlbFRpbGVbXVxuXG4gIHByaXZhdGUgdGlsZVNpemU6IG51bWJlclxuICBwcml2YXRlIHRpbGVBcmVhOiBudW1iZXJcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc6IFBpeGVsRW5naW5lQ29uZmlnLFxuICApIHtcbiAgICB0aGlzLnBvb2wgPSBbXVxuICAgIHRoaXMudGlsZVNpemUgPSBjb25maWcudGlsZVNpemVcbiAgICB0aGlzLnRpbGVBcmVhID0gY29uZmlnLnRpbGVBcmVhXG4gIH1cblxuICBnZXRUaWxlKFxuICAgIGlkOiBudW1iZXIsXG4gICAgdHg6IG51bWJlcixcbiAgICB0eTogbnVtYmVyLFxuICApOiBQaXhlbFRpbGUge1xuICAgIGxldCB0aWxlID0gdGhpcy5wb29sLnBvcCgpXG5cbiAgICBpZiAodGlsZSkge1xuICAgICAgdGlsZS5pZCA9IGlkXG4gICAgICB0aWxlLnR4ID0gdHhcbiAgICAgIHRpbGUudHkgPSB0eVxuXG4gICAgICAvLyBXaXBlIGRpcnR5IG1lbW9yeSBmcm9tIHByZXZpb3VzIHVzZXMgYmVmb3JlIGhhbmRpbmcgaXQgb3V0XG4gICAgICB0aWxlLmRhdGEzMi5maWxsKDApXG5cbiAgICAgIHJldHVybiB0aWxlXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQaXhlbFRpbGUoXG4gICAgICBpZCxcbiAgICAgIHR4LFxuICAgICAgdHksXG4gICAgICB0aGlzLnRpbGVTaXplLFxuICAgICAgdGhpcy50aWxlQXJlYSxcbiAgICApXG4gIH1cblxuICByZWxlYXNlVGlsZSh0aWxlOiBQaXhlbFRpbGUpOiB2b2lkIHtcbiAgICB0aGlzLnBvb2wucHVzaCh0aWxlKVxuICB9XG5cbiAgcmVsZWFzZVRpbGVzKHRpbGVzOiAoUGl4ZWxUaWxlIHwgdW5kZWZpbmVkKVtdKTogdm9pZCB7XG4gICAgbGV0IGxlbmd0aCA9IHRpbGVzLmxlbmd0aFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRpbGUgPSB0aWxlc1tpXVxuXG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh0aWxlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRpbGVzLmxlbmd0aCA9IDBcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { resizeImageData } from '../ImageData/resizeImageData';\nimport { PaintBuffer } from '../Paint/PaintBuffer';\nimport { blendPixelData } from '../PixelData/blendPixelData';\nimport { PixelTilePool } from '../PixelTile/PixelTilePool';\nimport { makeHistoryAction } from './HistoryAction';\nimport { HistoryManager } from './HistoryManager';\nimport { PixelAccumulator } from './PixelAccumulator';\nimport { PixelEngineConfig } from './PixelEngineConfig';\nexport interface PixelWriterOptions {\n maxHistorySteps?: number;\n tileSize?: number;\n historyManager?: HistoryManager;\n historyActionFactory?: HistoryActionFactory;\n pixelTilePool?: PixelTilePool;\n accumulator?: PixelAccumulator;\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 readonly historyManager: HistoryManager;\n readonly accumulator: PixelAccumulator;\n readonly historyActionFactory: HistoryActionFactory;\n readonly config: PixelEngineConfig;\n readonly pixelTilePool: PixelTilePool;\n readonly paintBuffer: PaintBuffer;\n readonly mutator: M;\n private blendPixelDataOpts = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n private _inProgress = false;\n constructor(target: PixelData, mutatorFactory: (writer: PixelWriter<any>) => M, {\n tileSize = 256,\n maxHistorySteps = 50,\n historyManager = new HistoryManager(maxHistorySteps),\n historyActionFactory = makeHistoryAction,\n pixelTilePool,\n accumulator\n }: PixelWriterOptions = {}) {\n this.config = new PixelEngineConfig(tileSize, target);\n this.historyManager = historyManager;\n this.pixelTilePool = pixelTilePool ?? new PixelTilePool(this.config);\n this.accumulator = accumulator ?? new PixelAccumulator(this.config, this.pixelTilePool);\n this.historyActionFactory = historyActionFactory;\n this.mutator = mutatorFactory(this);\n this.paintBuffer = new PaintBuffer(this.config, this.pixelTilePool);\n }\n\n /**\n * Executes `transaction` and commits the resulting pixel changes as a single\n * undoable history action.\n *\n * - If `transaction` throws, all accumulated changes are rolled back and the error\n * is re-thrown. No action is committed.\n * - If `transaction` completes without modifying any pixels, no action is committed.\n * - `withHistory` is not re-entrant. Calling it again from inside `transaction` will\n * throw immediately to prevent silent data loss from a nested extractPatch.\n *\n * @param transaction Callback to be executed inside the transaction.\n * @param after Called after both undo and redo — use for generic change notifications.\n * @param afterUndo Called after undo only — use for dimension or state changes specific to undo.\n * @param afterRedo Called after redo only.\n */\n withHistory(transaction: (mutator: M) => void, after?: () => void, afterUndo?: () => void, afterRedo?: () => void): void {\n if (this._inProgress) {\n throw new Error('withHistory is not re-entrant — commit or rollback the current operation first');\n }\n this._inProgress = true;\n try {\n transaction(this.mutator);\n } catch (e) {\n this.accumulator.rollbackAfterError();\n throw e;\n } finally {\n this._inProgress = false;\n }\n if (this.accumulator.beforeTiles.length === 0) return;\n const patch = this.accumulator.extractPatch();\n const action = this.historyActionFactory(this, patch, after, afterUndo, afterRedo);\n this.historyManager.commit(action);\n }\n resize(newWidth: number, newHeight: number, offsetX = 0, offsetY = 0, after?: (target: ImageData) => void, afterUndo?: (target: ImageData) => void, afterRedo?: (target: ImageData) => void, resizeImageDataFn = resizeImageData): void {\n if (this._inProgress) {\n throw new Error('Cannot resize inside a withHistory callback');\n }\n if (this.accumulator.beforeTiles.length > 0) {\n throw new Error('Cannot resize with an open accumulator — commit or rollback first');\n }\n const config = this.config;\n const target = config.target;\n const beforeImageData = target.imageData;\n const afterImageData = resizeImageDataFn(beforeImageData, newWidth, newHeight, offsetX, offsetY);\n target.set(afterImageData);\n this.historyManager.commit({\n undo: () => {\n target.set(beforeImageData);\n afterUndo?.(beforeImageData);\n after?.(beforeImageData);\n },\n redo: () => {\n target.set(afterImageData);\n afterRedo?.(afterImageData);\n after?.(afterImageData);\n }\n });\n }\n commitPaintBuffer(alpha = 255, blendFn = sourceOverPerfect, blendPixelDataFn = blendPixelData) {\n const paintBuffer = this.paintBuffer;\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n const opts = this.blendPixelDataOpts;\n opts.alpha = alpha;\n opts.blendFn = blendFn;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const didChange = this.accumulator.storeTileBeforeState(tile.id, tile.tx, tile.ty);\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n opts.x = dx;\n opts.y = dy;\n opts.w = tile.width;\n opts.h = tile.height;\n didChange(blendPixelDataFn(this.config.target, tile, opts));\n }\n }\n paintBuffer.clear();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5pbXBvcnQgeyByZXNpemVJbWFnZURhdGEgfSBmcm9tICcuLi9JbWFnZURhdGEvcmVzaXplSW1hZ2VEYXRhJ1xuaW1wb3J0IHsgUGFpbnRCdWZmZXIgfSBmcm9tICcuLi9QYWludC9QYWludEJ1ZmZlcidcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhIH0gZnJvbSAnLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbERhdGEgfSBmcm9tICcuLi9QaXhlbERhdGEvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxUaWxlUG9vbCB9IGZyb20gJy4uL1BpeGVsVGlsZS9QaXhlbFRpbGVQb29sJ1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5QWN0aW9uRmFjdG9yeSwgbWFrZUhpc3RvcnlBY3Rpb24gfSBmcm9tICcuL0hpc3RvcnlBY3Rpb24nXG5pbXBvcnQgeyBIaXN0b3J5TWFuYWdlciB9IGZyb20gJy4vSGlzdG9yeU1hbmFnZXInXG5pbXBvcnQgeyBQaXhlbEFjY3VtdWxhdG9yIH0gZnJvbSAnLi9QaXhlbEFjY3VtdWxhdG9yJ1xuaW1wb3J0IHsgUGl4ZWxFbmdpbmVDb25maWcgfSBmcm9tICcuL1BpeGVsRW5naW5lQ29uZmlnJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsV3JpdGVyT3B0aW9ucyB7XG4gIG1heEhpc3RvcnlTdGVwcz86IG51bWJlclxuICB0aWxlU2l6ZT86IG51bWJlclxuICBoaXN0b3J5TWFuYWdlcj86IEhpc3RvcnlNYW5hZ2VyXG4gIGhpc3RvcnlBY3Rpb25GYWN0b3J5PzogSGlzdG9yeUFjdGlvbkZhY3RvcnlcbiAgcGl4ZWxUaWxlUG9vbD86IFBpeGVsVGlsZVBvb2wsXG4gIGFjY3VtdWxhdG9yPzogUGl4ZWxBY2N1bXVsYXRvclxufVxuXG4vKipcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0YXJnID0gbmV3IFBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKDEwLCAxMCkpXG4gKiBjb25zdCB3cml0ZXIgPSBuZXcgUGl4ZWxXcml0ZXIodGFyZywgKHdyaXRlcikgPT4ge1xuICogICByZXR1cm4ge1xuICogICAgIC4uLm11dGF0b3JBcHBseU1hc2sod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGEod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yQmxlbmRDb2xvcih3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsKHdyaXRlciksXG4gKiAgICAgLi4ubXV0YXRvckZpbGwod3JpdGVyKSxcbiAqICAgfVxuICogfSlcbiAqXG4gKiAvLyB0byBpbXBvcnQgYWxsIG11dGF0b3IgZnVuY3Rpb25zXG4gKiBjb25zdCB3cml0ZXIgPSBuZXcgUGl4ZWxXcml0ZXIodGFyZywgbWFrZUZ1bGxQaXhlbE11dGF0b3IpXG4gKlxuICogd3JpdGVyLndpdGhIaXN0b3J5KChtdXRhdG9yKSA9PiB7XG4gKiAgIG11dGF0b3IuYXBwbHlNYXNrKClcbiAqICAgbXV0YXRvci5ibGVuZFBpeGVsRGF0YSgpXG4gKiB9KVxuICovXG5leHBvcnQgY2xhc3MgUGl4ZWxXcml0ZXI8TT4ge1xuICByZWFkb25seSBoaXN0b3J5TWFuYWdlcjogSGlzdG9yeU1hbmFnZXJcbiAgcmVhZG9ubHkgYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3JcbiAgcmVhZG9ubHkgaGlzdG9yeUFjdGlvbkZhY3Rvcnk6IEhpc3RvcnlBY3Rpb25GYWN0b3J5XG4gIHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWdcbiAgcmVhZG9ubHkgcGl4ZWxUaWxlUG9vbDogUGl4ZWxUaWxlUG9vbFxuICByZWFkb25seSBwYWludEJ1ZmZlcjogUGFpbnRCdWZmZXJcbiAgcmVhZG9ubHkgbXV0YXRvcjogTVxuXG4gIHByaXZhdGUgYmxlbmRQaXhlbERhdGFPcHRzID0ge1xuICAgIGFscGhhOiAyNTUsXG4gICAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3QsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIHByaXZhdGUgX2luUHJvZ3Jlc3MgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKHRhcmdldDogUGl4ZWxEYXRhLCBtdXRhdG9yRmFjdG9yeTogKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PikgPT4gTSwge1xuICAgIHRpbGVTaXplID0gMjU2LFxuICAgIG1heEhpc3RvcnlTdGVwcyA9IDUwLFxuICAgIGhpc3RvcnlNYW5hZ2VyID0gbmV3IEhpc3RvcnlNYW5hZ2VyKG1heEhpc3RvcnlTdGVwcyksXG4gICAgaGlzdG9yeUFjdGlvbkZhY3RvcnkgPSBtYWtlSGlzdG9yeUFjdGlvbixcbiAgICBwaXhlbFRpbGVQb29sLFxuICAgIGFjY3VtdWxhdG9yLFxuICB9OiBQaXhlbFdyaXRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0gbmV3IFBpeGVsRW5naW5lQ29uZmlnKHRpbGVTaXplLCB0YXJnZXQpXG4gICAgdGhpcy5oaXN0b3J5TWFuYWdlciA9IGhpc3RvcnlNYW5hZ2VyXG4gICAgdGhpcy5waXhlbFRpbGVQb29sID0gcGl4ZWxUaWxlUG9vbCA/PyBuZXcgUGl4ZWxUaWxlUG9vbCh0aGlzLmNvbmZpZylcbiAgICB0aGlzLmFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IgPz8gbmV3IFBpeGVsQWNjdW11bGF0b3IodGhpcy5jb25maWcsIHRoaXMucGl4ZWxUaWxlUG9vbClcbiAgICB0aGlzLmhpc3RvcnlBY3Rpb25GYWN0b3J5ID0gaGlzdG9yeUFjdGlvbkZhY3RvcnlcbiAgICB0aGlzLm11dGF0b3IgPSBtdXRhdG9yRmFjdG9yeSh0aGlzKVxuICAgIHRoaXMucGFpbnRCdWZmZXIgPSBuZXcgUGFpbnRCdWZmZXIodGhpcy5jb25maWcsIHRoaXMucGl4ZWxUaWxlUG9vbClcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBgdHJhbnNhY3Rpb25gIGFuZCBjb21taXRzIHRoZSByZXN1bHRpbmcgcGl4ZWwgY2hhbmdlcyBhcyBhIHNpbmdsZVxuICAgKiB1bmRvYWJsZSBoaXN0b3J5IGFjdGlvbi5cbiAgICpcbiAgICogLSBJZiBgdHJhbnNhY3Rpb25gIHRocm93cywgYWxsIGFjY3VtdWxhdGVkIGNoYW5nZXMgYXJlIHJvbGxlZCBiYWNrIGFuZCB0aGUgZXJyb3JcbiAgICogICBpcyByZS10aHJvd24uIE5vIGFjdGlvbiBpcyBjb21taXR0ZWQuXG4gICAqIC0gSWYgYHRyYW5zYWN0aW9uYCBjb21wbGV0ZXMgd2l0aG91dCBtb2RpZnlpbmcgYW55IHBpeGVscywgbm8gYWN0aW9uIGlzIGNvbW1pdHRlZC5cbiAgICogLSBgd2l0aEhpc3RvcnlgIGlzIG5vdCByZS1lbnRyYW50LiBDYWxsaW5nIGl0IGFnYWluIGZyb20gaW5zaWRlIGB0cmFuc2FjdGlvbmAgd2lsbFxuICAgKiAgIHRocm93IGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgc2lsZW50IGRhdGEgbG9zcyBmcm9tIGEgbmVzdGVkIGV4dHJhY3RQYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIENhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBhZnRlciAgICBDYWxsZWQgYWZ0ZXIgYm90aCB1bmRvIGFuZCByZWRvIOKAlCB1c2UgZm9yIGdlbmVyaWMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuXG4gICAqIEBwYXJhbSBhZnRlclVuZG8gQ2FsbGVkIGFmdGVyIHVuZG8gb25seSDigJQgdXNlIGZvciBkaW1lbnNpb24gb3Igc3RhdGUgY2hhbmdlcyBzcGVjaWZpYyB0byB1bmRvLlxuICAgKiBAcGFyYW0gYWZ0ZXJSZWRvIENhbGxlZCBhZnRlciByZWRvIG9ubHkuXG4gICAqL1xuICB3aXRoSGlzdG9yeShcbiAgICB0cmFuc2FjdGlvbjogKG11dGF0b3I6IE0pID0+IHZvaWQsXG4gICAgYWZ0ZXI/OiAoKSA9PiB2b2lkLFxuICAgIGFmdGVyVW5kbz86ICgpID0+IHZvaWQsXG4gICAgYWZ0ZXJSZWRvPzogKCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2l0aEhpc3RvcnkgaXMgbm90IHJlLWVudHJhbnQg4oCUIGNvbW1pdCBvciByb2xsYmFjayB0aGUgY3VycmVudCBvcGVyYXRpb24gZmlyc3QnKVxuICAgIH1cblxuICAgIHRoaXMuX2luUHJvZ3Jlc3MgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24odGhpcy5tdXRhdG9yKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWNjdW11bGF0b3Iucm9sbGJhY2tBZnRlckVycm9yKClcbiAgICAgIHRocm93IGVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faW5Qcm9ncmVzcyA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWNjdW11bGF0b3IuYmVmb3JlVGlsZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5hY2N1bXVsYXRvci5leHRyYWN0UGF0Y2goKVxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuaGlzdG9yeUFjdGlvbkZhY3RvcnkodGhpcywgcGF0Y2gsIGFmdGVyLCBhZnRlclVuZG8sIGFmdGVyUmVkbylcblxuICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuY29tbWl0KGFjdGlvbilcbiAgfVxuXG4gIHJlc2l6ZShcbiAgICBuZXdXaWR0aDogbnVtYmVyLFxuICAgIG5ld0hlaWdodDogbnVtYmVyLFxuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGFmdGVyPzogKHRhcmdldDogSW1hZ2VEYXRhKSA9PiB2b2lkLFxuICAgIGFmdGVyVW5kbz86ICh0YXJnZXQ6IEltYWdlRGF0YSkgPT4gdm9pZCxcbiAgICBhZnRlclJlZG8/OiAodGFyZ2V0OiBJbWFnZURhdGEpID0+IHZvaWQsXG4gICAgcmVzaXplSW1hZ2VEYXRhRm4gPSByZXNpemVJbWFnZURhdGEsXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pblByb2dyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXNpemUgaW5zaWRlIGEgd2l0aEhpc3RvcnkgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjY3VtdWxhdG9yLmJlZm9yZVRpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlc2l6ZSB3aXRoIGFuIG9wZW4gYWNjdW11bGF0b3Ig4oCUIGNvbW1pdCBvciByb2xsYmFjayBmaXJzdCcpXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0XG4gICAgY29uc3QgYmVmb3JlSW1hZ2VEYXRhID0gdGFyZ2V0LmltYWdlRGF0YVxuICAgIGNvbnN0IGFmdGVySW1hZ2VEYXRhID0gcmVzaXplSW1hZ2VEYXRhRm4oYmVmb3JlSW1hZ2VEYXRhLCBuZXdXaWR0aCwgbmV3SGVpZ2h0LCBvZmZzZXRYLCBvZmZzZXRZKVxuXG4gICAgdGFyZ2V0LnNldChhZnRlckltYWdlRGF0YSlcblxuICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuY29tbWl0KHtcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgdGFyZ2V0LnNldChiZWZvcmVJbWFnZURhdGEpXG4gICAgICAgIGFmdGVyVW5kbz8uKGJlZm9yZUltYWdlRGF0YSlcbiAgICAgICAgYWZ0ZXI/LihiZWZvcmVJbWFnZURhdGEpXG4gICAgICB9LFxuICAgICAgcmVkbzogKCkgPT4ge1xuICAgICAgICB0YXJnZXQuc2V0KGFmdGVySW1hZ2VEYXRhKVxuICAgICAgICBhZnRlclJlZG8/LihhZnRlckltYWdlRGF0YSlcbiAgICAgICAgYWZ0ZXI/LihhZnRlckltYWdlRGF0YSlcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbW1pdFBhaW50QnVmZmVyKFxuICAgIGFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBibGVuZFBpeGVsRGF0YUZuID0gYmxlbmRQaXhlbERhdGEsXG4gICkge1xuICAgIGNvbnN0IHBhaW50QnVmZmVyID0gdGhpcy5wYWludEJ1ZmZlclxuICAgIGNvbnN0IHRpbGVTaGlmdCA9IHBhaW50QnVmZmVyLmNvbmZpZy50aWxlU2hpZnRcbiAgICBjb25zdCBsb29rdXAgPSBwYWludEJ1ZmZlci5sb29rdXBcblxuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmJsZW5kUGl4ZWxEYXRhT3B0c1xuXG4gICAgb3B0cy5hbHBoYSA9IGFscGhhXG4gICAgb3B0cy5ibGVuZEZuID0gYmxlbmRGblxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV1cblxuICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgY29uc3QgZGlkQ2hhbmdlID0gdGhpcy5hY2N1bXVsYXRvci5zdG9yZVRpbGVCZWZvcmVTdGF0ZSh0aWxlLmlkLCB0aWxlLnR4LCB0aWxlLnR5KVxuXG4gICAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnRcbiAgICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdFxuXG4gICAgICAgIG9wdHMueCA9IGR4XG4gICAgICAgIG9wdHMueSA9IGR5XG4gICAgICAgIG9wdHMudyA9IHRpbGUud2lkdGhcbiAgICAgICAgb3B0cy5oID0gdGlsZS5oZWlnaHRcblxuICAgICAgICBkaWRDaGFuZ2UoXG4gICAgICAgICAgYmxlbmRQaXhlbERhdGFGbihcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnRhcmdldCxcbiAgICAgICAgICAgIHRpbGUsXG4gICAgICAgICAgICBvcHRzLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYWludEJ1ZmZlci5jbGVhcigpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\n\n/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyAlphaMaskToPixelData(dst: IPixelData32, mask: AlphaMask, opts: ApplyMaskToPixelDataOptions = {}): boolean {\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 false;\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 false;\n if (h <= 0) return false;\n\n // 2. Determine Source Dimensions\n const mPitch = mask.w;\n if (mPitch <= 0) return false;\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 false;\n if (finalH <= 0) return false;\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 let didChange = false;\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 didChange = true;\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 const current = dst32[dIdx] as Color32;\n const next = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIENvbG9yMzIsIHR5cGUgSVBpeGVsRGF0YTMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgbWFzazogQWxwaGFNYXNrLFxuICBvcHRzOiBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMgPSB7fSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgdzogd2lkdGggPSBkc3Qud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gZHN0LmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm4gZmFsc2VcblxuICAvLyAxLiBJbml0aWFsIERlc3RpbmF0aW9uIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgdyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAodyA8PSAwKSByZXR1cm4gZmFsc2VcbiAgaWYgKGggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgLy8gMi4gRGV0ZXJtaW5lIFNvdXJjZSBEaW1lbnNpb25zXG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sud1xuICBpZiAobVBpdGNoIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIC8vIDMuIFNvdXJjZSBCb3VuZHMgQ2xpcHBpbmdcbiAgLy8gQ2FsY3VsYXRlIHdoZXJlIHdlIHdvdWxkIHN0YXJ0IHJlYWRpbmcgaW4gdGhlIG1hc2tcbiAgY29uc3Qgc3RhcnRYID0gbXggKyAoeCAtIHRhcmdldFgpXG4gIGNvbnN0IHN0YXJ0WSA9IG15ICsgKHkgLSB0YXJnZXRZKVxuXG4gIC8vIEZpbmQgdGhlIHNhZmUgb3ZlcmxhcCBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGFuZCB0aGUgbWFzayBib3VuZHNcbiAgY29uc3Qgc1gwID0gTWF0aC5tYXgoMCwgc3RhcnRYKVxuICBjb25zdCBzWTAgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKG1QaXRjaCwgc3RhcnRYICsgdylcbiAgY29uc3Qgc1kxID0gTWF0aC5taW4obWFzay5oLCBzdGFydFkgKyBoKVxuXG4gIGNvbnN0IGZpbmFsVyA9IHNYMSAtIHNYMFxuICBjb25zdCBmaW5hbEggPSBzWTEgLSBzWTBcblxuICAvLyBUaGlzIGlzIHdoZXJlIHlvdXIgZmFpbGluZyB0ZXN0cyBhcmUgbm93IGNhdWdodFxuICBpZiAoZmluYWxXIDw9IDApIHJldHVybiBmYWxzZVxuICBpZiAoZmluYWxIIDw9IDApIHJldHVybiBmYWxzZVxuXG4gIC8vIDQuIEFsaWduIERlc3RpbmF0aW9uIHdpdGggU291cmNlIENsaXBwaW5nXG4gIC8vIElmIHRoZSBzb3VyY2Ugd2FzIGNsaXBwZWQgb24gdGhlIHRvcC9sZWZ0LCB3ZSBtdXN0IHNoaWZ0IHRoZSBkZXN0aW5hdGlvbiBzdGFydFxuICBjb25zdCB4U2hpZnQgPSBzWDAgLSBzdGFydFhcbiAgY29uc3QgeVNoaWZ0ID0gc1kwIC0gc3RhcnRZXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGZpbmFsV1xuICBjb25zdCBtU3RyaWRlID0gbVBpdGNoIC0gZmluYWxXXG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhXG5cbiAgbGV0IGRJZHggPSAoeSArIHlTaGlmdCkgKiBkdyArICh4ICsgeFNoaWZ0KVxuICBsZXQgbUlkeCA9IHNZMCAqIG1QaXRjaCArIHNYMFxuXG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZVxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgaDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCB3OyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF1cbiAgICAgIC8vIFVuaWZpZWQgbG9naWMgYnJhbmNoIGluc2lkZSB0aGUgaG90IHBhdGhcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgbGV0IHdlaWdodCA9IDBcblxuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMFxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVNID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcbiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEgPT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZlY3RpdmVNXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3ZWlnaHQgPSAoZWZmZWN0aXZlTSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICB9XG5cbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxwaGEgY2hhbm5lbFxuICAgICAgICBkc3QzMltkSWR4XSA9IChkc3QzMltkSWR4XSAmIDB4MDBmZmZmZmYpID4+PiAwXG4gICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAod2VpZ2h0ICE9PSAyNTUpIHtcbiAgICAgICAgLy8gTWVyZ2UgYWxwaGEgY2hhbm5lbFxuICAgICAgICBjb25zdCBkID0gZHN0MzJbZElkeF1cbiAgICAgICAgY29uc3QgZGEgPSBkID4+PiAyNFxuXG4gICAgICAgIGlmIChkYSAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGZpbmFsQWxwaGEgPSBkYSA9PT0gMjU1ID8gd2VpZ2h0IDogKGRhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMlxuICAgICAgICAgIGNvbnN0IG5leHQgPSAoKGQgJiAweDAwZmZmZmZmKSB8IChmaW5hbEFscGhhIDw8IDI0KSkgPj4+IDBcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0XG4gICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgbUlkeCsrXG4gICAgfVxuXG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 = {}): boolean {\n let target = writer.config.target;\n const {\n x = 0,\n y = 0,\n w = target.width,\n h = target.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(applyAlphaMaskToPixelData(target, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5QWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseUFscGhhTWFzayhtYXNrOiBBbHBoYU1hc2ssIG9wdHM6IEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gICAgICBsZXQgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gdGFyZ2V0LndpZHRoLFxuICAgICAgICBoID0gdGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEodGFyZ2V0LCBtYXNrLCBvcHRzKSlcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyBinaryMaskToPixelData(dst: IPixelData32, mask: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}): boolean {\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 false;\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 || h <= 0) return false;\n const mPitch = mask.w;\n if (mPitch <= 0) return false;\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 if (finalW <= 0 || finalH <= 0) {\n return false;\n }\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 let didChange = false;\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = maskData[mIdx];\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n const current = dst32[dIdx];\n const next = (current & 0x00ffffff) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n } else if (globalAlpha !== 255) {\n const d = dst32[dIdx];\n const da = d >>> 24;\n if (da !== 0) {\n const finalAlpha = da === 255 ? globalAlpha : da * globalAlpha + 128 >> 8;\n const next = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n if (d !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbi8qKlxuICogRGlyZWN0bHkgYXBwbGllcyBhIG1hc2sgdG8gYSByZWdpb24gb2YgUGl4ZWxEYXRhLFxuICogbW9kaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbidzIGFscGhhIGNoYW5uZWwgaW4tcGxhY2UuXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFueSBwaXhlbHMgd2VyZSBhY3R1YWxseSBtb2RpZmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuXG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICB3ID0gTWF0aC5taW4odywgZHN0LndpZHRoIC0geClcbiAgaCA9IE1hdGgubWluKGgsIGRzdC5oZWlnaHQgLSB5KVxuXG4gIGlmICh3IDw9IDAgfHwgaCA8PSAwKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBtUGl0Y2ggPSBtYXNrLndcbiAgaWYgKG1QaXRjaCA8PSAwKSByZXR1cm4gZmFsc2VcblxuICAvLyAzLiBTb3VyY2UgQm91bmRzIENsaXBwaW5nXG4gIC8vIENhbGN1bGF0ZSB3aGVyZSB3ZSB3b3VsZCBzdGFydCByZWFkaW5nIGluIHRoZSBtYXNrXG4gIGNvbnN0IHN0YXJ0WCA9IG14ICsgKHggLSB0YXJnZXRYKVxuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSlcblxuICAvLyBGaW5kIHRoZSBzYWZlIG92ZXJsYXAgYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBhbmQgdGhlIG1hc2sgYm91bmRzXG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WClcbiAgY29uc3Qgc1kwID0gTWF0aC5tYXgoMCwgc3RhcnRZKVxuICBjb25zdCBzWDEgPSBNYXRoLm1pbihtUGl0Y2gsIHN0YXJ0WCArIHcpXG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKG1hc2suaCwgc3RhcnRZICsgaClcblxuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDBcbiAgY29uc3QgZmluYWxIID0gc1kxIC0gc1kwXG5cbiAgaWYgKGZpbmFsVyA8PSAwIHx8IGZpbmFsSCA8PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyA0LiBBbGlnbiBEZXN0aW5hdGlvbiB3aXRoIFNvdXJjZSBDbGlwcGluZ1xuICAvLyBJZiB0aGUgc291cmNlIHdhcyBjbGlwcGVkIG9uIHRoZSB0b3AvbGVmdCwgd2UgbXVzdCBzaGlmdCB0aGUgZGVzdGluYXRpb24gc3RhcnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYXG4gIGNvbnN0IHlTaGlmdCA9IHNZMCAtIHN0YXJ0WVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBkU3RyaWRlID0gZHcgLSBmaW5hbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGZpbmFsV1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gIGxldCBkSWR4ID0gKHkgKyB5U2hpZnQpICogZHcgKyAoeCArIHhTaGlmdClcbiAgbGV0IG1JZHggPSBzWTAgKiBtUGl0Y2ggKyBzWDBcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGZpbmFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBmaW5hbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBtYXNrRGF0YVttSWR4XVxuICAgICAgY29uc3QgaXNNYXNrZWRPdXQgPSBpbnZlcnRNYXNrID8gbVZhbCAhPT0gMCA6IG1WYWwgPT09IDBcblxuICAgICAgaWYgKGlzTWFza2VkT3V0KSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkSWR4XVxuICAgICAgICBjb25zdCBuZXh0ID0gKGN1cnJlbnQgJiAweDAwZmZmZmZmKSA+Pj4gMFxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dFxuICAgICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChnbG9iYWxBbHBoYSAhPT0gMjU1KSB7XG4gICAgICAgIGNvbnN0IGQgPSBkc3QzMltkSWR4XVxuICAgICAgICBjb25zdCBkYSA9IGQgPj4+IDI0XG5cbiAgICAgICAgaWYgKGRhICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgZmluYWxBbHBoYSA9IGRhID09PSAyNTUgPyBnbG9iYWxBbHBoYSA6IChkYSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICAgICAgY29uc3QgbmV4dCA9ICgoZCAmIDB4MDBmZmZmZmYpIHwgKGZpbmFsQWxwaGEgPDwgMjQpKSA+Pj4gMFxuICAgICAgICAgIGlmIChkICE9PSBuZXh0KSB7XG4gICAgICAgICAgICBkc3QzMltkSWR4XSA9IG5leHRcbiAgICAgICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxuXG4gIHJldHVybiBkaWRDaGFuZ2Vcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 = {}): boolean {\n let target = writer.config.target;\n const {\n x = 0,\n y = 0,\n w = target.width,\n h = target.height\n } = opts;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(applyBinaryMaskToPixelData(target, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYXBwbHlCaW5hcnlNYXNrKG1hc2s6IEJpbmFyeU1hc2ssIG9wdHM6IEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gICAgICBsZXQgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gdGFyZ2V0LndpZHRoLFxuICAgICAgICBoID0gdGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cykpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 IPixelData32} 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 * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelDataAlphaMask(dst: IPixelData32, color: Color32, mask: AlphaMask, opts: ColorBlendMaskOptions = {}): boolean {\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 false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\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 false;\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 isOpaque = globalAlpha === 255;\n const colorRGB = color & 0x00ffffff;\n let didChange = 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 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 const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIENvbG9yMzIsIENvbG9yQmxlbmRNYXNrT3B0aW9ucywgSVBpeGVsRGF0YTMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5cbi8qKlxuICogQmxlbmRzIGEgc29saWQgY29sb3IgaW50byBhIHRhcmdldCBwaXhlbCBidWZmZXIgdXNpbmcgYW4gYWxwaGEgbWFzay5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlIHdpZHRoIChgd2ApIG9yIGhlaWdodCAoYGhgKSBhcmUgb21pdHRlZCBmcm9tIHRoZSBvcHRpb25zLCB0aGV5IHdpbGwgc2FmZWx5XG4gKiBkZWZhdWx0IHRvIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBwcm92aWRlZCBtYXNrIHRvIHByZXZlbnQgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzLlxuICpcbiAqIEBwYXJhbSBkc3QgLSBUaGUgZGVzdGluYXRpb24ge0BsaW5rIElQaXhlbERhdGEzMn0gYnVmZmVyIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSBzb2xpZCBjb2xvciB0byBhcHBseS5cbiAqIEBwYXJhbSBtYXNrIC0gVGhlIG1hc2sgZGVmaW5pbmcgdGhlIHBlci1waXhlbCBvcGFjaXR5IG9mIHRoZSB0YXJnZXQgYXJlYS5cbiAqIEBwYXJhbSBvcHRzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBwbGFjZW1lbnQgY29vcmRpbmF0ZXMsIGJvdW5kcywgZ2xvYmFsIGFscGhhLCBhbmQgbWFzayBvZmZzZXRzLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKFxuICBkc3Q6IElQaXhlbERhdGEzMixcbiAgY29sb3I6IENvbG9yMzIsXG4gIG1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogQ29sb3JCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHMueCA/PyAwXG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzLnkgPz8gMFxuICBjb25zdCB3ID0gb3B0cy53ID8/IG1hc2sud1xuICBjb25zdCBoID0gb3B0cy5oID8/IG1hc2suaFxuICBjb25zdCBnbG9iYWxBbHBoYSA9IG9wdHMuYWxwaGEgPz8gMjU1XG4gIGNvbnN0IGJsZW5kRm4gPSBvcHRzLmJsZW5kRm4gPz8gc291cmNlT3ZlclBlcmZlY3RcbiAgY29uc3QgbXggPSBvcHRzLm14ID8/IDBcbiAgY29uc3QgbXkgPSBvcHRzLm15ID8/IDBcbiAgY29uc3QgaW52ZXJ0TWFzayA9IG9wdHMuaW52ZXJ0TWFzayA/PyBmYWxzZVxuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgYmFzZVNyY0FscGhhID0gKGNvbG9yID4+PiAyNClcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlIHx8IGZhbHNlXG5cbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVybiBmYWxzZVxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IGFjdHVhbFcgPSB3XG4gIGxldCBhY3R1YWxIID0gaFxuXG4gIGlmICh4IDwgMCkge1xuICAgIGFjdHVhbFcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBhY3R1YWxIICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgYWN0dWFsVyA9IE1hdGgubWluKGFjdHVhbFcsIGRzdC53aWR0aCAtIHgpXG4gIGFjdHVhbEggPSBNYXRoLm1pbihhY3R1YWxILCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgZHggPSAoeCAtIHRhcmdldFgpIHwgMFxuICBjb25zdCBkeSA9ICh5IC0gdGFyZ2V0WSkgfCAwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sud1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gIGxldCBkSWR4ID0gKHkgKiBkdyArIHgpIHwgMFxuICBsZXQgbUlkeCA9ICgobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkpIHwgMFxuXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGNvbG9yUkdCID0gY29sb3IgJiAweDAwZmZmZmZmXG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBtYXNrRGF0YVttSWR4XVxuICAgICAgY29uc3QgZWZmTSA9IGludmVydE1hc2sgPyAyNTUgLSBtVmFsIDogbVZhbFxuXG4gICAgICBpZiAoZWZmTSA9PT0gMCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCB3ZWlnaHQgPSBnbG9iYWxBbHBoYVxuXG4gICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZWZmTVxuICAgICAgfSBlbHNlIGlmIChlZmZNICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gKGVmZk0gKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgfVxuXG4gICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gY29sb3JcblxuICAgICAgaWYgKHdlaWdodCA8IDI1NSkge1xuICAgICAgICBjb25zdCBhID0gKGJhc2VTcmNBbHBoYSAqIHdlaWdodCArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBtSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChjb2xvclJHQiB8IChhIDw8IDI0KSkgPj4+IDApIGFzIENvbG9yMzJcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzJcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGZpbmFsQ29sLCBjdXJyZW50KVxuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICBkc3QzMltkSWR4XSA9IG5leHRcbiAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBkSWR4KytcbiAgICAgIG1JZHgrK1xuICAgIH1cblxuICAgIGRJZHggKz0gZFN0cmlkZVxuICAgIG1JZHggKz0gbVN0cmlkZVxuICB9XG5cbiAgcmV0dXJuIGRpZENoYW5nZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 IPixelData32} 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 * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelDataBinaryMask(dst: IPixelData32, color: Color32, mask: BinaryMask, opts: ColorBlendMaskOptions = {}): boolean {\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 false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\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 false;\n let baseColorWithGlobalAlpha = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return false;\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 let didChange = false;\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 const current = dst32[dIdx] as Color32;\n const next = blendFn(baseColorWithGlobalAlpha, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBDb2xvckJsZW5kTWFza09wdGlvbnMsIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG4vKipcbiAqIEJsZW5kcyBhIHNvbGlkIGNvbG9yIGludG8gYSB0YXJnZXQgcGl4ZWwgYnVmZmVyIHVzaW5nIGEgYmluYXJ5IG1hc2suXG4gKlxuICogQHJlbWFya3NcbiAqIElmIHRoZSB3aWR0aCAoYHdgKSBvciBoZWlnaHQgKGBoYCkgYXJlIG9taXR0ZWQgZnJvbSB0aGUgb3B0aW9ucywgdGhleSB3aWxsIHNhZmVseVxuICogZGVmYXVsdCB0byB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcHJvdmlkZWQgbWFzayB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzcy5cbiAqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIGRlc3RpbmF0aW9uIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgc29saWQgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gbWFzayAtIFRoZSBtYXNrIGRlZmluaW5nIHRoZSBwZXItcGl4ZWwgb3BhY2l0eSBvZiB0aGUgdGFyZ2V0IGFyZWEuXG4gKiBAcGFyYW0gb3B0cyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgcGxhY2VtZW50IGNvb3JkaW5hdGVzLCBib3VuZHMsIGdsb2JhbCBhbHBoYSwgYW5kIG1hc2sgb2Zmc2V0cy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2soXG4gIGRzdDogSVBpeGVsRGF0YTMyLFxuICBjb2xvcjogQ29sb3IzMixcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgb3B0czogQ29sb3JCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHMueCA/PyAwXG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzLnkgPz8gMFxuICBsZXQgdyA9IG9wdHMudyA/PyBtYXNrLndcbiAgbGV0IGggPSBvcHRzLmggPz8gbWFzay5oXG4gIGNvbnN0IGdsb2JhbEFscGhhID0gb3B0cy5hbHBoYSA/PyAyNTVcbiAgY29uc3QgYmxlbmRGbiA9IG9wdHMuYmxlbmRGbiA/PyBzb3VyY2VPdmVyUGVyZmVjdFxuICBjb25zdCBteCA9IG9wdHMubXggPz8gMFxuICBjb25zdCBteSA9IG9wdHMubXkgPz8gMFxuICBjb25zdCBpbnZlcnRNYXNrID0gb3B0cy5pbnZlcnRNYXNrID8/IGZhbHNlXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2VcblxuICBpZiAoYmFzZVNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSA9IGNvbG9yXG5cbiAgaWYgKGdsb2JhbEFscGhhIDwgMjU1KSB7XG4gICAgY29uc3QgYSA9IChiYXNlU3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuIGZhbHNlXG4gICAgYmFzZUNvbG9yV2l0aEdsb2JhbEFscGhhID0gKChjb2xvciAmIDB4MDBmZmZmZmYpIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gIH1cblxuICBjb25zdCBkeCA9ICh4IC0gdGFyZ2V0WCkgfCAwXG4gIGNvbnN0IGR5ID0gKHkgLSB0YXJnZXRZKSB8IDBcbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sud1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuICBsZXQgZElkeCA9ICh5ICogZHcgKyB4KSB8IDBcbiAgbGV0IG1JZHggPSAoKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpKSB8IDBcblxuICBjb25zdCBkU3RyaWRlID0gKGR3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IG1TdHJpZGUgPSAobVBpdGNoIC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IHNraXBWYWwgPSBpbnZlcnRNYXNrID8gMSA6IDBcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgaWYgKG1hc2tEYXRhW21JZHhdID09PSBza2lwVmFsKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzJcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSwgY3VycmVudClcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWVcbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxuXG4gIHJldHVybiBkaWRDaGFuZ2Vcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type HistoryMutator, MaskType } from '../../_types';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nconst defaults = {\n blendColorPixelDataAlphaMask,\n blendColorPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPaintMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask\n } = deps;\n const OPTS = {\n x: 0,\n y: 0,\n blendFn: sourceOverPerfect,\n alpha: 255\n };\n return {\n blendColorPaintMask(color: Color32, mask: PaintMask, x: number, y: number, alpha = 255, blendFn = sourceOverPerfect): boolean {\n const tx = x + mask.centerOffsetX;\n const ty = y + mask.centerOffsetY;\n const didChange = writer.accumulator.storeRegionBeforeState(tx, ty, mask.w, mask.h);\n OPTS.x = tx;\n OPTS.y = ty;\n OPTS.alpha = alpha;\n OPTS.blendFn = blendFn;\n if (mask.type === MaskType.BINARY) {\n return didChange(blendColorPixelDataBinaryMask(writer.config.target, color, mask, OPTS));\n } else {\n return didChange(blendColorPixelDataAlphaMask(writer.config.target, color, mask, OPTS));\n }\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIEhpc3RvcnlNdXRhdG9yLCBNYXNrVHlwZSwgdHlwZSBQYWludE1hc2sgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzaydcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2ssXG4gIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrLFxufVxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRQYWludE1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrLFxuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrLFxuICB9ID0gZGVwc1xuXG4gIGNvbnN0IE9QVFMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIGFscGhhOiAyNTUsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJsZW5kQ29sb3JQYWludE1hc2soXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIG1hc2s6IFBhaW50TWFzayxcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlcixcbiAgICAgIGFscGhhID0gMjU1LFxuICAgICAgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdHggPSB4ICsgbWFzay5jZW50ZXJPZmZzZXRYXG4gICAgICBjb25zdCB0eSA9IHkgKyBtYXNrLmNlbnRlck9mZnNldFlcblxuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUodHgsIHR5LCBtYXNrLncsIG1hc2suaClcblxuICAgICAgT1BUUy54ID0gdHhcbiAgICAgIE9QVFMueSA9IHR5XG4gICAgICBPUFRTLmFscGhhID0gYWxwaGFcbiAgICAgIE9QVFMuYmxlbmRGbiA9IGJsZW5kRm5cblxuICAgICAgaWYgKG1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoXG4gICAgICAgICAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIGNvbG9yLCBtYXNrLCBPUFRTKSxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRpZENoYW5nZShcbiAgICAgICAgICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBjb2xvciwgbWFzaywgT1BUUyksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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=","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 if (imageData === null || imageData.width !== width || imageData.height !== height) {\n imageData = new ImageData(width, height);\n } else {\n imageData.data.fill(0);\n }\n return imageData!;\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUmV1c2FibGVJbWFnZURhdGEgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlUmV1c2FibGVJbWFnZURhdGE+XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIGEgc2luZ2xlLCByZXVzYWJsZSBJbWFnZURhdGEgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIHVzZWQgdG8gbWluaW1pemUgZ2FyYmFnZSBjb2xsZWN0aW9uIG92ZXJoZWFkIGJ5IHJlY3ljbGluZyB0aGVcbiAqIHVuZGVybHlpbmcgcGl4ZWwgYnVmZmVyIGFjcm9zcyBtdWx0aXBsZSBvcGVyYXRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJldHVybnMgYSBwb29sZWQgSW1hZ2VEYXRhIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJldXNhYmxlSW1hZ2VEYXRhKCkge1xuICBsZXQgaW1hZ2VEYXRhOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gSW1hZ2VEYXRhIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucy5cbiAgICogSWYgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGRpZmZlciBmcm9tIHRoZSBjYWNoZWQgaW5zdGFuY2UsIGEgbmV3IG9uZSBpcyBhbGxvY2F0ZWQuXG4gICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscy5cbiAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBpbiBwaXhlbHMuXG4gICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgYWxsb2NhdGVkIEltYWdlRGF0YSBvYmplY3QuXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UmV1c2FibGVJbWFnZURhdGEod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBpZiAoaW1hZ2VEYXRhID09PSBudWxsIHx8IGltYWdlRGF0YS53aWR0aCAhPT0gd2lkdGggfHwgaW1hZ2VEYXRhLmhlaWdodCAhPT0gaGVpZ2h0KSB7XG4gICAgICBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlRGF0YS5kYXRhLmZpbGwoMClcbiAgICB9XG5cbiAgICByZXR1cm4gaW1hZ2VEYXRhIVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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==","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 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 { 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 { ImageDataLike, IPixelData } from '../_types';\nimport { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array';\nexport class PixelData<T extends ImageDataLike = ImageData> implements IPixelData<T> {\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//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlLCBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgaW1hZ2VEYXRhVG9VSW50MzJBcnJheSB9IGZyb20gJy4uL0ltYWdlRGF0YS9pbWFnZURhdGFUb1VJbnQzMkFycmF5J1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxEYXRhPFQgZXh0ZW5kcyBJbWFnZURhdGFMaWtlID0gSW1hZ2VEYXRhPiBpbXBsZW1lbnRzIElQaXhlbERhdGE8VD4ge1xuICByZWFkb25seSBkYXRhMzI6IFVpbnQzMkFycmF5XG4gIHJlYWRvbmx5IGltYWdlRGF0YTogVFxuICByZWFkb25seSB3aWR0aDogbnVtYmVyXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IoaW1hZ2VEYXRhOiBUKSB7XG4gICAgdGhpcy5kYXRhMzIgPSBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YSlcbiAgICB0aGlzLmltYWdlRGF0YSA9IGltYWdlRGF0YVxuICAgIHRoaXMud2lkdGggPSBpbWFnZURhdGEud2lkdGhcbiAgICB0aGlzLmhlaWdodCA9IGltYWdlRGF0YS5oZWlnaHRcbiAgfVxuXG4gIHNldChpbWFnZURhdGE6IFQpOiB2b2lkIHtcbiAgICA7KHRoaXMgYXMgYW55KS5pbWFnZURhdGEgPSBpbWFnZURhdGFcbiAgICA7KHRoaXMgYXMgYW55KS5kYXRhMzIgPSBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YSlcbiAgICA7KHRoaXMgYXMgYW55KS53aWR0aCA9IGltYWdlRGF0YS53aWR0aFxuICAgIDsodGhpcyBhcyBhbnkpLmhlaWdodCA9IGltYWdlRGF0YS5oZWlnaHRcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { BlendColor32 } from '../_types';\nimport { blendPixelData } from './blendPixelData';\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: undefined as BlendColor32 | undefined\n};\nexport function blendPixelDataPaintBuffer(paintBuffer: PaintBuffer, target: IPixelData32, alpha = 255, blendFn?: BlendColor32, blendPixelDataFn = blendPixelData): void {\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const x = tile.tx << tileShift;\n const y = tile.ty << tileShift;\n SCRATCH_OPTS.x = x;\n SCRATCH_OPTS.y = y;\n SCRATCH_OPTS.alpha = alpha;\n SCRATCH_OPTS.blendFn = blendFn;\n blendPixelDataFn(target, tile, SCRATCH_OPTS);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhIH0gZnJvbSAnLi9ibGVuZFBpeGVsRGF0YSdcbmltcG9ydCB0eXBlIHsgUGFpbnRCdWZmZXIgfSBmcm9tICcuLi9QYWludC9QYWludEJ1ZmZlcidcblxuY29uc3QgU0NSQVRDSF9PUFRTID0ge1xuICB4OiAwLFxuICB5OiAwLFxuICBhbHBoYTogMjU1LFxuICBibGVuZEZuOiB1bmRlZmluZWQgYXMgQmxlbmRDb2xvcjMyIHwgdW5kZWZpbmVkLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGFQYWludEJ1ZmZlcihcbiAgcGFpbnRCdWZmZXI6IFBhaW50QnVmZmVyLFxuICB0YXJnZXQ6IElQaXhlbERhdGEzMixcbiAgYWxwaGEgPSAyNTUsXG4gIGJsZW5kRm4/OiBCbGVuZENvbG9yMzIsXG4gIGJsZW5kUGl4ZWxEYXRhRm4gPSBibGVuZFBpeGVsRGF0YSxcbik6IHZvaWQge1xuICBjb25zdCB0aWxlU2hpZnQgPSBwYWludEJ1ZmZlci5jb25maWcudGlsZVNoaWZ0XG4gIGNvbnN0IGxvb2t1cCA9IHBhaW50QnVmZmVyLmxvb2t1cFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV1cblxuICAgIGlmICh0aWxlKSB7XG4gICAgICBjb25zdCB4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnRcbiAgICAgIGNvbnN0IHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdFxuXG4gICAgICBTQ1JBVENIX09QVFMueCA9IHhcbiAgICAgIFNDUkFUQ0hfT1BUUy55ID0geVxuICAgICAgU0NSQVRDSF9PUFRTLmFscGhhID0gYWxwaGFcbiAgICAgIFNDUkFUQ0hfT1BUUy5ibGVuZEZuID0gYmxlbmRGblxuXG4gICAgICBibGVuZFBpeGVsRGF0YUZuKHRhcmdldCwgdGlsZSwgU0NSQVRDSF9PUFRTKVxuICAgIH1cbiAgfVxufVxuXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { fillPixelDataFast } from './fillPixelDataFast';\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelData.\n */\nexport function clearPixelData(dst: IPixelData32, rect?: Partial<BinaryMaskRect>): void {\n fillPixelDataFast(dst, 0 as Color32, rect);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrUmVjdCwgQ29sb3IzMiwgSVBpeGVsRGF0YTMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZmlsbFBpeGVsRGF0YUZhc3QgfSBmcm9tICcuL2ZpbGxQaXhlbERhdGFGYXN0J1xuXG4vKipcbiAqIENsZWFycyBhIHJlZ2lvbiBvZiB0aGUgUGl4ZWxEYXRhIHRvIHRyYW5zcGFyZW50ICgweDAwMDAwMDAwKS5cbiAqIEludGVybmFsbHkgdXNlcyB0aGUgb3B0aW1pemVkIGZpbGxQaXhlbERhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhMzIsXG4gIHJlY3Q/OiBQYXJ0aWFsPEJpbmFyeU1hc2tSZWN0Pixcbik6IHZvaWQge1xuICBmaWxsUGl4ZWxEYXRhRmFzdChkc3QsIDAgYXMgQ29sb3IzMiwgcmVjdClcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32, rect: Rect): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData32, x: number, y: number, w: number, h: number): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData32, _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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfQkxJVCA9IG1ha2VDbGlwcGVkQmxpdCgpXG5cbi8qKlxuICogRXh0cmFjdHMgYSByZWN0YW5ndWxhciByZWdpb24gb2YgcGl4ZWxzIGZyb20gUGl4ZWxEYXRhLlxuICogUmV0dXJucyBhIG5ldyBVaW50MzJBcnJheSBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgcGl4ZWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcihzb3VyY2U6IElQaXhlbERhdGEzMiwgcmVjdDogUmVjdCk6IFVpbnQzMkFycmF5XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcihzb3VyY2U6IElQaXhlbERhdGEzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogVWludDMyQXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKFxuICBzb3VyY2U6IElQaXhlbERhdGEzMixcbiAgX3g6IFJlY3QgfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gdHlwZW9mIF94ID09PSAnb2JqZWN0J1xuICAgID8gX3hcbiAgICA6IHsgeDogX3gsIHk6IF95ISwgdzogX3chLCBoOiBfaCEgfVxuXG4gIGNvbnN0IHNyY1cgPSBzb3VyY2Uud2lkdGhcbiAgY29uc3Qgc3JjSCA9IHNvdXJjZS5oZWlnaHRcbiAgY29uc3Qgc3JjRGF0YSA9IHNvdXJjZS5kYXRhMzJcblxuICAvLyBTYWZldHkgY2hlY2sgZm9yIGVtcHR5IG9yIGludmFsaWQgZGltZW5zaW9uc1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkoMClcbiAgfVxuXG4gIGNvbnN0IGRzdERhdGEgPSBuZXcgVWludDMyQXJyYXkodyAqIGgpXG5cbiAgLy8gV2UgbWFwIGZyb20gU291cmNlIChzcmNXLCBzcmNIKSBhdCAoeCx5KVxuICAvLyBUbyBEZXN0ICh3LCBoKSBhdCAoMCwwKVxuICAvLyBOb3RlOiByZXNvbHZlQmxpdENsaXBwaW5nIHVzdWFsbHkgdGFrZXMgKGRzdFgsIGRzdFksIHNyY1gsIHNyY1kuLi4pXG4gIC8vIEhlcmUgd2UgYXJlIFwiYmxpdHRpbmdcIiBGUk9NIHgseSBUTyAwLDAuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIDAsXG4gICAgMCxcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoLFxuICAgIHcsXG4gICAgaCxcbiAgICBzcmNXLFxuICAgIHNyY0gsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZHN0RGF0YVxuXG4gIGNvbnN0IHtcbiAgICB4OiBkc3RYLFxuICAgIHk6IGRzdFksXG4gICAgc3g6IHNyY1gsXG4gICAgc3k6IHNyY1ksXG4gICAgdzogY29weVcsXG4gICAgaDogY29weUgsXG4gIH0gPSBjbGlwXG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29weUg7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSArIHJvdykgKiBzcmNXICsgc3JjWFxuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKyByb3cpICogdyArIGRzdFhcblxuICAgIC8vIFBlcmZvcm0gdGhlIGhpZ2gtc3BlZWQgMzItYml0IGJ1bGsgY29weVxuICAgIGNvbnN0IGNodW5rID0gc3JjRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5VylcbiAgICBkc3REYXRhLnNldChjaHVuaywgZHN0U3RhcnQpXG4gIH1cblxuICByZXR1cm4gZHN0RGF0YVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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: IPixelData32, rect: Rect): PixelData;\nexport function extractPixelData(source: IPixelData32, x: number, y: number, w: number, h: number): PixelData;\nexport function extractPixelData(source: IPixelData32, _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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyIH0gZnJvbSAnLi9leHRyYWN0UGl4ZWxEYXRhQnVmZmVyJ1xuaW1wb3J0IHsgUGl4ZWxEYXRhIH0gZnJvbSAnLi9QaXhlbERhdGEnXG5cbi8qKlxuICogSGlnaC1sZXZlbCBleHRyYWN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBQaXhlbERhdGEgaW5zdGFuY2UuXG4gKiBMZXZlcmFnZXMgZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlciBmb3Igb3B0aW1pemVkIDMyLWJpdCBtZW1vcnkgbW92ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhKHNvdXJjZTogSVBpeGVsRGF0YTMyLCByZWN0OiBSZWN0KTogUGl4ZWxEYXRhXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShzb3VyY2U6IElQaXhlbERhdGEzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogUGl4ZWxEYXRhXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShcbiAgc291cmNlOiBJUGl4ZWxEYXRhMzIsXG4gIF94OiBSZWN0IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogUGl4ZWxEYXRhIHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDogeyB4OiBfeCwgeTogX3khLCB3OiBfdyEsIGg6IF9oISB9XG5cbiAgY29uc3QgcmVzdWx0ID0gbmV3IFBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKHcsIGgpKVxuXG4gIGNvbnN0IGJ1ZmZlciA9IGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlLCB4LCB5LCB3LCBoKVxuICByZXN1bHQuZGF0YTMyLnNldChidWZmZXIpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { IPixelData32 } from '../_types';\nexport class PixelBuffer32 implements IPixelData32 {\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBjbGFzcyBQaXhlbEJ1ZmZlcjMyIGltcGxlbWVudHMgSVBpeGVsRGF0YTMyIHtcbiAgcmVhZG9ubHkgZGF0YTMyOiBVaW50MzJBcnJheVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHdpZHRoOiBudW1iZXIsXG4gICAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGF0YTMyPzogVWludDMyQXJyYXksXG4gICkge1xuICAgIHRoaXMuZGF0YTMyID0gZGF0YTMyID8/IG5ldyBVaW50MzJBcnJheSh3aWR0aCAqIGhlaWdodClcbiAgfVxuXG4gIHNldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YTMyPzogVWludDMyQXJyYXkpOiB2b2lkIHtcbiAgICA7KHRoaXMgYXMgYW55KS5kYXRhMzIgPSBkYXRhMzIgPz8gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KVxuICAgIDsodGhpcyBhcyBhbnkpLndpZHRoID0gd2lkdGhcbiAgICA7KHRoaXMgYXMgYW55KS5oZWlnaHQgPSBoZWlnaHRcbiAgfVxuXG4gIGNvcHkoKTogUGl4ZWxCdWZmZXIzMiB7XG4gICAgY29uc3QgbmV3RGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuZGF0YTMyKVxuICAgIHJldHVybiBuZXcgUGl4ZWxCdWZmZXIzMihcbiAgICAgIHRoaXMud2lkdGgsXG4gICAgICB0aGlzLmhlaWdodCxcbiAgICAgIG5ld0RhdGEzMixcbiAgICApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32): 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIElQaXhlbERhdGEzMiB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IG1ha2VBbHBoYU1hc2sgfSBmcm9tICcuLi9NYXNrL0FscGhhTWFzaydcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYWxwaGEgY2hhbm5lbCBmcm9tIFBpeGVsRGF0YSBpbnRvIGEgc2luZ2xlLWNoYW5uZWwgbWFzay5cbiAqIFJldHVybnMgYSBVaW50OEFycmF5IGJyYW5kZWQgYXMgQWxwaGFNYXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxEYXRhVG9BbHBoYU1hc2soXG4gIHBpeGVsRGF0YTogSVBpeGVsRGF0YTMyLFxuKTogQWxwaGFNYXNrIHtcbiAgY29uc3Qge1xuICAgIGRhdGEzMixcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH0gPSBwaXhlbERhdGFcbiAgY29uc3QgbGVuID0gZGF0YTMyLmxlbmd0aFxuICBjb25zdCBtYXNrID0gbWFrZUFscGhhTWFzayh3aWR0aCwgaGVpZ2h0KVxuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhMzJbaV1cblxuICAgIC8vIEV4dHJhY3QgdGhlIEFscGhhIGJ5dGUgKHRvcCA4IGJpdHMgaW4gQUJHUiAvIExpdHRsZS1FbmRpYW4pXG4gICAgLy8gU2hpZnQgcmlnaHQgYnkgMjQgbW92ZXMgdGhlIDR0aCBieXRlIHRvIHRoZSAxc3QgcG9zaXRpb25cbiAgICBtYXNrRGF0YVtpXSA9ICh2YWwgPj4+IDI0KSAmIDB4ZmZcbiAgfVxuXG4gIHJldHVybiBtYXNrXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function reflectPixelDataHorizontal(pixelData: IPixelData32): 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: IPixelData32): 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0UGl4ZWxEYXRhSG9yaXpvbnRhbChwaXhlbERhdGE6IElQaXhlbERhdGEzMik6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aFxuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTMyXG4gIGNvbnN0IGhhbGZXaWR0aCA9IE1hdGguZmxvb3Iod2lkdGggLyAyKVxuXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCByb3dPZmZzZXQgPSB5ICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgaGFsZldpZHRoOyB4KyspIHtcbiAgICAgIGNvbnN0IGxlZnRJZHggPSByb3dPZmZzZXQgKyB4XG4gICAgICBjb25zdCByaWdodElkeCA9IHJvd09mZnNldCArICh3aWR0aCAtIDEgLSB4KVxuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbbGVmdElkeF1cblxuICAgICAgZGF0YVtsZWZ0SWR4XSA9IGRhdGFbcmlnaHRJZHhdXG4gICAgICBkYXRhW3JpZ2h0SWR4XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3RQaXhlbERhdGFWZXJ0aWNhbChwaXhlbERhdGE6IElQaXhlbERhdGEzMik6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aFxuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTMyXG4gIGNvbnN0IGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIDIpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoYWxmSGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCB0b3BSb3dPZmZzZXQgPSB5ICogd2lkdGhcbiAgICBjb25zdCBib3R0b21Sb3dPZmZzZXQgPSAoaGVpZ2h0IC0gMSAtIHkpICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgdG9wSWR4ID0gdG9wUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgYm90dG9tSWR4ID0gYm90dG9tUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbdG9wSWR4XVxuXG4gICAgICBkYXRhW3RvcElkeF0gPSBkYXRhW2JvdHRvbUlkeF1cbiAgICAgIGRhdGFbYm90dG9tSWR4XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhMzIsIFBpeGVsRGF0YSB9IGZyb20gJy4uL2luZGV4J1xuaW1wb3J0IHsgcmVzYW1wbGUzMiB9IGZyb20gJy4uL0ludGVybmFsL3Jlc2FtcGxlMzInXG5cbi8qKlxuICogUmVzYW1wbGVzIFBpeGVsRGF0YSBieSBhIHNwZWNpZmljIGZhY3RvciB1c2luZyBuZWFyZXN0IG5laWdoYm9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVQaXhlbERhdGEoXG4gIHBpeGVsRGF0YTogSVBpeGVsRGF0YTMyLFxuICBmYWN0b3I6IG51bWJlcixcbik6IFBpeGVsRGF0YSB7XG4gIGNvbnN0IHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9ID0gcmVzYW1wbGUzMihwaXhlbERhdGEuZGF0YTMyLCBwaXhlbERhdGEud2lkdGgsIHBpeGVsRGF0YS5oZWlnaHQsIGZhY3RvcilcblxuICByZXR1cm4gbmV3IFBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKFxuICAgIG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhLmJ1ZmZlcikgYXMgSW1hZ2VEYXRhQXJyYXksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICApKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 IPixelData32} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target buffer.\n */\nexport function writePixelDataBuffer(target: IPixelData32, data: Uint32Array, rect: Rect): void;\nexport function writePixelDataBuffer(target: IPixelData32, data: Uint32Array, x: number, y: number, w: number, h: number): void;\nexport function writePixelDataBuffer(target: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhMzIsIHR5cGUgUmVjdCB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IG1ha2VDbGlwcGVkQmxpdCwgcmVzb2x2ZUJsaXRDbGlwcGluZyB9IGZyb20gJy4uL0ludGVybmFsL3Jlc29sdmVDbGlwcGluZydcblxuY29uc3QgU0NSQVRDSF9CTElUID0gbWFrZUNsaXBwZWRCbGl0KClcblxuLyoqXG4gKiBDb3BpZXMgYSBwaXhlbCBidWZmZXIgaW50byBhIHNwZWNpZmljIHJlZ2lvbiBvZiBhIHtAbGluayBJUGl4ZWxEYXRhMzJ9IG9iamVjdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZGlyZWN0IG1lbW9yeSBjb3B5IGZyb20gYSB7QGxpbmsgVWludDMyQXJyYXl9XG4gKiBpbnRvIHRoZSB0YXJnZXQgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQaXhlbERhdGFCdWZmZXIoXG4gIHRhcmdldDogSVBpeGVsRGF0YTMyLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgcmVjdDogUmVjdCxcbik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhMzIsXG4gIGRhdGE6IFVpbnQzMkFycmF5LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQaXhlbERhdGFCdWZmZXIoXG4gIHRhcmdldDogSVBpeGVsRGF0YTMyLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgX3g6IFJlY3QgfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDoge1xuICAgICAgeDogX3gsXG4gICAgICB5OiBfeSEsXG4gICAgICB3OiBfdyEsXG4gICAgICBoOiBfaCEsXG4gICAgfVxuXG4gIGNvbnN0IGRzdFcgPSB0YXJnZXQud2lkdGhcbiAgY29uc3QgZHN0SCA9IHRhcmdldC5oZWlnaHRcbiAgY29uc3QgZHN0RGF0YSA9IHRhcmdldC5kYXRhMzJcblxuICAvLyB0cmVhdCB0aGUgc291cmNlIGJ1ZmZlciBhcyBhIFNvdXJjZSBJbWFnZSBzdGFydGluZyBhdCAwLDAgd2l0aCBzaXplIHcsaFxuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgICB4LFxuICAgIHksXG4gICAgMCxcbiAgICAwLFxuICAgIHcsXG4gICAgaCxcbiAgICBkc3RXLFxuICAgIGRzdEgsXG4gICAgdyxcbiAgICBoLFxuICAgIFNDUkFUQ0hfQkxJVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuXG5cbiAgY29uc3Qge1xuICAgIHg6IGRzdFgsXG4gICAgeTogZHN0WSxcbiAgICBzeDogc3JjWCxcbiAgICBzeTogc3JjWSxcbiAgICB3OiBjb3B5VyxcbiAgICBoOiBjb3B5SCxcbiAgfSA9IGNsaXBcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICsgcm93KSAqIGRzdFcgKyBkc3RYXG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSArIHJvdykgKiB3ICsgc3JjWFxuXG4gICAgZHN0RGF0YS5zZXQoZGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5VyksIGRzdFN0YXJ0KVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { writePixelDataBuffer } from './writePixelDataBuffer';\n\n/**\n * @param writePixelDataBufferFn - @hidden\n */\nexport function writePaintBufferToPixelData(target: IPixelData, paintBuffer: PaintBuffer, writePixelDataBufferFn = writePixelDataBuffer) {\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n writePixelDataBufferFn(target, tile.data32, dx, dy, tile.width, tile.height);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYWludEJ1ZmZlciB9IGZyb20gJy4uL1BhaW50L1BhaW50QnVmZmVyJ1xuaW1wb3J0IHsgd3JpdGVQaXhlbERhdGFCdWZmZXIgfSBmcm9tICcuL3dyaXRlUGl4ZWxEYXRhQnVmZmVyJ1xuXG4vKipcbiAqIEBwYXJhbSB3cml0ZVBpeGVsRGF0YUJ1ZmZlckZuIC0gQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQYWludEJ1ZmZlclRvUGl4ZWxEYXRhKFxuICB0YXJnZXQ6IElQaXhlbERhdGEsXG4gIHBhaW50QnVmZmVyOiBQYWludEJ1ZmZlcixcbiAgd3JpdGVQaXhlbERhdGFCdWZmZXJGbiA9IHdyaXRlUGl4ZWxEYXRhQnVmZmVyLFxuKSB7XG4gIGNvbnN0IHRpbGVTaGlmdCA9IHBhaW50QnVmZmVyLmNvbmZpZy50aWxlU2hpZnRcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aWxlID0gbG9va3VwW2ldXG5cbiAgICBpZiAodGlsZSkge1xuICAgICAgY29uc3QgZHggPSB0aWxlLnR4IDw8IHRpbGVTaGlmdFxuICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdFxuXG4gICAgICB3cml0ZVBpeGVsRGF0YUJ1ZmZlckZuKHRhcmdldCwgdGlsZS5kYXRhMzIsIGR4LCBkeSwgdGlsZS53aWR0aCwgdGlsZS5oZWlnaHQpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\nexport function makeCirclePaintAlphaMask(size: number, fallOff: (d: number) => number = d => d): PaintAlphaMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const invR = 1 / radius;\n const centerOffset = -Math.ceil(radius - 0.5);\n for (let y = 0; y < size; y++) {\n const rowOffset = y * size;\n const dy = y - radius + 0.5;\n const dy2 = dy * dy;\n for (let x = 0; x < size; x++) {\n const dx = x - radius + 0.5;\n const distSqr = dx * dx + dy2;\n if (distSqr <= radius * radius) {\n const dist = Math.sqrt(distSqr) * invR;\n\n // Pass 1.0 at center, 0.0 at edge\n const strength = fallOff(1 - dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n data[rowOffset + x] = Math.max(0, Math.min(255, intensity));\n }\n }\n }\n }\n return {\n type: MaskType.ALPHA,\n data,\n w: size,\n h: size,\n centerOffsetX: centerOffset,\n centerOffsetY: centerOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUsIHR5cGUgUGFpbnRBbHBoYU1hc2sgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2lyY2xlUGFpbnRBbHBoYU1hc2soc2l6ZTogbnVtYmVyLCBmYWxsT2ZmOiAoZDogbnVtYmVyKSA9PiBudW1iZXIgPSAoZCkgPT4gZCk6IFBhaW50QWxwaGFNYXNrIHtcbiAgY29uc3QgYXJlYSA9IHNpemUgKiBzaXplXG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhcmVhKVxuICBjb25zdCByYWRpdXMgPSBzaXplIC8gMlxuICBjb25zdCBpbnZSID0gMSAvIHJhZGl1c1xuXG4gIGNvbnN0IGNlbnRlck9mZnNldCA9IC1NYXRoLmNlaWwocmFkaXVzIC0gMC41KVxuXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgc2l6ZTsgeSsrKSB7XG4gICAgY29uc3Qgcm93T2Zmc2V0ID0geSAqIHNpemVcbiAgICBjb25zdCBkeSA9IHkgLSByYWRpdXMgKyAwLjVcbiAgICBjb25zdCBkeTIgPSBkeSAqIGR5XG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNpemU7IHgrKykge1xuICAgICAgY29uc3QgZHggPSB4IC0gcmFkaXVzICsgMC41XG4gICAgICBjb25zdCBkaXN0U3FyID0gZHggKiBkeCArIGR5MlxuXG4gICAgICBpZiAoZGlzdFNxciA8PSAocmFkaXVzICogcmFkaXVzKSkge1xuICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5zcXJ0KGRpc3RTcXIpICogaW52UlxuXG4gICAgICAgIC8vIFBhc3MgMS4wIGF0IGNlbnRlciwgMC4wIGF0IGVkZ2VcbiAgICAgICAgY29uc3Qgc3RyZW5ndGggPSBmYWxsT2ZmKDEgLSBkaXN0KVxuICAgICAgICBpZiAoc3RyZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgaW50ZW5zaXR5ID0gKHN0cmVuZ3RoICogMjU1KSB8IDBcbiAgICAgICAgICBkYXRhW3Jvd09mZnNldCArIHhdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBpbnRlbnNpdHkpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5BTFBIQSxcbiAgICBkYXRhLFxuICAgIHc6IHNpemUsXG4gICAgaDogc2l6ZSxcbiAgICBjZW50ZXJPZmZzZXRYOiBjZW50ZXJPZmZzZXQsXG4gICAgY2VudGVyT2Zmc2V0WTogY2VudGVyT2Zmc2V0XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../_types';\nexport function makeCirclePaintBinaryMask(size: number): PaintBinaryMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const centerOffset = -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 centerOffsetX: centerOffset,\n centerOffsetY: centerOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUsIHR5cGUgUGFpbnRCaW5hcnlNYXNrIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNpcmNsZVBhaW50QmluYXJ5TWFzayhzaXplOiBudW1iZXIpOiBQYWludEJpbmFyeU1hc2sge1xuICBjb25zdCBhcmVhID0gc2l6ZSAqIHNpemVcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGFyZWEpXG4gIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyXG5cbiAgY29uc3QgY2VudGVyT2Zmc2V0ID0gLU1hdGguY2VpbChyYWRpdXMgLSAwLjUpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNpemU7IHgrKykge1xuICAgICAgY29uc3QgZHggPSB4IC0gcmFkaXVzICsgMC41XG4gICAgICBjb25zdCBkeSA9IHkgLSByYWRpdXMgKyAwLjVcbiAgICAgIGNvbnN0IGRpc3RTcXIgPSBkeCAqIGR4ICsgZHkgKiBkeVxuICAgICAgaWYgKGRpc3RTcXIgPD0gKHJhZGl1cyAqIHJhZGl1cykpIHtcbiAgICAgICAgZGF0YVt5ICogc2l6ZSArIHhdID0gMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIGRhdGEsXG4gICAgdzogc2l6ZSxcbiAgICBoOiBzaXplLFxuICAgIGNlbnRlck9mZnNldFg6IGNlbnRlck9mZnNldCxcbiAgICBjZW50ZXJPZmZzZXRZOiBjZW50ZXJPZmZzZXQsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","// @__INLINE_MACRO__\nexport const macro_halfAndFloor = (value: number) => value >> 1;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQF9fSU5MSU5FX01BQ1JPX19cbmV4cG9ydCBjb25zdCBtYWNyb19oYWxmQW5kRmxvb3IgPSAodmFsdWU6IG51bWJlcikgPT4gdmFsdWUgPj4gMVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_types';\nimport { macro_halfAndFloor } from '../Internal/helpers';\nexport function makePaintBinaryMask(mask: BinaryMask): PaintBinaryMask {\n return {\n type: MaskType.BINARY,\n data: mask.data,\n w: mask.w,\n h: mask.h,\n centerOffsetX: -macro_halfAndFloor(mask.w),\n centerOffsetY: -macro_halfAndFloor(mask.h)\n };\n}\nexport function makePaintAlphaMask(mask: AlphaMask): PaintAlphaMask {\n return {\n type: MaskType.ALPHA,\n data: mask.data,\n w: mask.w,\n h: mask.h,\n centerOffsetX: -macro_halfAndFloor(mask.w),\n centerOffsetY: -macro_halfAndFloor(mask.h)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQmluYXJ5TWFzaywgTWFza1R5cGUsIHR5cGUgUGFpbnRBbHBoYU1hc2ssIHR5cGUgUGFpbnRCaW5hcnlNYXNrIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFjcm9faGFsZkFuZEZsb29yIH0gZnJvbSAnLi4vSW50ZXJuYWwvaGVscGVycydcblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWludEJpbmFyeU1hc2soXG4gIG1hc2s6IEJpbmFyeU1hc2ssXG4pOiBQYWludEJpbmFyeU1hc2sge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkJJTkFSWSxcbiAgICBkYXRhOiBtYXNrLmRhdGEsXG4gICAgdzogbWFzay53LFxuICAgIGg6IG1hc2suaCxcbiAgICBjZW50ZXJPZmZzZXRYOiAtbWFjcm9faGFsZkFuZEZsb29yKG1hc2sudyksXG4gICAgY2VudGVyT2Zmc2V0WTogLW1hY3JvX2hhbGZBbmRGbG9vcihtYXNrLmgpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFpbnRBbHBoYU1hc2soXG4gIG1hc2s6IEFscGhhTWFzayxcbik6IFBhaW50QWxwaGFNYXNrIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5BTFBIQSxcbiAgICBkYXRhOiBtYXNrLmRhdGEsXG4gICAgdzogbWFzay53LFxuICAgIGg6IG1hc2suaCxcbiAgICBjZW50ZXJPZmZzZXRYOiAtbWFjcm9faGFsZkFuZEZsb29yKG1hc2sudyksXG4gICAgY2VudGVyT2Zmc2V0WTogLW1hY3JvX2hhbGZBbmRGbG9vcihtYXNrLmgpLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\nimport { macro_halfAndFloor } from '../Internal/helpers';\nexport function makeRectFalloffPaintAlphaMask(width: number, height: number, fallOff: (d: number) => number = d => d): PaintAlphaMask {\n const fPx = Math.floor(width / 2);\n const fPy = Math.floor(height / 2);\n const invHalfW = 2 / width;\n const invHalfH = 2 / height;\n const offX = width % 2 === 0 ? 0.5 : 0;\n const offY = height % 2 === 0 ? 0.5 : 0;\n const area = width * height;\n const data = new Uint8Array(area);\n for (let y = 0; y < height; y++) {\n const dy = Math.abs(y - fPy + offY) * invHalfH;\n const rowOffset = y * width;\n for (let x = 0; x < width; x++) {\n const dx = Math.abs(x - fPx + offX) * invHalfW;\n\n // Chebyshev distance (square/rect shape)\n const dist = dx > dy ? dx : dy;\n // Pass 1.0 at center, 0.0 at edge\n const strength = fallOff(1 - dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n data[rowOffset + x] = Math.max(0, Math.min(255, intensity));\n }\n }\n }\n return {\n type: MaskType.ALPHA,\n data: data,\n w: width,\n h: height,\n centerOffsetX: -macro_halfAndFloor(width),\n centerOffsetY: -macro_halfAndFloor(height)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUsIHR5cGUgUGFpbnRBbHBoYU1hc2sgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWNyb19oYWxmQW5kRmxvb3IgfSBmcm9tICcuLi9JbnRlcm5hbC9oZWxwZXJzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlY3RGYWxsb2ZmUGFpbnRBbHBoYU1hc2soXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBmYWxsT2ZmOiAoZDogbnVtYmVyKSA9PiBudW1iZXIgPSAoZCkgPT4gZCxcbik6IFBhaW50QWxwaGFNYXNrIHtcbiAgY29uc3QgZlB4ID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpXG4gIGNvbnN0IGZQeSA9IE1hdGguZmxvb3IoaGVpZ2h0IC8gMilcblxuICBjb25zdCBpbnZIYWxmVyA9IDIgLyB3aWR0aFxuICBjb25zdCBpbnZIYWxmSCA9IDIgLyBoZWlnaHRcblxuICBjb25zdCBvZmZYID0gKHdpZHRoICUgMiA9PT0gMCkgPyAwLjUgOiAwXG4gIGNvbnN0IG9mZlkgPSAoaGVpZ2h0ICUgMiA9PT0gMCkgPyAwLjUgOiAwXG5cbiAgY29uc3QgYXJlYSA9IHdpZHRoICogaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhcmVhKVxuXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCBkeSA9IE1hdGguYWJzKCh5IC0gZlB5KSArIG9mZlkpICogaW52SGFsZkhcbiAgICBjb25zdCByb3dPZmZzZXQgPSB5ICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgZHggPSBNYXRoLmFicygoeCAtIGZQeCkgKyBvZmZYKSAqIGludkhhbGZXXG5cbiAgICAgIC8vIENoZWJ5c2hldiBkaXN0YW5jZSAoc3F1YXJlL3JlY3Qgc2hhcGUpXG4gICAgICBjb25zdCBkaXN0ID0gZHggPiBkeSA/IGR4IDogZHlcbiAgICAgIC8vIFBhc3MgMS4wIGF0IGNlbnRlciwgMC4wIGF0IGVkZ2VcbiAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZigxIC0gZGlzdClcbiAgICAgIGlmIChzdHJlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaW50ZW5zaXR5ID0gKHN0cmVuZ3RoICogMjU1KSB8IDBcbiAgICAgICAgZGF0YVtyb3dPZmZzZXQgKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgaW50ZW5zaXR5KSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkFMUEhBLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgdzogd2lkdGgsXG4gICAgaDogaGVpZ2h0LFxuICAgIGNlbnRlck9mZnNldFg6IC1tYWNyb19oYWxmQW5kRmxvb3Iod2lkdGgpLFxuICAgIGNlbnRlck9mZnNldFk6IC1tYWNyb19oYWxmQW5kRmxvb3IoaGVpZ2h0KSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { CANVAS_CTX_FAILED } from '../Canvas/_constants';\nexport type PaintBufferCanvasRenderer = ReturnType<typeof makePaintBufferCanvasRenderer>;\n\n/**\n *\n * @param offscreenCanvasClass - @internal\n */\nexport function makePaintBufferCanvasRenderer(paintBuffer: PaintBuffer, offscreenCanvasClass = OffscreenCanvas) {\n const config = paintBuffer.config;\n const tileSize = config.tileSize;\n const tileShift = config.tileShift;\n const lookup = paintBuffer.lookup;\n const canvas = new offscreenCanvasClass(tileSize, tileSize);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\n return function drawPaintBuffer(targetCtx: CanvasRenderingContext2D, alpha = 255, compOperation: GlobalCompositeOperation = 'source-over'): void {\n targetCtx.globalAlpha = alpha / 255;\n targetCtx.globalCompositeOperation = compOperation;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n ctx.putImageData(tile.imageData, 0, 0);\n targetCtx.drawImage(canvas, dx, dy);\n }\n }\n targetCtx.globalAlpha = 1;\n targetCtx.globalCompositeOperation = 'source-over';\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuLi9DYW52YXMvX2NvbnN0YW50cydcbmltcG9ydCB0eXBlIHsgUGFpbnRCdWZmZXIgfSBmcm9tICcuL1BhaW50QnVmZmVyJ1xuXG5leHBvcnQgdHlwZSBQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZVBhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXI+XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBvZmZzY3JlZW5DYW52YXNDbGFzcyAtIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIoXG4gIHBhaW50QnVmZmVyOiBQYWludEJ1ZmZlcixcbiAgb2Zmc2NyZWVuQ2FudmFzQ2xhc3MgPSBPZmZzY3JlZW5DYW52YXMsXG4pIHtcbiAgY29uc3QgY29uZmlnID0gcGFpbnRCdWZmZXIuY29uZmlnXG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplXG4gIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnRcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwXG4gIGNvbnN0IGNhbnZhcyA9IG5ldyBvZmZzY3JlZW5DYW52YXNDbGFzcyh0aWxlU2l6ZSwgdGlsZVNpemUpXG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpXG4gIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZVxuXG4gIHJldHVybiBmdW5jdGlvbiBkcmF3UGFpbnRCdWZmZXIoXG4gICAgdGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgYWxwaGEgPSAyNTUsXG4gICAgY29tcE9wZXJhdGlvbjogR2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJyxcbiAgKTogdm9pZCB7XG5cbiAgICB0YXJnZXRDdHguZ2xvYmFsQWxwaGEgPSBhbHBoYSAvIDI1NVxuICAgIHRhcmdldEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjb21wT3BlcmF0aW9uXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGlsZSA9IGxvb2t1cFtpXVxuXG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkeCA9IHRpbGUudHggPDwgdGlsZVNoaWZ0XG4gICAgICAgIGNvbnN0IGR5ID0gdGlsZS50eSA8PCB0aWxlU2hpZnRcblxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKHRpbGUuaW1hZ2VEYXRhLCAwLCAwKVxuXG4gICAgICAgIHRhcmdldEN0eC5kcmF3SW1hZ2UoY2FudmFzLCBkeCwgZHkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gMVxuICAgIHRhcmdldEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ=="],"mappings":"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","names":["MaskType","get","makeReusableCanvas","defaults","blendColorPixelData","defaults","blendPixel","defaults","blendPixelData","defaults","blendPixelDataAlphaMask","defaults","blendPixelDataBinaryMask","defaults","fillPixelData","SCRATCH_RECT","defaults","fillPixelData","SCRATCH_RECT","defaults","fillPixelDataBinaryMask","SCRATCH_RECT","defaults","invertPixelData","defaults","applyAlphaMaskToPixelData","defaults","applyBinaryMaskToPixelData","defaults","blendColorPixelDataBinaryMask","blendColorPixelDataAlphaMask","SCRATCH_BLIT","SCRATCH_BLIT","r","g","b","a","SCRATCH_BLIT","SCRATCH_BLIT"]}
|