ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
349 lines • 31.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, 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.
*
* THIS SOFTWARE IS 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 THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { Utils, Color } from "../Utils";
import { Attachment } from "./Attachment";
export class RegionAttachment extends Attachment {
/**
* @param {?} name
*/
constructor(name) {
super(name);
this.x = 0;
this.y = 0;
this.scaleX = 1;
this.scaleY = 1;
this.rotation = 0;
this.width = 0;
this.height = 0;
this.color = new Color(1, 1, 1, 1);
this.offset = Utils.newFloatArray(8);
this.uvs = Utils.newFloatArray(8);
this.tempColor = new Color(1, 1, 1, 1);
}
/**
* @return {?}
*/
updateOffset() {
/** @type {?} */
let regionScaleX = (this.width / this.region.originalWidth) * this.scaleX;
/** @type {?} */
let regionScaleY = (this.height / this.region.originalHeight) * this.scaleY;
/** @type {?} */
let localX = (-this.width / 2) * this.scaleX + this.region.offsetX * regionScaleX;
/** @type {?} */
let localY = (-this.height / 2) * this.scaleY + this.region.offsetY * regionScaleY;
/** @type {?} */
let localX2 = localX + this.region.width * regionScaleX;
/** @type {?} */
let localY2 = localY + this.region.height * regionScaleY;
/** @type {?} */
let radians = (this.rotation * Math.PI) / 180;
/** @type {?} */
let cos = Math.cos(radians);
/** @type {?} */
let sin = Math.sin(radians);
/** @type {?} */
let localXCos = localX * cos + this.x;
/** @type {?} */
let localXSin = localX * sin;
/** @type {?} */
let localYCos = localY * cos + this.y;
/** @type {?} */
let localYSin = localY * sin;
/** @type {?} */
let localX2Cos = localX2 * cos + this.x;
/** @type {?} */
let localX2Sin = localX2 * sin;
/** @type {?} */
let localY2Cos = localY2 * cos + this.y;
/** @type {?} */
let localY2Sin = localY2 * sin;
/** @type {?} */
let offset = this.offset;
offset[RegionAttachment.OX1] = localXCos - localYSin;
offset[RegionAttachment.OY1] = localYCos + localXSin;
offset[RegionAttachment.OX2] = localXCos - localY2Sin;
offset[RegionAttachment.OY2] = localY2Cos + localXSin;
offset[RegionAttachment.OX3] = localX2Cos - localY2Sin;
offset[RegionAttachment.OY3] = localY2Cos + localX2Sin;
offset[RegionAttachment.OX4] = localX2Cos - localYSin;
offset[RegionAttachment.OY4] = localYCos + localX2Sin;
}
/**
* @param {?} region
* @return {?}
*/
setRegion(region) {
this.region = region;
/** @type {?} */
let uvs = this.uvs;
if (region.rotate) {
uvs[2] = region.u;
uvs[3] = region.v2;
uvs[4] = region.u;
uvs[5] = region.v;
uvs[6] = region.u2;
uvs[7] = region.v;
uvs[0] = region.u2;
uvs[1] = region.v2;
}
else {
uvs[0] = region.u;
uvs[1] = region.v2;
uvs[2] = region.u;
uvs[3] = region.v;
uvs[4] = region.u2;
uvs[5] = region.v;
uvs[6] = region.u2;
uvs[7] = region.v2;
}
}
/**
* @param {?} bone
* @param {?} worldVertices
* @param {?} offset
* @param {?} stride
* @return {?}
*/
computeWorldVertices(bone, worldVertices, offset, stride) {
/** @type {?} */
let vertexOffset = this.offset;
/** @type {?} */
let x = bone.worldX;
/** @type {?} */
let y = bone.worldY;
/** @type {?} */
let a = bone.a;
/** @type {?} */
let b = bone.b;
/** @type {?} */
let c = bone.c;
/** @type {?} */
let d = bone.d;
/** @type {?} */
let offsetX = 0;
/** @type {?} */
let offsetY = 0;
offsetX = vertexOffset[RegionAttachment.OX1];
offsetY = vertexOffset[RegionAttachment.OY1];
worldVertices[offset] = offsetX * a + offsetY * b + x; // br
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
offset += stride;
offsetX = vertexOffset[RegionAttachment.OX2];
offsetY = vertexOffset[RegionAttachment.OY2];
worldVertices[offset] = offsetX * a + offsetY * b + x; // bl
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
offset += stride;
offsetX = vertexOffset[RegionAttachment.OX3];
offsetY = vertexOffset[RegionAttachment.OY3];
worldVertices[offset] = offsetX * a + offsetY * b + x; // ul
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
offset += stride;
offsetX = vertexOffset[RegionAttachment.OX4];
offsetY = vertexOffset[RegionAttachment.OY4];
worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
}
/**
* @return {?}
*/
copy() {
/** @type {?} */
let copy = new RegionAttachment(name);
copy.region = this.region;
copy.rendererObject = this.rendererObject;
copy.path = this.path;
copy.x = this.x;
copy.y = this.y;
copy.scaleX = this.scaleX;
copy.scaleY = this.scaleY;
copy.rotation = this.rotation;
copy.width = this.width;
copy.height = this.height;
Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8);
Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8);
copy.color.setFromColor(this.color);
return copy;
}
}
RegionAttachment.OX1 = 0;
RegionAttachment.OY1 = 1;
RegionAttachment.OX2 = 2;
RegionAttachment.OY2 = 3;
RegionAttachment.OX3 = 4;
RegionAttachment.OY3 = 5;
RegionAttachment.OX4 = 6;
RegionAttachment.OY4 = 7;
RegionAttachment.X1 = 0;
RegionAttachment.Y1 = 1;
RegionAttachment.C1R = 2;
RegionAttachment.C1G = 3;
RegionAttachment.C1B = 4;
RegionAttachment.C1A = 5;
RegionAttachment.U1 = 6;
RegionAttachment.V1 = 7;
RegionAttachment.X2 = 8;
RegionAttachment.Y2 = 9;
RegionAttachment.C2R = 10;
RegionAttachment.C2G = 11;
RegionAttachment.C2B = 12;
RegionAttachment.C2A = 13;
RegionAttachment.U2 = 14;
RegionAttachment.V2 = 15;
RegionAttachment.X3 = 16;
RegionAttachment.Y3 = 17;
RegionAttachment.C3R = 18;
RegionAttachment.C3G = 19;
RegionAttachment.C3B = 20;
RegionAttachment.C3A = 21;
RegionAttachment.U3 = 22;
RegionAttachment.V3 = 23;
RegionAttachment.X4 = 24;
RegionAttachment.Y4 = 25;
RegionAttachment.C4R = 26;
RegionAttachment.C4G = 27;
RegionAttachment.C4B = 28;
RegionAttachment.C4A = 29;
RegionAttachment.U4 = 30;
RegionAttachment.V4 = 31;
if (false) {
/** @type {?} */
RegionAttachment.OX1;
/** @type {?} */
RegionAttachment.OY1;
/** @type {?} */
RegionAttachment.OX2;
/** @type {?} */
RegionAttachment.OY2;
/** @type {?} */
RegionAttachment.OX3;
/** @type {?} */
RegionAttachment.OY3;
/** @type {?} */
RegionAttachment.OX4;
/** @type {?} */
RegionAttachment.OY4;
/** @type {?} */
RegionAttachment.X1;
/** @type {?} */
RegionAttachment.Y1;
/** @type {?} */
RegionAttachment.C1R;
/** @type {?} */
RegionAttachment.C1G;
/** @type {?} */
RegionAttachment.C1B;
/** @type {?} */
RegionAttachment.C1A;
/** @type {?} */
RegionAttachment.U1;
/** @type {?} */
RegionAttachment.V1;
/** @type {?} */
RegionAttachment.X2;
/** @type {?} */
RegionAttachment.Y2;
/** @type {?} */
RegionAttachment.C2R;
/** @type {?} */
RegionAttachment.C2G;
/** @type {?} */
RegionAttachment.C2B;
/** @type {?} */
RegionAttachment.C2A;
/** @type {?} */
RegionAttachment.U2;
/** @type {?} */
RegionAttachment.V2;
/** @type {?} */
RegionAttachment.X3;
/** @type {?} */
RegionAttachment.Y3;
/** @type {?} */
RegionAttachment.C3R;
/** @type {?} */
RegionAttachment.C3G;
/** @type {?} */
RegionAttachment.C3B;
/** @type {?} */
RegionAttachment.C3A;
/** @type {?} */
RegionAttachment.U3;
/** @type {?} */
RegionAttachment.V3;
/** @type {?} */
RegionAttachment.X4;
/** @type {?} */
RegionAttachment.Y4;
/** @type {?} */
RegionAttachment.C4R;
/** @type {?} */
RegionAttachment.C4G;
/** @type {?} */
RegionAttachment.C4B;
/** @type {?} */
RegionAttachment.C4A;
/** @type {?} */
RegionAttachment.U4;
/** @type {?} */
RegionAttachment.V4;
/** @type {?} */
RegionAttachment.prototype.x;
/** @type {?} */
RegionAttachment.prototype.y;
/** @type {?} */
RegionAttachment.prototype.scaleX;
/** @type {?} */
RegionAttachment.prototype.scaleY;
/** @type {?} */
RegionAttachment.prototype.rotation;
/** @type {?} */
RegionAttachment.prototype.width;
/** @type {?} */
RegionAttachment.prototype.height;
/** @type {?} */
RegionAttachment.prototype.color;
/** @type {?} */
RegionAttachment.prototype.path;
/** @type {?} */
RegionAttachment.prototype.rendererObject;
/** @type {?} */
RegionAttachment.prototype.region;
/** @type {?} */
RegionAttachment.prototype.offset;
/** @type {?} */
RegionAttachment.prototype.uvs;
/** @type {?} */
RegionAttachment.prototype.tempColor;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL2F0dGFjaG1lbnRzL1JlZ2lvbkF0dGFjaG1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsT0FBTyxFQUFFLEtBQUssRUFBYSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUkxQyxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsVUFBVTs7OztJQWdFOUMsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQW5CZCxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsVUFBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBTTlCLFdBQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLFFBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdCLGNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUlsQyxDQUFDOzs7O0lBRUQsWUFBWTs7WUFDTixZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFB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b0JBQWU7O0lBQ2Ysb0JBQWU7O0lBQ2YscUJBQWdCOztJQUNoQixxQkFBZ0I7O0lBQ2hCLHFCQUFnQjs7SUFDaEIscUJBQWdCOztJQUNoQixvQkFBZTs7SUFDZixvQkFBZTs7SUFFZiw2QkFBTTs7SUFDTiw2QkFBTTs7SUFDTixrQ0FBVzs7SUFDWCxrQ0FBVzs7SUFDWCxvQ0FBYTs7SUFDYixpQ0FBVTs7SUFDVixrQ0FBVzs7SUFDWCxpQ0FBOEI7O0lBRTlCLGdDQUFhOztJQUNiLDBDQUFvQjs7SUFDcEIsa0NBQXNCOztJQUV0QixrQ0FBZ0M7O0lBQ2hDLCtCQUE2Qjs7SUFFN0IscUNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxyXG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTksIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xyXG4gKlxyXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcclxuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcclxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcclxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXHJcbiAqXHJcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxyXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXHJcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cclxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXHJcbiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcclxuICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU5cclxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXHJcbiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXHJcbiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgQlVTSU5FU1NcclxuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxyXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcclxuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxyXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5pbXBvcnQgeyBVdGlscywgQXJyYXlMaWtlLCBDb2xvciB9IGZyb20gXCIuLi9VdGlsc1wiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSBcIi4vQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlUmVnaW9uIH0gZnJvbSBcIi4uL1RleHR1cmVcIjtcclxuaW1wb3J0IHsgQm9uZSB9IGZyb20gXCIuLi9Cb25lXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVnaW9uQXR0YWNobWVudCBleHRlbmRzIEF0dGFjaG1lbnQge1xyXG4gIHN0YXRpYyBPWDEgPSAwO1xyXG4gIHN0YXRpYyBPWTEgPSAxO1xyXG4gIHN0YXRpYyBPWDIgPSAyO1xyXG4gIHN0YXRpYyBPWTIgPSAzO1xyXG4gIHN0YXRpYyBPWDMgPSA0O1xyXG4gIHN0YXRpYyBPWTMgPSA1O1xyXG4gIHN0YXRpYyBPWDQgPSA2O1xyXG4gIHN0YXRpYyBPWTQgPSA3O1xyXG5cclxuICBzdGF0aWMgWDEgPSAwO1xyXG4gIHN0YXRpYyBZMSA9IDE7XHJcbiAgc3RhdGljIEMxUiA9IDI7XHJcbiAgc3RhdGljIEMxRyA9IDM7XHJcbiAgc3RhdGljIEMxQiA9IDQ7XHJcbiAgc3RhdGljIEMxQSA9IDU7XHJcbiAgc3RhdGljIFUxID0gNjtcclxuICBzdGF0aWMgVjEgPSA3O1xyXG5cclxuICBzdGF0aWMgWDIgPSA4O1xyXG4gIHN0YXRpYyBZMiA9IDk7XHJcbiAgc3RhdGljIEMyUiA9IDEwO1xyXG4gIHN0YXRpYyBDMkcgPSAxMTtcclxuICBzdGF0aWMgQzJCID0gMTI7XHJcbiAgc3RhdGljIEMyQSA9IDEzO1xyXG4gIHN0YXRpYyBVMiA9IDE0O1xyXG4gIHN0YXRpYyBWMiA9IDE1O1xyXG5cclxuICBzdGF0aWMgWDMgPSAxNjtcclxuICBzdGF0aWMgWTMgPSAxNztcclxuICBzdGF0aWMgQzNSID0gMTg7XHJcbiAgc3RhdGljIEMzRyA9IDE5O1xyXG4gIHN0YXRpYyBDM0IgPSAyMDtcclxuICBzdGF0aWMgQzNBID0gMjE7XHJcbiAgc3RhdGljIFUzID0gMjI7XHJcbiAgc3RhdGljIFYzID0gMjM7XHJcblxyXG4gIHN0YXRpYyBYNCA9IDI0O1xyXG4gIHN0YXRpYyBZNCA9IDI1O1xyXG4gIHN0YXRpYyBDNFIgPSAyNjtcclxuICBzdGF0aWMgQzRHID0gMjc7XHJcbiAgc3RhdGljIEM0QiA9IDI4O1xyXG4gIHN0YXRpYyBDNEEgPSAyOTtcclxuICBzdGF0aWMgVTQgPSAzMDtcclxuICBzdGF0aWMgVjQgPSAzMTtcclxuXHJcbiAgeCA9IDA7XHJcbiAgeSA9IDA7XHJcbiAgc2NhbGVYID0gMTtcclxuICBzY2FsZVkgPSAxO1xyXG4gIHJvdGF0aW9uID0gMDtcclxuICB3aWR0aCA9IDA7XHJcbiAgaGVpZ2h0ID0gMDtcclxuICBjb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcclxuXHJcbiAgcGF0aDogc3RyaW5nO1xyXG4gIHJlbmRlcmVyT2JqZWN0OiBhbnk7XHJcbiAgcmVnaW9uOiBUZXh0dXJlUmVnaW9uO1xyXG5cclxuICBvZmZzZXQgPSBVdGlscy5uZXdGbG9hdEFycmF5KDgpO1xyXG4gIHV2cyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkoOCk7XHJcblxyXG4gIHRlbXBDb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcclxuXHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihuYW1lKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU9mZnNldCgpOiB2b2lkIHtcclxuICAgIGxldCByZWdpb25TY2FsZVggPSAodGhpcy53aWR0aCAvIHRoaXMucmVnaW9uLm9yaWdpbmFsV2lkdGgpICogdGhpcy5zY2FsZVg7XHJcbiAgICBsZXQgcmVnaW9uU2NhbGVZID0gKHRoaXMuaGVpZ2h0IC8gdGhpcy5yZWdpb24ub3JpZ2luYWxIZWlnaHQpICogdGhpcy5zY2FsZVk7XHJcbiAgICBsZXQgbG9jYWxYID1cclxuICAgICAgKC10aGlzLndpZHRoIC8gMikgKiB0aGlzLnNjYWxlWCArIHRoaXMucmVnaW9uLm9mZnNldFggKiByZWdpb25TY2FsZVg7XHJcbiAgICBsZXQgbG9jYWxZID1cclxuICAgICAgKC10aGlzLmhlaWdodCAvIDIpICogdGhpcy5zY2FsZVkgKyB0aGlzLnJlZ2lvbi5vZmZzZXRZICogcmVnaW9uU2NhbGVZO1xyXG4gICAgbGV0IGxvY2FsWDIgPSBsb2NhbFggKyB0aGlzLnJlZ2lvbi53aWR0aCAqIHJlZ2lvblNjYWxlWDtcclxuICAgIGxldCBsb2NhbFkyID0gbG9jYWxZICsgdGhpcy5yZWdpb24uaGVpZ2h0ICogcmVnaW9uU2NhbGVZO1xyXG4gICAgbGV0IHJhZGlhbnMgPSAodGhpcy5yb3RhdGlvbiAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgbGV0IGNvcyA9IE1hdGguY29zKHJhZGlhbnMpO1xyXG4gICAgbGV0IHNpbiA9IE1hdGguc2luKHJhZGlhbnMpO1xyXG4gICAgbGV0IGxvY2FsWENvcyA9IGxvY2FsWCAqIGNvcyArIHRoaXMueDtcclxuICAgIGxldCBsb2NhbFhTaW4gPSBsb2NhbFggKiBzaW47XHJcbiAgICBsZXQgbG9jYWxZQ29zID0gbG9jYWxZICogY29zICsgdGhpcy55O1xyXG4gICAgbGV0IGxvY2FsWVNpbiA9IGxvY2FsWSAqIHNpbjtcclxuICAgIGxldCBsb2NhbFgyQ29zID0gbG9jYWxYMiAqIGNvcyArIHRoaXMueDtcclxuICAgIGxldCBsb2NhbFgyU2luID0gbG9jYWxYMiAqIHNpbjtcclxuICAgIGxldCBsb2NhbFkyQ29zID0gbG9jYWxZMiAqIGNvcyArIHRoaXMueTtcclxuICAgIGxldCBsb2NhbFkyU2luID0gbG9jYWxZMiAqIHNpbjtcclxuICAgIGxldCBvZmZzZXQgPSB0aGlzLm9mZnNldDtcclxuICAgIG9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9YMV0gPSBsb2NhbFhDb3MgLSBsb2NhbFlTaW47XHJcbiAgICBvZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWTFdID0gbG9jYWxZQ29zICsgbG9jYWxYU2luO1xyXG4gICAgb2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1gyXSA9IGxvY2FsWENvcyAtIGxvY2FsWTJTaW47XHJcbiAgICBvZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWTJdID0gbG9jYWxZMkNvcyArIGxvY2FsWFNpbjtcclxuICAgIG9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9YM10gPSBsb2NhbFgyQ29zIC0gbG9jYWxZMlNpbjtcclxuICAgIG9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9ZM10gPSBsb2NhbFkyQ29zICsgbG9jYWxYMlNpbjtcclxuICAgIG9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9YNF0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZU2luO1xyXG4gICAgb2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1k0XSA9IGxvY2FsWUNvcyArIGxvY2FsWDJTaW47XHJcbiAgfVxyXG5cclxuICBzZXRSZWdpb24ocmVnaW9uOiBUZXh0dXJlUmVnaW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZ2lvbiA9IHJlZ2lvbjtcclxuICAgIGxldCB1dnMgPSB0aGlzLnV2cztcclxuICAgIGlmIChyZWdpb24ucm90YXRlKSB7XHJcbiAgICAgIHV2c1syXSA9IHJlZ2lvbi51O1xyXG4gICAgICB1dnNbM10gPSByZWdpb24udjI7XHJcbiAgICAgIHV2c1s0XSA9IHJlZ2lvbi51O1xyXG4gICAgICB1dnNbNV0gPSByZWdpb24udjtcclxuICAgICAgdXZzWzZdID0gcmVnaW9uLnUyO1xyXG4gICAgICB1dnNbN10gPSByZWdpb24udjtcclxuICAgICAgdXZzWzBdID0gcmVnaW9uLnUyO1xyXG4gICAgICB1dnNbMV0gPSByZWdpb24udjI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB1dnNbMF0gPSByZWdpb24udTtcclxuICAgICAgdXZzWzFdID0gcmVnaW9uLnYyO1xyXG4gICAgICB1dnNbMl0gPSByZWdpb24udTtcclxuICAgICAgdXZzWzNdID0gcmVnaW9uLnY7XHJcbiAgICAgIHV2c1s0XSA9IHJlZ2lvbi51MjtcclxuICAgICAgdXZzWzVdID0gcmVnaW9uLnY7XHJcbiAgICAgIHV2c1s2XSA9IHJlZ2lvbi51MjtcclxuICAgICAgdXZzWzddID0gcmVnaW9uLnYyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29tcHV0ZVdvcmxkVmVydGljZXMoXHJcbiAgICBib25lOiBCb25lLFxyXG4gICAgd29ybGRWZXJ0aWNlczogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICBvZmZzZXQ6IG51bWJlcixcclxuICAgIHN0cmlkZTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBsZXQgdmVydGV4T2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XHJcbiAgICBsZXQgeCA9IGJvbmUud29ybGRYLFxyXG4gICAgICB5ID0gYm9uZS53b3JsZFk7XHJcbiAgICBsZXQgYSA9IGJvbmUuYSxcclxuICAgICAgYiA9IGJvbmUuYixcclxuICAgICAgYyA9IGJvbmUuYyxcclxuICAgICAgZCA9IGJvbmUuZDtcclxuICAgIGxldCBvZmZzZXRYID0gMCxcclxuICAgICAgb2Zmc2V0WSA9IDA7XHJcblxyXG4gICAgb2Zmc2V0WCA9IHZlcnRleE9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9YMV07XHJcbiAgICBvZmZzZXRZID0gdmVydGV4T2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1kxXTtcclxuICAgIHdvcmxkVmVydGljZXNbb2Zmc2V0XSA9IG9mZnNldFggKiBhICsgb2Zmc2V0WSAqIGIgKyB4OyAvLyBiclxyXG4gICAgd29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xyXG4gICAgb2Zmc2V0ICs9IHN0cmlkZTtcclxuXHJcbiAgICBvZmZzZXRYID0gdmVydGV4T2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1gyXTtcclxuICAgIG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWTJdO1xyXG4gICAgd29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIGJsXHJcbiAgICB3b3JsZFZlcnRpY2VzW29mZnNldCArIDFdID0gb2Zmc2V0WCAqIGMgKyBvZmZzZXRZICogZCArIHk7XHJcbiAgICBvZmZzZXQgKz0gc3RyaWRlO1xyXG5cclxuICAgIG9mZnNldFggPSB2ZXJ0ZXhPZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWDNdO1xyXG4gICAgb2Zmc2V0WSA9IHZlcnRleE9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9ZM107XHJcbiAgICB3b3JsZFZlcnRpY2VzW29mZnNldF0gPSBvZmZzZXRYICogYSArIG9mZnNldFkgKiBiICsgeDsgLy8gdWxcclxuICAgIHdvcmxkVmVydGljZXNbb2Zmc2V0ICsgMV0gPSBvZmZzZXRYICogYyArIG9mZnNldFkgKiBkICsgeTtcclxuICAgIG9mZnNldCArPSBzdHJpZGU7XHJcblxyXG4gICAgb2Zmc2V0WCA9IHZlcnRleE9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9YNF07XHJcbiAgICBvZmZzZXRZID0gdmVydGV4T2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1k0XTtcclxuICAgIHdvcmxkVmVydGljZXNbb2Zmc2V0XSA9IG9mZnNldFggKiBhICsgb2Zmc2V0WSAqIGIgKyB4OyAvLyB1clxyXG4gICAgd29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xyXG4gIH1cclxuXHJcbiAgY29weSgpOiBBdHRhY2htZW50IHtcclxuICAgIGxldCBjb3B5ID0gbmV3IFJlZ2lvbkF0dGFjaG1lbnQobmFtZSk7XHJcbiAgICBjb3B5LnJlZ2lvbiA9IHRoaXMucmVnaW9uO1xyXG4gICAgY29weS5yZW5kZXJlck9iamVjdCA9IHRoaXMucmVuZGVyZXJPYmplY3Q7XHJcbiAgICBjb3B5LnBhdGggPSB0aGlzLnBhdGg7XHJcbiAgICBjb3B5LnggPSB0aGlzLng7XHJcbiAgICBjb3B5LnkgPSB0aGlzLnk7XHJcbiAgICBjb3B5LnNjYWxlWCA9IHRoaXMuc2NhbGVYO1xyXG4gICAgY29weS5zY2FsZVkgPSB0aGlzLnNjYWxlWTtcclxuICAgIGNvcHkucm90YXRpb24gPSB0aGlzLnJvdGF0aW9uO1xyXG4gICAgY29weS53aWR0aCA9IHRoaXMud2lkdGg7XHJcbiAgICBjb3B5LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG4gICAgVXRpbHMuYXJyYXlDb3B5KHRoaXMudXZzLCAwLCBjb3B5LnV2cywgMCwgOCk7XHJcbiAgICBVdGlscy5hcnJheUNvcHkodGhpcy5vZmZzZXQsIDAsIGNvcHkub2Zmc2V0LCAwLCA4KTtcclxuICAgIGNvcHkuY29sb3Iuc2V0RnJvbUNvbG9yKHRoaXMuY29sb3IpO1xyXG4gICAgcmV0dXJuIGNvcHk7XHJcbiAgfVxyXG59XHJcbiJdfQ==