UNPKG

@esotericsoftware/spine-pixi-v8

Version:
129 lines 21 kB
/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Batcher, Color, ExtensionType, extensions } from 'pixi.js'; import { DarkTintBatchGeometry } from './DarkTintBatchGeometry.js'; import { DarkTintShader } from './DarkTintShader.js'; let defaultShader = null; /** The default batcher is used to batch quads and meshes. */ export class DarkTintBatcher extends Batcher { /** @ignore */ static extension = { type: [ ExtensionType.Batcher, ], name: 'darkTint', }; geometry = new DarkTintBatchGeometry(); shader = defaultShader || (defaultShader = new DarkTintShader(this.maxTextures)); name = DarkTintBatcher.extension.name; /** The size of one attribute. 1 = 32 bit. x, y, u, v, color, darkColor, textureIdAndRound -> total = 7 */ vertexSize = 7; packAttributes(element, float32View, uint32View, index, textureId) { const textureIdAndRound = (textureId << 16) | (element.roundPixels & 0xFFFF); const wt = element.transform; const a = wt.a; const b = wt.b; const c = wt.c; const d = wt.d; const tx = wt.tx; const ty = wt.ty; const { positions, uvs } = element; const argb = element.color; const worldAlpha = ((argb >> 24) & 0xFF) / 255; const darkColor = Color.shared.setValue(element.darkColor).premultiply(worldAlpha, true).toPremultiplied(1, false); const offset = element.attributeOffset; const end = offset + element.attributeSize; for (let i = offset; i < end; i++) { const i2 = i * 2; const x = positions[i2]; const y = positions[(i2) + 1]; float32View[index++] = (a * x) + (c * y) + tx; float32View[index++] = (d * y) + (b * x) + ty; float32View[index++] = uvs[i2]; float32View[index++] = uvs[(i2) + 1]; uint32View[index++] = argb; uint32View[index++] = darkColor; uint32View[index++] = textureIdAndRound; } } packQuadAttributes(element, float32View, uint32View, index, textureId) { const texture = element.texture; const wt = element.transform; const a = wt.a; const b = wt.b; const c = wt.c; const d = wt.d; const tx = wt.tx; const ty = wt.ty; const bounds = element.bounds; const w0 = bounds.maxX; const w1 = bounds.minX; const h0 = bounds.maxY; const h1 = bounds.minY; const uvs = texture.uvs; // _ _ _ _ // a b g r const argb = element.color; const darkColor = element.darkColor; const textureIdAndRound = (textureId << 16) | (element.roundPixels & 0xFFFF); float32View[index + 0] = (a * w1) + (c * h1) + tx; float32View[index + 1] = (d * h1) + (b * w1) + ty; float32View[index + 2] = uvs.x0; float32View[index + 3] = uvs.y0; uint32View[index + 4] = argb; uint32View[index + 5] = darkColor; uint32View[index + 6] = textureIdAndRound; // xy float32View[index + 7] = (a * w0) + (c * h1) + tx; float32View[index + 8] = (d * h1) + (b * w0) + ty; float32View[index + 9] = uvs.x1; float32View[index + 10] = uvs.y1; uint32View[index + 11] = argb; uint32View[index + 12] = darkColor; uint32View[index + 13] = textureIdAndRound; // xy float32View[index + 14] = (a * w0) + (c * h0) + tx; float32View[index + 15] = (d * h0) + (b * w0) + ty; float32View[index + 16] = uvs.x2; float32View[index + 17] = uvs.y2; uint32View[index + 18] = argb; uint32View[index + 19] = darkColor; uint32View[index + 20] = textureIdAndRound; // xy float32View[index + 21] = (a * w1) + (c * h0) + tx; float32View[index + 22] = (d * h0) + (b * w1) + ty; float32View[index + 23] = uvs.x3; float32View[index + 24] = uvs.y3; uint32View[index + 25] = argb; uint32View[index + 26] = darkColor; uint32View[index + 27] = textureIdAndRound; } } extensions.add(DarkTintBatcher); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRCYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rhcmt0aW50L0RhcmtUaW50QmF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUNOLE9BQU8sRUFDUCxLQUFLLEVBR0wsYUFBYSxFQUNiLFVBQVUsRUFFVixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsSUFBSSxhQUFhLEdBQWtCLElBQUksQ0FBQztBQUV4Qyw2REFBNkQ7QUFDN0QsTUFBTSxPQUFPLGVBQWdCLFNBQVEsT0FBTztJQUMzQyxjQUFjO0lBQ1AsTUFBTSxDQUFDLFNBQVMsR0FBRztRQUN6QixJQUFJLEVBQUU7WUFDTCxhQUFhLENBQUMsT0FBTztTQUNyQjtRQUNELElBQUksRUFBRSxVQUFVO0tBQ1AsQ0FBQztJQUVKLFFBQVEsR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFDdkMsTUFBTSxHQUFHLGFBQWEsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNqRixJQUFJLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFFN0MsMEdBQTBHO0lBQ25HLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFZixjQUFjLENBQ3BCLE9BQTRELEVBQzVELFdBQXlCLEVBQ3pCLFVBQXVCLEVBQ3ZCLEtBQWEsRUFDYixTQUFpQjtRQUVqQixNQUFNLGlCQUFpQixHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUU3RSxNQUFNLEVBQUUs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QUFHLENBQUMsRUFBRSxDQUFDO1FBRWpDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQ25DLFVBQVUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7UUFFM0MsS0FBSztRQUNMLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25ELFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRW5ELFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxXQUFXLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFFakMsVUFBVSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDOUIsVUFBVSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDbkMsVUFBVSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztJQUM1QyxDQUFDOztBQUdGLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7XG5cdEJhdGNoZXIsXG5cdENvbG9yLFxuXHR0eXBlIERlZmF1bHRCYXRjaGFibGVNZXNoRWxlbWVudCxcblx0dHlwZSBEZWZhdWx0QmF0Y2hhYmxlUXVhZEVsZW1lbnQsXG5cdEV4dGVuc2lvblR5cGUsXG5cdGV4dGVuc2lvbnMsXG5cdHR5cGUgU2hhZGVyXG59IGZyb20gJ3BpeGkuanMnO1xuaW1wb3J0IHsgRGFya1RpbnRCYXRjaEdlb21ldHJ5IH0gZnJvbSAnLi9EYXJrVGludEJhdGNoR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgRGFya1RpbnRTaGFkZXIgfSBmcm9tICcuL0RhcmtUaW50U2hhZGVyLmpzJztcblxubGV0IGRlZmF1bHRTaGFkZXI6IFNoYWRlciB8IG51bGwgPSBudWxsO1xuXG4vKiogVGhlIGRlZmF1bHQgYmF0Y2hlciBpcyB1c2VkIHRvIGJhdGNoIHF1YWRzIGFuZCBtZXNoZXMuICovXG5leHBvcnQgY2xhc3MgRGFya1RpbnRCYXRjaGVyIGV4dGVuZHMgQmF0Y2hlciB7XG5cdC8qKiBAaWdub3JlICovXG5cdHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uID0ge1xuXHRcdHR5cGU6IFtcblx0XHRcdEV4dGVuc2lvblR5cGUuQmF0Y2hlcixcblx0XHRdLFxuXHRcdG5hbWU6ICdkYXJrVGludCcsXG5cdH0gYXMgY29uc3Q7XG5cblx0cHVibGljIGdlb21ldHJ5ID0gbmV3IERhcmtUaW50QmF0Y2hHZW9tZXRyeSgpO1xuXHRwdWJsaWMgc2hhZGVyID0gZGVmYXVsdFNoYWRlciB8fCAoZGVmYXVsdFNoYWRlciA9IG5ldyBEYXJrVGludFNoYWRlcih0aGlzLm1heFRleHR1cmVzKSk7XG5cdHB1YmxpYyBuYW1lID0gRGFya1RpbnRCYXRjaGVyLmV4dGVuc2lvbi5uYW1lO1xuXG5cdC8qKiBUaGUgc2l6ZSBvZiBvbmUgYXR0cmlidXRlLiAxID0gMzIgYml0LiB4LCB5LCB1LCB2LCBjb2xvciwgZGFya0NvbG9yLCB0ZXh0dXJlSWRBbmRSb3VuZCAtPiB0b3RhbCA9IDcgKi9cblx0cHVibGljIHZlcnRleFNpemUgPSA3O1xuXG5cdHB1YmxpYyBwYWNrQXR0cmlidXRlcyAoXG5cdFx0ZWxlbWVudDogRGVmYXVsdEJhdGNoYWJsZU1lc2hFbGVtZW50ICYgeyBkYXJrQ29sb3I6IG51bWJlciB9LFxuXHRcdGZsb2F0MzJWaWV3OiBGbG9hdDMyQXJyYXksXG5cdFx0dWludDMyVmlldzogVWludDMyQXJyYXksXG5cdFx0aW5kZXg6IG51bWJlcixcblx0XHR0ZXh0dXJlSWQ6IG51bWJlclxuXHQpIHtcblx0XHRjb25zdCB0ZXh0dXJlSWRBbmRSb3VuZCA9ICh0ZXh0dXJlSWQgPDwgMTYpIHwgKGVsZW1lbnQucm91bmRQaXhlbHMgJiAweEZGRkYpO1xuXG5cdFx0Y29uc3Qgd3QgPSBlbGVtZW50LnRyYW5zZm9ybTtcblxuXHRcdGNvbnN0IGEgPSB3dC5hO1xuXHRcdGNvbnN0IGIgPSB3dC5iO1xuXHRcdGNvbnN0IGMgPSB3dC5jO1xuXHRcdGNvbnN0IGQgPSB3dC5kO1xuXHRcdGNvbnN0IHR4ID0gd3QudHg7XG5cdFx0Y29uc3QgdHkgPSB3dC50eTtcblxuXHRcdGNvbnN0IHsgcG9zaXRpb25zLCB1dnMgfSA9IGVsZW1lbnQ7XG5cblx0XHRjb25zdCBhcmdiID0gZWxlbWVudC5jb2xvcjtcblx0XHRjb25zdCB3b3JsZEFscGhhID0gKChhcmdiID4+IDI0KSAmIDB4RkYpIC8gMjU1O1xuXHRcdGNvbnN0IGRhcmtDb2xvciA9IENvbG9yLnNoYXJlZC5zZXRWYWx1ZShlbGVtZW50LmRhcmtDb2xvcikucHJlbXVsdGlwbHkod29ybGRBbHBoYSwgdHJ1ZSkudG9QcmVtdWx0aXBsaWVkKDEsIGZhbHNlKTtcblxuXHRcdGNvbnN0IG9mZnNldCA9IGVsZW1lbnQuYXR0cmlidXRlT2Zmc2V0O1xuXHRcdGNvbnN0IGVuZCA9IG9mZnNldCArIGVsZW1lbnQuYXR0cmlidXRlU2l6ZTtcblxuXHRcdGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykge1xuXHRcdFx0Y29uc3QgaTIgPSBpICogMjtcblxuXHRcdFx0Y29uc3QgeCA9IHBvc2l0aW9uc1tpMl07XG5cdFx0XHRjb25zdCB5ID0gcG9zaXRpb25zWyhpMikgKyAxXTtcblxuXHRcdFx0ZmxvYXQzMlZpZXdbaW5kZXgrK10gPSAoYSAqIHgpICsgKGMgKiB5KSArIHR4O1xuXHRcdFx0ZmxvYXQzMlZpZXdbaW5kZXgrK10gPSAoZCAqIHkpICsgKGIgKiB4KSArIHR5O1xuXG5cdFx0XHRmbG9hdDMyVmlld1tpbmRleCsrXSA9IHV2c1tpMl07XG5cdFx0XHRmbG9hdDMyVmlld1tpbmRleCsrXSA9IHV2c1soaTIpICsgMV07XG5cblx0XHRcdHVpbnQzMlZpZXdbaW5kZXgrK10gPSBhcmdiO1xuXHRcdFx0dWludDMyVmlld1tpbmRleCsrXSA9IGRhcmtDb2xvcjtcblxuXHRcdFx0dWludDMyVmlld1tpbmRleCsrXSA9IHRleHR1cmVJZEFuZFJvdW5kO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBwYWNrUXVhZEF0dHJpYnV0ZXMgKFxuXHRcdGVsZW1lbnQ6IERlZmF1bHRCYXRjaGFibGVRdWFkRWxlbWVudCAmIHsgZGFya0NvbG9yOiBudW1iZXIgfSxcblx0XHRmbG9hdDMyVmlldzogRmxvYXQzMkFycmF5LFxuXHRcdHVpbnQzMlZpZXc6IFVpbnQzMkFycmF5LFxuXHRcdGluZGV4OiBudW1iZXIsXG5cdFx0dGV4dHVyZUlkOiBudW1iZXJcblx0KSB7XG5cdFx0Y29uc3QgdGV4dHVyZSA9IGVsZW1lbnQudGV4dHVyZTtcblxuXHRcdGNvbnN0IHd0ID0gZWxlbWVudC50cmFuc2Zvcm07XG5cblx0XHRjb25zdCBhID0gd3QuYTtcblx0XHRjb25zdCBiID0gd3QuYjtcblx0XHRjb25zdCBjID0gd3QuYztcblx0XHRjb25zdCBkID0gd3QuZDtcblx0XHRjb25zdCB0eCA9IHd0LnR4O1xuXHRcdGNvbnN0IHR5ID0gd3QudHk7XG5cblx0XHRjb25zdCBib3VuZHMgPSBlbGVtZW50LmJvdW5kcztcblxuXHRcdGNvbnN0IHcwID0gYm91bmRzLm1heFg7XG5cdFx0Y29uc3QgdzEgPSBib3VuZHMubWluWDtcblx0XHRjb25zdCBoMCA9IGJvdW5kcy5tYXhZO1xuXHRcdGNvbnN0IGgxID0gYm91bmRzLm1pblk7XG5cblx0XHRjb25zdCB1dnMgPSB0ZXh0dXJlLnV2cztcblxuXHRcdC8vIF8gXyBfIF9cblx0XHQvLyBhIGIgZyByXG5cdFx0Y29uc3QgYXJnYiA9IGVsZW1lbnQuY29sb3I7XG5cdFx0Y29uc3QgZGFya0NvbG9yID0gZWxlbWVudC5kYXJrQ29sb3I7XG5cblx0XHRjb25zdCB0ZXh0dXJlSWRBbmRSb3VuZCA9ICh0ZXh0dXJlSWQgPDwgMTYpIHwgKGVsZW1lbnQucm91bmRQaXhlbHMgJiAweEZGRkYpO1xuXG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAwXSA9IChhICogdzEpICsgKGMgKiBoMSkgKyB0eDtcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDFdID0gKGQgKiBoMSkgKyAoYiAqIHcxKSArIHR5O1xuXG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAyXSA9IHV2cy54MDtcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDNdID0gdXZzLnkwO1xuXG5cdFx0dWludDMyVmlld1tpbmRleCArIDRdID0gYXJnYjtcblx0XHR1aW50MzJWaWV3W2luZGV4ICsgNV0gPSBkYXJrQ29sb3I7XG5cdFx0dWludDMyVmlld1tpbmRleCArIDZdID0gdGV4dHVyZUlkQW5kUm91bmQ7XG5cblx0XHQvLyB4eVxuXHRcdGZsb2F0MzJWaWV3W2luZGV4ICsgN10gPSAoYSAqIHcwKSArIChjICogaDEpICsgdHg7XG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyA4XSA9IChkICogaDEpICsgKGIgKiB3MCkgKyB0eTtcblxuXHRcdGZsb2F0MzJWaWV3W2luZGV4ICsgOV0gPSB1dnMueDE7XG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAxMF0gPSB1dnMueTE7XG5cblx0XHR1aW50MzJWaWV3W2luZGV4ICsgMTFdID0gYXJnYjtcblx0XHR1aW50MzJWaWV3W2luZGV4ICsgMTJdID0gZGFya0NvbG9yO1xuXHRcdHVpbnQzMlZpZXdbaW5kZXggKyAxM10gPSB0ZXh0dXJlSWRBbmRSb3VuZDtcblxuXHRcdC8vIHh5XG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAxNF0gPSAoYSAqIHcwKSArIChjICogaDApICsgdHg7XG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAxNV0gPSAoZCAqIGgwKSArIChiICogdzApICsgdHk7XG5cblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDE2XSA9IHV2cy54Mjtcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDE3XSA9IHV2cy55MjtcblxuXHRcdHVpbnQzMlZpZXdbaW5kZXggKyAxOF0gPSBhcmdiO1xuXHRcdHVpbnQzMlZpZXdbaW5kZXggKyAxOV0gPSBkYXJrQ29sb3I7XG5cdFx0dWludDMyVmlld1tpbmRleCArIDIwXSA9IHRleHR1cmVJZEFuZFJvdW5kO1xuXG5cdFx0Ly8geHlcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDIxXSA9IChhICogdzEpICsgKGMgKiBoMCkgKyB0eDtcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDIyXSA9IChkICogaDApICsgKGIgKiB3MSkgKyB0eTtcblxuXHRcdGZsb2F0MzJWaWV3W2luZGV4ICsgMjNdID0gdXZzLngzO1xuXHRcdGZsb2F0MzJWaWV3W2luZGV4ICsgMjRdID0gdXZzLnkzO1xuXG5cdFx0dWludDMyVmlld1tpbmRleCArIDI1XSA9IGFyZ2I7XG5cdFx0dWludDMyVmlld1tpbmRleCArIDI2XSA9IGRhcmtDb2xvcjtcblx0XHR1aW50MzJWaWV3W2luZGV4ICsgMjddID0gdGV4dHVyZUlkQW5kUm91bmQ7XG5cdH1cbn1cblxuZXh0ZW5zaW9ucy5hZGQoRGFya1RpbnRCYXRjaGVyKTtcbiJdfQ==