@esotericsoftware/spine-pixi-v8
Version:
The official Spine Runtimes for PixiJS v8.
129 lines • 21 kB
JavaScript
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated July 28, 2023. Replaces all prior versions.
*
* Copyright (c) 2013-2023, 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, extensions, ExtensionType } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRCYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rhcmt0aW50L0RhcmtUaW50QmF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUNOLE9BQU8sRUFDUCxLQUFLLEVBR0wsVUFBVSxFQUNWLGFBQWEsRUFFYixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsSUFBSSxhQUFhLEdBQWtCLElBQUksQ0FBQztBQUV4Qyw2REFBNkQ7QUFDN0QsTUFBTSxPQUFPLGVBQWdCLFNBQVEsT0FBTztJQUMzQyxjQUFjO0lBQ1AsTUFBTSxDQUFDLFNBQVMsR0FBRztRQUN6QixJQUFJLEVBQUU7WUFDTCxhQUFhLENBQUMsT0FBTztTQUNyQjtRQUNELElBQUksRUFBRSxVQUFVO0tBQ1AsQ0FBQztJQUVKLFFBQVEsR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFDdkMsTUFBTSxHQUFHLGFBQWEsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNqRixJQUFJLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFFN0MsMEdBQTBHO0lBQ25HLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFZixjQUFjLENBQ3BCLE9BQTRELEVBQzVELFdBQXlCLEVBQ3pCLFVBQXVCLEVBQ3ZCLEtBQWEsRUFDYixTQUFpQjtRQUVqQixNQUFNLGlCQUFpQixHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUU3RSxNQUFNLEVBQUUs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QUFHLENBQUMsRUFBRSxDQUFDO1FBRWpDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQ25DLFVBQVUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7UUFFM0MsS0FBSztRQUNMLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25ELFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRW5ELFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxXQUFXLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFFakMsVUFBVSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDOUIsVUFBVSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDbkMsVUFBVSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztJQUM1QyxDQUFDOztBQUdGLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEp1bHkgMjgsIDIwMjMuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMywgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvclxuICogb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRIRVxuICogU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7XG5cdEJhdGNoZXIsXG5cdENvbG9yLFxuXHREZWZhdWx0QmF0Y2hhYmxlTWVzaEVsZW1lbnQsXG5cdERlZmF1bHRCYXRjaGFibGVRdWFkRWxlbWVudCxcblx0ZXh0ZW5zaW9ucyxcblx0RXh0ZW5zaW9uVHlwZSxcblx0U2hhZGVyXG59IGZyb20gJ3BpeGkuanMnO1xuaW1wb3J0IHsgRGFya1RpbnRCYXRjaEdlb21ldHJ5IH0gZnJvbSAnLi9EYXJrVGludEJhdGNoR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgRGFya1RpbnRTaGFkZXIgfSBmcm9tICcuL0RhcmtUaW50U2hhZGVyLmpzJztcblxubGV0IGRlZmF1bHRTaGFkZXI6IFNoYWRlciB8IG51bGwgPSBudWxsO1xuXG4vKiogVGhlIGRlZmF1bHQgYmF0Y2hlciBpcyB1c2VkIHRvIGJhdGNoIHF1YWRzIGFuZCBtZXNoZXMuICovXG5leHBvcnQgY2xhc3MgRGFya1RpbnRCYXRjaGVyIGV4dGVuZHMgQmF0Y2hlciB7XG5cdC8qKiBAaWdub3JlICovXG5cdHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uID0ge1xuXHRcdHR5cGU6IFtcblx0XHRcdEV4dGVuc2lvblR5cGUuQmF0Y2hlcixcblx0XHRdLFxuXHRcdG5hbWU6ICdkYXJrVGludCcsXG5cdH0gYXMgY29uc3Q7XG5cblx0cHVibGljIGdlb21ldHJ5ID0gbmV3IERhcmtUaW50QmF0Y2hHZW9tZXRyeSgpO1xuXHRwdWJsaWMgc2hhZGVyID0gZGVmYXVsdFNoYWRlciB8fCAoZGVmYXVsdFNoYWRlciA9IG5ldyBEYXJrVGludFNoYWRlcih0aGlzLm1heFRleHR1cmVzKSk7XG5cdHB1YmxpYyBuYW1lID0gRGFya1RpbnRCYXRjaGVyLmV4dGVuc2lvbi5uYW1lO1xuXG5cdC8qKiBUaGUgc2l6ZSBvZiBvbmUgYXR0cmlidXRlLiAxID0gMzIgYml0LiB4LCB5LCB1LCB2LCBjb2xvciwgZGFya0NvbG9yLCB0ZXh0dXJlSWRBbmRSb3VuZCAtPiB0b3RhbCA9IDcgKi9cblx0cHVibGljIHZlcnRleFNpemUgPSA3O1xuXG5cdHB1YmxpYyBwYWNrQXR0cmlidXRlcyAoXG5cdFx0ZWxlbWVudDogRGVmYXVsdEJhdGNoYWJsZU1lc2hFbGVtZW50ICYgeyBkYXJrQ29sb3I6IG51bWJlciB9LFxuXHRcdGZsb2F0MzJWaWV3OiBGbG9hdDMyQXJyYXksXG5cdFx0dWludDMyVmlldzogVWludDMyQXJyYXksXG5cdFx0aW5kZXg6IG51bWJlcixcblx0XHR0ZXh0dXJlSWQ6IG51bWJlclxuXHQpIHtcblx0XHRjb25zdCB0ZXh0dXJlSWRBbmRSb3VuZCA9ICh0ZXh0dXJlSWQgPDwgMTYpIHwgKGVsZW1lbnQucm91bmRQaXhlbHMgJiAweEZGRkYpO1xuXG5cdFx0Y29uc3Qgd3QgPSBlbGVtZW50LnRyYW5zZm9ybTtcblxuXHRcdGNvbnN0IGEgPSB3dC5hO1xuXHRcdGNvbnN0IGIgPSB3dC5iO1xuXHRcdGNvbnN0IGMgPSB3dC5jO1xuXHRcdGNvbnN0IGQgPSB3dC5kO1xuXHRcdGNvbnN0IHR4ID0gd3QudHg7XG5cdFx0Y29uc3QgdHkgPSB3dC50eTtcblxuXHRcdGNvbnN0IHsgcG9zaXRpb25zLCB1dnMgfSA9IGVsZW1lbnQ7XG5cblx0XHRjb25zdCBhcmdiID0gZWxlbWVudC5jb2xvcjtcblx0XHRjb25zdCB3b3JsZEFscGhhID0gKChhcmdiID4+IDI0KSAmIDB4RkYpIC8gMjU1O1xuXHRcdGNvbnN0IGRhcmtDb2xvciA9IENvbG9yLnNoYXJlZC5zZXRWYWx1ZShlbGVtZW50LmRhcmtDb2xvcikucHJlbXVsdGlwbHkod29ybGRBbHBoYSwgdHJ1ZSkudG9QcmVtdWx0aXBsaWVkKDEsIGZhbHNlKTtcblxuXHRcdGNvbnN0IG9mZnNldCA9IGVsZW1lbnQuYXR0cmlidXRlT2Zmc2V0O1xuXHRcdGNvbnN0IGVuZCA9IG9mZnNldCArIGVsZW1lbnQuYXR0cmlidXRlU2l6ZTtcblxuXHRcdGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykge1xuXHRcdFx0Y29uc3QgaTIgPSBpICogMjtcblxuXHRcdFx0Y29uc3QgeCA9IHBvc2l0aW9uc1tpMl07XG5cdFx0XHRjb25zdCB5ID0gcG9zaXRpb25zWyhpMikgKyAxXTtcblxuXHRcdFx0ZmxvYXQzMlZpZXdbaW5kZXgrK10gPSAoYSAqIHgpICsgKGMgKiB5KSArIHR4O1xuXHRcdFx0ZmxvYXQzMlZpZXdbaW5kZXgrK10gPSAoZCAqIHkpICsgKGIgKiB4KSArIHR5O1xuXG5cdFx0XHRmbG9hdDMyVmlld1tpbmRleCsrXSA9IHV2c1tpMl07XG5cdFx0XHRmbG9hdDMyVmlld1tpbmRleCsrXSA9IHV2c1soaTIpICsgMV07XG5cblx0XHRcdHVpbnQzMlZpZXdbaW5kZXgrK10gPSBhcmdiO1xuXHRcdFx0dWludDMyVmlld1tpbmRleCsrXSA9IGRhcmtDb2xvcjtcblxuXHRcdFx0dWludDMyVmlld1tpbmRleCsrXSA9IHRleHR1cmVJZEFuZFJvdW5kO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBwYWNrUXVhZEF0dHJpYnV0ZXMgKFxuXHRcdGVsZW1lbnQ6IERlZmF1bHRCYXRjaGFibGVRdWFkRWxlbWVudCAmIHsgZGFya0NvbG9yOiBudW1iZXIgfSxcblx0XHRmbG9hdDMyVmlldzogRmxvYXQzMkFycmF5LFxuXHRcdHVpbnQzMlZpZXc6IFVpbnQzMkFycmF5LFxuXHRcdGluZGV4OiBudW1iZXIsXG5cdFx0dGV4dHVyZUlkOiBudW1iZXJcblx0KSB7XG5cdFx0Y29uc3QgdGV4dHVyZSA9IGVsZW1lbnQudGV4dHVyZTtcblxuXHRcdGNvbnN0IHd0ID0gZWxlbWVudC50cmFuc2Zvcm07XG5cblx0XHRjb25zdCBhID0gd3QuYTtcblx0XHRjb25zdCBiID0gd3QuYjtcblx0XHRjb25zdCBjID0gd3QuYztcblx0XHRjb25zdCBkID0gd3QuZDtcblx0XHRjb25zdCB0eCA9IHd0LnR4O1xuXHRcdGNvbnN0IHR5ID0gd3QudHk7XG5cblx0XHRjb25zdCBib3VuZHMgPSBlbGVtZW50LmJvdW5kcztcblxuXHRcdGNvbnN0IHcwID0gYm91bmRzLm1heFg7XG5cdFx0Y29uc3QgdzEgPSBib3VuZHMubWluWDtcblx0XHRjb25zdCBoMCA9IGJvdW5kcy5tYXhZO1xuXHRcdGNvbnN0IGgxID0gYm91bmRzLm1pblk7XG5cblx0XHRjb25zdCB1dnMgPSB0ZXh0dXJlLnV2cztcblxuXHRcdC8vIF8gXyBfIF9cblx0XHQvLyBhIGIgZyByXG5cdFx0Y29uc3QgYXJnYiA9IGVsZW1lbnQuY29sb3I7XG5cdFx0Y29uc3QgZGFya0NvbG9yID0gZWxlbWVudC5kYXJrQ29sb3I7XG5cblx0XHRjb25zdCB0ZXh0dXJlSWRBbmRSb3VuZCA9ICh0ZXh0dXJlSWQgPDwgMTYpIHwgKGVsZW1lbnQucm91bmRQaXhlbHMgJiAweEZGRkYpO1xuXG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAwXSA9IChhICogdzEpICsgKGMgKiBoMSkgKyB0eDtcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDFdID0gKGQgKiBoMSkgKyAoYiAqIHcxKSArIHR5O1xuXG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAyXSA9IHV2cy54MDtcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDNdID0gdXZzLnkwO1xuXG5cdFx0dWludDMyVmlld1tpbmRleCArIDRdID0gYXJnYjtcblx0XHR1aW50MzJWaWV3W2luZGV4ICsgNV0gPSBkYXJrQ29sb3I7XG5cdFx0dWludDMyVmlld1tpbmRleCArIDZdID0gdGV4dHVyZUlkQW5kUm91bmQ7XG5cblx0XHQvLyB4eVxuXHRcdGZsb2F0MzJWaWV3W2luZGV4ICsgN10gPSAoYSAqIHcwKSArIChjICogaDEpICsgdHg7XG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyA4XSA9IChkICogaDEpICsgKGIgKiB3MCkgKyB0eTtcblxuXHRcdGZsb2F0MzJWaWV3W2luZGV4ICsgOV0gPSB1dnMueDE7XG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAxMF0gPSB1dnMueTE7XG5cblx0XHR1aW50MzJWaWV3W2luZGV4ICsgMTFdID0gYXJnYjtcblx0XHR1aW50MzJWaWV3W2luZGV4ICsgMTJdID0gZGFya0NvbG9yO1xuXHRcdHVpbnQzMlZpZXdbaW5kZXggKyAxM10gPSB0ZXh0dXJlSWRBbmRSb3VuZDtcblxuXHRcdC8vIHh5XG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAxNF0gPSAoYSAqIHcwKSArIChjICogaDApICsgdHg7XG5cdFx0ZmxvYXQzMlZpZXdbaW5kZXggKyAxNV0gPSAoZCAqIGgwKSArIChiICogdzApICsgdHk7XG5cblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDE2XSA9IHV2cy54Mjtcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDE3XSA9IHV2cy55MjtcblxuXHRcdHVpbnQzMlZpZXdbaW5kZXggKyAxOF0gPSBhcmdiO1xuXHRcdHVpbnQzMlZpZXdbaW5kZXggKyAxOV0gPSBkYXJrQ29sb3I7XG5cdFx0dWludDMyVmlld1tpbmRleCArIDIwXSA9IHRleHR1cmVJZEFuZFJvdW5kO1xuXG5cdFx0Ly8geHlcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDIxXSA9IChhICogdzEpICsgKGMgKiBoMCkgKyB0eDtcblx0XHRmbG9hdDMyVmlld1tpbmRleCArIDIyXSA9IChkICogaDApICsgKGIgKiB3MSkgKyB0eTtcblxuXHRcdGZsb2F0MzJWaWV3W2luZGV4ICsgMjNdID0gdXZzLngzO1xuXHRcdGZsb2F0MzJWaWV3W2luZGV4ICsgMjRdID0gdXZzLnkzO1xuXG5cdFx0dWludDMyVmlld1tpbmRleCArIDI1XSA9IGFyZ2I7XG5cdFx0dWludDMyVmlld1tpbmRleCArIDI2XSA9IGRhcmtDb2xvcjtcblx0XHR1aW50MzJWaWV3W2luZGV4ICsgMjddID0gdGV4dHVyZUlkQW5kUm91bmQ7XG5cdH1cbn1cblxuZXh0ZW5zaW9ucy5hZGQoRGFya1RpbnRCYXRjaGVyKTtcbiJdfQ==