ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
467 lines • 49.3 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 { Vector2, MathUtils } from "./Utils";
var TransformConstraint = /** @class */ (function () {
function TransformConstraint(data, skeleton) {
this.rotateMix = 0;
this.translateMix = 0;
this.scaleMix = 0;
this.shearMix = 0;
this.temp = new Vector2();
this.active = false;
if (data == null)
throw new Error("data cannot be null.");
if (skeleton == null)
throw new Error("skeleton cannot be null.");
this.data = data;
this.rotateMix = data.rotateMix;
this.translateMix = data.translateMix;
this.scaleMix = data.scaleMix;
this.shearMix = data.shearMix;
this.bones = new Array();
for (var i = 0; i < data.bones.length; i++)
this.bones.push(skeleton.findBone(data.bones[i].name));
this.target = skeleton.findBone(data.target.name);
}
/**
* @return {?}
*/
TransformConstraint.prototype.isActive = /**
* @return {?}
*/
function () {
return this.active;
};
/**
* @return {?}
*/
TransformConstraint.prototype.apply = /**
* @return {?}
*/
function () {
this.update();
};
/**
* @return {?}
*/
TransformConstraint.prototype.update = /**
* @return {?}
*/
function () {
if (this.data.local) {
if (this.data.relative)
this.applyRelativeLocal();
else
this.applyAbsoluteLocal();
}
else {
if (this.data.relative)
this.applyRelativeWorld();
else
this.applyAbsoluteWorld();
}
};
/**
* @return {?}
*/
TransformConstraint.prototype.applyAbsoluteWorld = /**
* @return {?}
*/
function () {
/** @type {?} */
var rotateMix = this.rotateMix;
/** @type {?} */
var translateMix = this.translateMix;
/** @type {?} */
var scaleMix = this.scaleMix;
/** @type {?} */
var shearMix = this.shearMix;
/** @type {?} */
var target = this.target;
/** @type {?} */
var ta = target.a;
/** @type {?} */
var tb = target.b;
/** @type {?} */
var tc = target.c;
/** @type {?} */
var td = target.d;
/** @type {?} */
var degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
/** @type {?} */
var offsetRotation = this.data.offsetRotation * degRadReflect;
/** @type {?} */
var offsetShearY = this.data.offsetShearY * degRadReflect;
/** @type {?} */
var bones = this.bones;
for (var i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
var bone = bones[i];
/** @type {?} */
var modified = false;
if (rotateMix != 0) {
/** @type {?} */
var a = bone.a;
/** @type {?} */
var b = bone.b;
/** @type {?} */
var c = bone.c;
/** @type {?} */
var d = bone.d;
/** @type {?} */
var r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation;
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
r += MathUtils.PI2;
r *= rotateMix;
/** @type {?} */
var cos = Math.cos(r);
/** @type {?} */
var sin = Math.sin(r);
bone.a = cos * a - sin * c;
bone.b = cos * b - sin * d;
bone.c = sin * a + cos * c;
bone.d = sin * b + cos * d;
modified = true;
}
if (translateMix != 0) {
/** @type {?} */
var temp = this.temp;
target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
bone.worldX += (temp.x - bone.worldX) * translateMix;
bone.worldY += (temp.y - bone.worldY) * translateMix;
modified = true;
}
if (scaleMix > 0) {
/** @type {?} */
var s = Math.sqrt(bone.a * bone.a + bone.c * bone.c);
/** @type {?} */
var ts = Math.sqrt(ta * ta + tc * tc);
if (s > 0.00001)
s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s;
bone.a *= s;
bone.c *= s;
s = Math.sqrt(bone.b * bone.b + bone.d * bone.d);
ts = Math.sqrt(tb * tb + td * td);
if (s > 0.00001)
s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s;
bone.b *= s;
bone.d *= s;
modified = true;
}
if (shearMix > 0) {
/** @type {?} */
var b = bone.b;
/** @type {?} */
var d = bone.d;
/** @type {?} */
var by = Math.atan2(d, b);
/** @type {?} */
var r = Math.atan2(td, tb) -
Math.atan2(tc, ta) -
(by - Math.atan2(bone.c, bone.a));
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
r += MathUtils.PI2;
r = by + (r + offsetShearY) * shearMix;
/** @type {?} */
var s = Math.sqrt(b * b + d * d);
bone.b = Math.cos(r) * s;
bone.d = Math.sin(r) * s;
modified = true;
}
if (modified)
bone.appliedValid = false;
}
};
/**
* @return {?}
*/
TransformConstraint.prototype.applyRelativeWorld = /**
* @return {?}
*/
function () {
/** @type {?} */
var rotateMix = this.rotateMix;
/** @type {?} */
var translateMix = this.translateMix;
/** @type {?} */
var scaleMix = this.scaleMix;
/** @type {?} */
var shearMix = this.shearMix;
/** @type {?} */
var target = this.target;
/** @type {?} */
var ta = target.a;
/** @type {?} */
var tb = target.b;
/** @type {?} */
var tc = target.c;
/** @type {?} */
var td = target.d;
/** @type {?} */
var degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
/** @type {?} */
var offsetRotation = this.data.offsetRotation * degRadReflect;
/** @type {?} */
var offsetShearY = this.data.offsetShearY * degRadReflect;
/** @type {?} */
var bones = this.bones;
for (var i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
var bone = bones[i];
/** @type {?} */
var modified = false;
if (rotateMix != 0) {
/** @type {?} */
var a = bone.a;
/** @type {?} */
var b = bone.b;
/** @type {?} */
var c = bone.c;
/** @type {?} */
var d = bone.d;
/** @type {?} */
var r = Math.atan2(tc, ta) + offsetRotation;
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
r += MathUtils.PI2;
r *= rotateMix;
/** @type {?} */
var cos = Math.cos(r);
/** @type {?} */
var sin = Math.sin(r);
bone.a = cos * a - sin * c;
bone.b = cos * b - sin * d;
bone.c = sin * a + cos * c;
bone.d = sin * b + cos * d;
modified = true;
}
if (translateMix != 0) {
/** @type {?} */
var temp = this.temp;
target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
bone.worldX += temp.x * translateMix;
bone.worldY += temp.y * translateMix;
modified = true;
}
if (scaleMix > 0) {
/** @type {?} */
var s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) *
scaleMix +
1;
bone.a *= s;
bone.c *= s;
s =
(Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) *
scaleMix +
1;
bone.b *= s;
bone.d *= s;
modified = true;
}
if (shearMix > 0) {
/** @type {?} */
var r = Math.atan2(td, tb) - Math.atan2(tc, ta);
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
r += MathUtils.PI2;
/** @type {?} */
var b = bone.b;
/** @type {?} */
var d = bone.d;
r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * shearMix;
/** @type {?} */
var s = Math.sqrt(b * b + d * d);
bone.b = Math.cos(r) * s;
bone.d = Math.sin(r) * s;
modified = true;
}
if (modified)
bone.appliedValid = false;
}
};
/**
* @return {?}
*/
TransformConstraint.prototype.applyAbsoluteLocal = /**
* @return {?}
*/
function () {
/** @type {?} */
var rotateMix = this.rotateMix;
/** @type {?} */
var translateMix = this.translateMix;
/** @type {?} */
var scaleMix = this.scaleMix;
/** @type {?} */
var shearMix = this.shearMix;
/** @type {?} */
var target = this.target;
if (!target.appliedValid)
target.updateAppliedTransform();
/** @type {?} */
var bones = this.bones;
for (var i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
var bone = bones[i];
if (!bone.appliedValid)
bone.updateAppliedTransform();
/** @type {?} */
var rotation = bone.arotation;
if (rotateMix != 0) {
/** @type {?} */
var r = target.arotation - rotation + this.data.offsetRotation;
r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
rotation += r * rotateMix;
}
/** @type {?} */
var x = bone.ax;
/** @type {?} */
var y = bone.ay;
if (translateMix != 0) {
x += (target.ax - x + this.data.offsetX) * translateMix;
y += (target.ay - y + this.data.offsetY) * translateMix;
}
/** @type {?} */
var scaleX = bone.ascaleX;
/** @type {?} */
var scaleY = bone.ascaleY;
if (scaleMix != 0) {
if (scaleX > 0.00001)
scaleX =
(scaleX +
(target.ascaleX - scaleX + this.data.offsetScaleX) * scaleMix) /
scaleX;
if (scaleY > 0.00001)
scaleY =
(scaleY +
(target.ascaleY - scaleY + this.data.offsetScaleY) * scaleMix) /
scaleY;
}
/** @type {?} */
var shearY = bone.ashearY;
if (shearMix != 0) {
/** @type {?} */
var r = target.ashearY - shearY + this.data.offsetShearY;
r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
bone.shearY += r * shearMix;
}
bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
}
};
/**
* @return {?}
*/
TransformConstraint.prototype.applyRelativeLocal = /**
* @return {?}
*/
function () {
/** @type {?} */
var rotateMix = this.rotateMix;
/** @type {?} */
var translateMix = this.translateMix;
/** @type {?} */
var scaleMix = this.scaleMix;
/** @type {?} */
var shearMix = this.shearMix;
/** @type {?} */
var target = this.target;
if (!target.appliedValid)
target.updateAppliedTransform();
/** @type {?} */
var bones = this.bones;
for (var i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
var bone = bones[i];
if (!bone.appliedValid)
bone.updateAppliedTransform();
/** @type {?} */
var rotation = bone.arotation;
if (rotateMix != 0)
rotation += (target.arotation + this.data.offsetRotation) * rotateMix;
/** @type {?} */
var x = bone.ax;
/** @type {?} */
var y = bone.ay;
if (translateMix != 0) {
x += (target.ax + this.data.offsetX) * translateMix;
y += (target.ay + this.data.offsetY) * translateMix;
}
/** @type {?} */
var scaleX = bone.ascaleX;
/** @type {?} */
var scaleY = bone.ascaleY;
if (scaleMix != 0) {
if (scaleX > 0.00001)
scaleX *=
(target.ascaleX - 1 + this.data.offsetScaleX) * scaleMix + 1;
if (scaleY > 0.00001)
scaleY *=
(target.ascaleY - 1 + this.data.offsetScaleY) * scaleMix + 1;
}
/** @type {?} */
var shearY = bone.ashearY;
if (shearMix != 0)
shearY += (target.ashearY + this.data.offsetShearY) * shearMix;
bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
}
};
return TransformConstraint;
}());
export { TransformConstraint };
if (false) {
/** @type {?} */
TransformConstraint.prototype.data;
/** @type {?} */
TransformConstraint.prototype.bones;
/** @type {?} */
TransformConstraint.prototype.target;
/** @type {?} */
TransformConstraint.prototype.rotateMix;
/** @type {?} */
TransformConstraint.prototype.translateMix;
/** @type {?} */
TransformConstraint.prototype.scaleMix;
/** @type {?} */
TransformConstraint.prototype.shearMix;
/** @type {?} */
TransformConstraint.prototype.temp;
/** @type {?} */
TransformConstraint.prototype.active;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtQ29uc3RyYWludC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL1RyYW5zZm9ybUNvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHN0M7SUFVRSw2QkFBWSxJQUE2QixFQUFFLFFBQWtCO1FBTjdELGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFNBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFYixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVEsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FB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Q0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQ2pFLElBQUksQ0FBQyx3QkFBd0IsQ0FDM0IsQ0FBQyxFQUNELENBQUMsRUFDRCxRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixJQUFJLENBQUMsT0FBTyxFQUNaLE1BQU0sQ0FDUCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBQ0gsMEJBQUM7QUFBRCxDQUFDLEFBNVJELElBNFJDOzs7O0lBM1JDLG1DQUE4Qjs7SUFDOUIsb0NBQW1COztJQUNuQixxQ0FBYTs7SUFDYix3Q0FBYzs7SUFDZCwyQ0FBaUI7O0lBQ2pCLHVDQUFhOztJQUNiLHVDQUFhOztJQUNiLG1DQUFxQjs7SUFDckIscUNBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IFVwZGF0YWJsZSB9IGZyb20gXCIuL1VwZGF0YWJsZVwiO1xyXG5pbXBvcnQgeyBUcmFuc2Zvcm1Db25zdHJhaW50RGF0YSB9IGZyb20gXCIuL1RyYW5zZm9ybUNvbnN0cmFpbnREYXRhXCI7XHJcbmltcG9ydCB7IEJvbmUgfSBmcm9tIFwiLi9Cb25lXCI7XHJcbmltcG9ydCB7IFZlY3RvcjIsIE1hdGhVdGlscyB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSBcIi4vU2tlbGV0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1Db25zdHJhaW50IGltcGxlbWVudHMgVXBkYXRhYmxlIHtcclxuICBkYXRhOiBUcmFuc2Zvcm1Db25zdHJhaW50RGF0YTtcclxuICBib25lczogQXJyYXk8Qm9uZT47XHJcbiAgdGFyZ2V0OiBCb25lO1xyXG4gIHJvdGF0ZU1peCA9IDA7XHJcbiAgdHJhbnNsYXRlTWl4ID0gMDtcclxuICBzY2FsZU1peCA9IDA7XHJcbiAgc2hlYXJNaXggPSAwO1xyXG4gIHRlbXAgPSBuZXcgVmVjdG9yMigpO1xyXG4gIGFjdGl2ZSA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhLCBza2VsZXRvbjogU2tlbGV0b24pIHtcclxuICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcImRhdGEgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgaWYgKHNrZWxldG9uID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLnJvdGF0ZU1peCA9IGRhdGEucm90YXRlTWl4O1xyXG4gICAgdGhpcy50cmFuc2xhdGVNaXggPSBkYXRhLnRyYW5zbGF0ZU1peDtcclxuICAgIHRoaXMuc2NhbGVNaXggPSBkYXRhLnNjYWxlTWl4O1xyXG4gICAgdGhpcy5zaGVhck1peCA9IGRhdGEuc2hlYXJNaXg7XHJcbiAgICB0aGlzLmJvbmVzID0gbmV3IEFycmF5PEJvbmU+KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEuYm9uZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgIHRoaXMuYm9uZXMucHVzaChza2VsZXRvbi5maW5kQm9uZShkYXRhLmJvbmVzW2ldLm5hbWUpKTtcclxuICAgIHRoaXMudGFyZ2V0ID0gc2tlbGV0b24uZmluZEJvbmUoZGF0YS50YXJnZXQubmFtZSk7XHJcbiAgfVxyXG4gIGlzQWN0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gIH1cclxuICBhcHBseSgpIHtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEubG9jYWwpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5yZWxhdGl2ZSkgdGhpcy5hcHBseVJlbGF0aXZlTG9jYWwoKTtcclxuICAgICAgZWxzZSB0aGlzLmFwcGx5QWJzb2x1dGVMb2NhbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5yZWxhdGl2ZSkgdGhpcy5hcHBseVJlbGF0aXZlV29ybGQoKTtcclxuICAgICAgZWxzZSB0aGlzLmFwcGx5QWJzb2x1dGVXb3JsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBseUFic29sdXRlV29ybGQoKSB7XHJcbiAgICBsZXQgcm90YXRlTWl4ID0gdGhpcy5yb3RhdGVNaXgsXHJcbiAgICAgIHRyYW5zbGF0ZU1peCA9IHRoaXMudHJhbnNsYXRlTWl4LFxyXG4gICAgICBzY2FsZU1peCA9IHRoaXMuc2NhbGVNaXgsXHJcbiAgICAgIHNoZWFyTWl4ID0gdGhpcy5zaGVhck1peDtcclxuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuICAgIGxldCB0YSA9IHRhcmdldC5hLFxyXG4gICAgICB0YiA9IHRhcmdldC5iLFxyXG4gICAgICB0YyA9IHRhcmdldC5jLFxyXG4gICAgICB0ZCA9IHRhcmdldC5kO1xyXG4gICAgbGV0IGRlZ1JhZFJlZmxlY3QgPVxyXG4gICAgICB0YSAqIHRkIC0gdGIgKiB0YyA+IDAgPyBNYXRoVXRpbHMuZGVnUmFkIDogLU1hdGhVdGlscy5kZWdSYWQ7XHJcbiAgICBsZXQgb2Zmc2V0Um90YXRpb24gPSB0aGlzLmRhdGEub2Zmc2V0Um90YXRpb24gKiBkZWdSYWRSZWZsZWN0O1xyXG4gICAgbGV0IG9mZnNldFNoZWFyWSA9IHRoaXMuZGF0YS5vZmZzZXRTaGVhclkgKiBkZWdSYWRSZWZsZWN0O1xyXG4gICAgbGV0IGJvbmVzID0gdGhpcy5ib25lcztcclxuICAgIGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgIGxldCBib25lID0gYm9uZXNbaV07XHJcbiAgICAgIGxldCBtb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgICBpZiAocm90YXRlTWl4ICE9IDApIHtcclxuICAgICAgICBsZXQgYSA9IGJvbmUuYSxcclxuICAgICAgICAgIGIgPSBib25lLmIsXHJcbiAgICAgICAgICBjID0gYm9uZS5jLFxyXG4gICAgICAgICAgZCA9IGJvbmUuZDtcclxuICAgICAgICBsZXQgciA9IE1hdGguYXRhbjIodGMsIHRhKSAtIE1hdGguYXRhbjIoYywgYSkgKyBvZmZzZXRSb3RhdGlvbjtcclxuICAgICAgICBpZiAociA+IE1hdGhVdGlscy5QSSkgciAtPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSByICs9IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgciAqPSByb3RhdGVNaXg7XHJcbiAgICAgICAgbGV0IGNvcyA9IE1hdGguY29zKHIpLFxyXG4gICAgICAgICAgc2luID0gTWF0aC5zaW4ocik7XHJcbiAgICAgICAgYm9uZS5hID0gY29zICogYSAtIHNpbiAqIGM7XHJcbiAgICAgICAgYm9uZS5iID0gY29zICogYiAtIHNpbiAqIGQ7XHJcbiAgICAgICAgYm9uZS5jID0gc2luICogYSArIGNvcyAqIGM7XHJcbiAgICAgICAgYm9uZS5kID0gc2luICogYiArIGNvcyAqIGQ7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0cmFuc2xhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCB0ZW1wID0gdGhpcy50ZW1wO1xyXG4gICAgICAgIHRhcmdldC5sb2NhbFRvV29ybGQodGVtcC5zZXQodGhpcy5kYXRhLm9mZnNldFgsIHRoaXMuZGF0YS5vZmZzZXRZKSk7XHJcbiAgICAgICAgYm9uZS53b3JsZFggKz0gKHRlbXAueCAtIGJvbmUud29ybGRYKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICBib25lLndvcmxkWSArPSAodGVtcC55IC0gYm9uZS53b3JsZFkpICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2NhbGVNaXggPiAwKSB7XHJcbiAgICAgICAgbGV0IHMgPSBNYXRoLnNxcnQoYm9uZS5hICogYm9uZS5hICsgYm9uZS5jICogYm9uZS5jKTtcclxuICAgICAgICBsZXQgdHMgPSBNYXRoLnNxcnQodGEgKiB0YSArIHRjICogdGMpO1xyXG4gICAgICAgIGlmIChzID4gMC4wMDAwMSlcclxuICAgICAgICAgIHMgPSAocyArICh0cyAtIHMgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVYKSAqIHNjYWxlTWl4KSAvIHM7XHJcbiAgICAgICAgYm9uZS5hICo9IHM7XHJcbiAgICAgICAgYm9uZS5jICo9IHM7XHJcbiAgICAgICAgcyA9IE1hdGguc3FydChib25lLmIgKiBib25lLmIgKyBib25lLmQgKiBib25lLmQpO1xyXG4gICAgICAgIHRzID0gTWF0aC5zcXJ0KHRiICogdGIgKyB0ZCAqIHRkKTtcclxuICAgICAgICBpZiAocyA+IDAuMDAwMDEpXHJcbiAgICAgICAgICBzID0gKHMgKyAodHMgLSBzICsgdGhpcy5kYXRhLm9mZnNldFNjYWxlWSkgKiBzY2FsZU1peCkgLyBzO1xyXG4gICAgICAgIGJvbmUuYiAqPSBzO1xyXG4gICAgICAgIGJvbmUuZCAqPSBzO1xyXG4gICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2hlYXJNaXggPiAwKSB7XHJcbiAgICAgICAgbGV0IGIgPSBib25lLmIsXHJcbiAgICAgICAgICBkID0gYm9uZS5kO1xyXG4gICAgICAgIGxldCBieSA9IE1hdGguYXRhbjIoZCwgYik7XHJcbiAgICAgICAgbGV0IHIgPVxyXG4gICAgICAgICAgTWF0aC5hdGFuMih0ZCwgdGIpIC1cclxuICAgICAgICAgIE1hdGguYXRhbjIodGMsIHRhKSAtXHJcbiAgICAgICAgICAoYnkgLSBNYXRoLmF0YW4yKGJvbmUuYywgYm9uZS5hKSk7XHJcbiAgICAgICAgaWYgKHIgPiBNYXRoVXRpbHMuUEkpIHIgLT0gTWF0aFV0aWxzLlBJMjtcclxuICAgICAgICBlbHNlIGlmIChyIDwgLU1hdGhVdGlscy5QSSkgciArPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIHIgPSBieSArIChyICsgb2Zmc2V0U2hlYXJZKSAqIHNoZWFyTWl4O1xyXG4gICAgICAgIGxldCBzID0gTWF0aC5zcXJ0KGIgKiBiICsgZCAqIGQpO1xyXG4gICAgICAgIGJvbmUuYiA9IE1hdGguY29zKHIpICogcztcclxuICAgICAgICBib25lLmQgPSBNYXRoLnNpbihyKSAqIHM7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtb2RpZmllZCkgYm9uZS5hcHBsaWVkVmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgYXBwbHlSZWxhdGl2ZVdvcmxkKCkge1xyXG4gICAgbGV0IHJvdGF0ZU1peCA9IHRoaXMucm90YXRlTWl4LFxyXG4gICAgICB0cmFuc2xhdGVNaXggPSB0aGlzLnRyYW5zbGF0ZU1peCxcclxuICAgICAgc2NhbGVNaXggPSB0aGlzLnNjYWxlTWl4LFxyXG4gICAgICBzaGVhck1peCA9IHRoaXMuc2hlYXJNaXg7XHJcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICBsZXQgdGEgPSB0YXJnZXQuYSxcclxuICAgICAgdGIgPSB0YXJnZXQuYixcclxuICAgICAgdGMgPSB0YXJnZXQuYyxcclxuICAgICAgdGQgPSB0YXJnZXQuZDtcclxuICAgIGxldCBkZWdSYWRSZWZsZWN0ID1cclxuICAgICAgdGEgKiB0ZCAtIHRiICogdGMgPiAwID8gTWF0aFV0aWxzLmRlZ1JhZCA6IC1NYXRoVXRpbHMuZGVnUmFkO1xyXG4gICAgbGV0IG9mZnNldFJvdGF0aW9uID0gdGhpcy5kYXRhLm9mZnNldFJvdGF0aW9uICogZGVnUmFkUmVmbGVjdCxcclxuICAgICAgb2Zmc2V0U2hlYXJZID0gdGhpcy5kYXRhLm9mZnNldFNoZWFyWSAqIGRlZ1JhZFJlZmxlY3Q7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XHJcbiAgICAgIGlmIChyb3RhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCBhID0gYm9uZS5hLFxyXG4gICAgICAgICAgYiA9IGJvbmUuYixcclxuICAgICAgICAgIGMgPSBib25lLmMsXHJcbiAgICAgICAgICBkID0gYm9uZS5kO1xyXG4gICAgICAgIGxldCByID0gTWF0aC5hdGFuMih0YywgdGEpICsgb2Zmc2V0Um90YXRpb247XHJcbiAgICAgICAgaWYgKHIgPiBNYXRoVXRpbHMuUEkpIHIgLT0gTWF0aFV0aWxzLlBJMjtcclxuICAgICAgICBlbHNlIGlmIChyIDwgLU1hdGhVdGlscy5QSSkgciArPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIHIgKj0gcm90YXRlTWl4O1xyXG4gICAgICAgIGxldCBjb3MgPSBNYXRoLmNvcyhyKSxcclxuICAgICAgICAgIHNpbiA9IE1hdGguc2luKHIpO1xyXG4gICAgICAgIGJvbmUuYSA9IGNvcyAqIGEgLSBzaW4gKiBjO1xyXG4gICAgICAgIGJvbmUuYiA9IGNvcyAqIGIgLSBzaW4gKiBkO1xyXG4gICAgICAgIGJvbmUuYyA9IHNpbiAqIGEgKyBjb3MgKiBjO1xyXG4gICAgICAgIGJvbmUuZCA9IHNpbiAqIGIgKyBjb3MgKiBkO1xyXG4gICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHJhbnNsYXRlTWl4ICE9IDApIHtcclxuICAgICAgICBsZXQgdGVtcCA9IHRoaXMudGVtcDtcclxuICAgICAgICB0YXJnZXQubG9jYWxUb1dvcmxkKHRlbXAuc2V0KHRoaXMuZGF0YS5vZmZzZXRYLCB0aGlzLmRhdGEub2Zmc2V0WSkpO1xyXG4gICAgICAgIGJvbmUud29ybGRYICs9IHRlbXAueCAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICBib25lLndvcmxkWSArPSB0ZW1wLnkgKiB0cmFuc2xhdGVNaXg7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzY2FsZU1peCA+IDApIHtcclxuICAgICAgICBsZXQgcyA9XHJcbiAgICAgICAgICAoTWF0aC5zcXJ0KHRhICogdGEgKyB0YyAqIHRjKSAtIDEgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVYKSAqXHJcbiAgICAgICAgICAgIHNjYWxlTWl4ICtcclxuICAgICAgICAgIDE7XHJcbiAgICAgICAgYm9uZS5hICo9IHM7XHJcbiAgICAgICAgYm9uZS5jICo9IHM7XHJcbiAgICAgICAgcyA9XHJcbiAgICAgICAgICAoTWF0aC5zcXJ0KHRiICogdGIgKyB0ZCAqIHRkKSAtIDEgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVZKSAqXHJcbiAgICAgICAgICAgIHNjYWxlTWl4ICtcclxuICAgICAgICAgIDE7XHJcbiAgICAgICAgYm9uZS5iICo9IHM7XHJcbiAgICAgICAgYm9uZS5kICo9IHM7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzaGVhck1peCA+IDApIHtcclxuICAgICAgICBsZXQgciA9IE1hdGguYXRhbjIodGQsIHRiKSAtIE1hdGguYXRhbjIodGMsIHRhKTtcclxuICAgICAgICBpZiAociA+IE1hdGhVdGlscy5QSSkgciAtPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSByICs9IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgbGV0IGIgPSBib25lLmIsXHJcbiAgICAgICAgICBkID0gYm9uZS5kO1xyXG4gICAgICAgIHIgPSBNYXRoLmF0YW4yKGQsIGIpICsgKHIgLSBNYXRoVXRpbHMuUEkgLyAyICsgb2Zmc2V0U2hlYXJZKSAqIHNoZWFyTWl4O1xyXG4gICAgICAgIGxldCBzID0gTWF0aC5zcXJ0KGIgKiBiICsgZCAqIGQpO1xyXG4gICAgICAgIGJvbmUuYiA9IE1hdGguY29zKHIpICogcztcclxuICAgICAgICBib25lLmQgPSBNYXRoLnNpbihyKSAqIHM7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtb2RpZmllZCkgYm9uZS5hcHBsaWVkVmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgYXBwbHlBYnNvbHV0ZUxvY2FsKCkge1xyXG4gICAgbGV0IHJvdGF0ZU1peCA9IHRoaXMucm90YXRlTWl4LFxyXG4gICAgICB0cmFuc2xhdGVNaXggPSB0aGlzLnRyYW5zbGF0ZU1peCxcclxuICAgICAgc2NhbGVNaXggPSB0aGlzLnNjYWxlTWl4LFxyXG4gICAgICBzaGVhck1peCA9IHRoaXMuc2hlYXJNaXg7XHJcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICBpZiAoIXRhcmdldC5hcHBsaWVkVmFsaWQpIHRhcmdldC51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgaWYgKCFib25lLmFwcGxpZWRWYWxpZCkgYm9uZS51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICAgIGxldCByb3RhdGlvbiA9IGJvbmUuYXJvdGF0aW9uO1xyXG4gICAgICBpZiAocm90YXRlTWl4ICE9IDApIHtcclxuICAgICAgICBsZXQgciA9IHRhcmdldC5hcm90YXRpb24gLSByb3RhdGlvbiArIHRoaXMuZGF0YS5vZmZzZXRSb3RhdGlvbjtcclxuICAgICAgICByIC09ICgxNjM4NCAtICgoMTYzODQuNDk5OTk5OTk5OTk2IC0gciAvIDM2MCkgfCAwKSkgKiAzNjA7XHJcbiAgICAgICAgcm90YXRpb24gKz0gciAqIHJvdGF0ZU1peDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgeCA9IGJvbmUuYXgsXHJcbiAgICAgICAgeSA9IGJvbmUuYXk7XHJcbiAgICAgIGlmICh0cmFuc2xhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIHggKz0gKHRhcmdldC5heCAtIHggKyB0aGlzLmRhdGEub2Zmc2V0WCkgKiB0cmFuc2xhdGVNaXg7XHJcbiAgICAgICAgeSArPSAodGFyZ2V0LmF5IC0geSArIHRoaXMuZGF0YS5vZmZzZXRZKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2NhbGVYID0gYm9uZS5hc2NhbGVYLFxyXG4gICAgICAgIHNjYWxlWSA9IGJvbmUuYXNjYWxlWTtcclxuICAgICAgaWYgKHNjYWxlTWl4ICE9IDApIHtcclxuICAgICAgICBpZiAoc2NhbGVYID4gMC4wMDAwMSlcclxuICAgICAgICAgIHNjYWxlWCA9XHJcbiAgICAgICAgICAgIChzY2FsZVggK1xyXG4gICAgICAgICAgICAgICh0YXJnZXQuYXNjYWxlWCAtIHNjYWxlWCArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVgpICogc2NhbGVNaXgpIC9cclxuICAgICAgICAgICAgc2NhbGVYO1xyXG4gICAgICAgIGlmIChzY2FsZVkgPiAwLjAwMDAxKVxyXG4gICAgICAgICAgc2NhbGVZID1cclxuICAgICAgICAgICAgKHNjYWxlWSArXHJcbiAgICAgICAgICAgICAgKHRhcmdldC5hc2NhbGVZIC0gc2NhbGVZICsgdGhpcy5kYXRhLm9mZnNldFNjYWxlWSkgKiBzY2FsZU1peCkgL1xyXG4gICAgICAgICAgICBzY2FsZVk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHNoZWFyWSA9IGJvbmUuYXNoZWFyWTtcclxuICAgICAgaWYgKHNoZWFyTWl4ICE9IDApIHtcclxuICAgICAgICBsZXQgciA9IHRhcmdldC5hc2hlYXJZIC0gc2hlYXJZICsgdGhpcy5kYXRhLm9mZnNldFNoZWFyWTtcclxuICAgICAgICByIC09ICgxNjM4NCAtICgoMTYzODQuNDk5OTk5OTk5OTk2IC0gciAvIDM2MCkgfCAwKSkgKiAzNjA7XHJcbiAgICAgICAgYm9uZS5zaGVhclkgKz0gciAqIHNoZWFyTWl4O1xyXG4gICAgICB9XHJcbiAgICAgIGJvbmUudXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoKFxyXG4gICAgICAgIHgsXHJcbiAgICAgICAgeSxcclxuICAgICAgICByb3RhdGlvbixcclxuICAgICAgICBzY2FsZVgsXHJcbiAgICAgICAgc2NhbGVZLFxyXG4gICAgICAgIGJvbmUuYXNoZWFyWCxcclxuICAgICAgICBzaGVhcllcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcbiAgYXBwbHlSZWxhdGl2ZUxvY2FsKCkge1xyXG4gICAgbGV0IHJvdGF0ZU1peCA9IHRoaXMucm90YXRlTWl4LFxyXG4gICAgICB0cmFuc2xhdGVNaXggPSB0aGlzLnRyYW5zbGF0ZU1peCxcclxuICAgICAgc2NhbGVNaXggPSB0aGlzLnNjYWxlTWl4LFxyXG4gICAgICBzaGVhck1peCA9IHRoaXMuc2hlYXJNaXg7XHJcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICBpZiAoIXRhcmdldC5hcHBsaWVkVmFsaWQpIHRhcmdldC51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgaWYgKCFib25lLmFwcGxpZWRWYWxpZCkgYm9uZS51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICAgIGxldCByb3RhdGlvbiA9IGJvbmUuYXJvdGF0aW9uO1xyXG4gICAgICBpZiAocm90YXRlTWl4ICE9IDApXHJcbiAgICAgICAgcm90YXRpb24gKz0gKHRhcmdldC5hcm90YXRpb24gKyB0aGlzLmRhdGEub2Zmc2V0Um90YXRpb24pICogcm90YXRlTWl4O1xyXG4gICAgICBsZXQgeCA9IGJvbmUuYXgsXHJcbiAgICAgICAgeSA9IGJvbmUuYXk7XHJcbiAgICAgIGlmICh0cmFuc2xhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIHggKz0gKHRhcmdldC5heCArIHRoaXMuZGF0YS5vZmZzZXRYKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICB5ICs9ICh0YXJnZXQuYXkgKyB0aGlzLmRhdGEub2Zmc2V0WSkgKiB0cmFuc2xhdGVNaXg7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHNjYWxlWCA9IGJvbmUuYXNjYWxlWCxcclxuICAgICAgICBzY2FsZVkgPSBib25lLmFzY2FsZVk7XHJcbiAgICAgIGlmIChzY2FsZU1peCAhPSAwKSB7XHJcbiAgICAgICAgaWYgKHNjYWxlWCA+IDAuMDAwMDEpXHJcbiAgICAgICAgICBzY2FsZVggKj1cclxuICAgICAgICAgICAgKHRhcmdldC5hc2NhbGVYIC0gMSArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVgpICogc2NhbGVNaXggKyAxO1xyXG4gICAgICAgIGlmIChzY2FsZVkgPiAwLjAwMDAxKVxyXG4gICAgICAgICAgc2NhbGVZICo9XHJcbiAgICAgICAgICAgICh0YXJnZXQuYXNjYWxlWSAtIDEgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVZKSAqIHNjYWxlTWl4ICsgMTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2hlYXJZID0gYm9uZS5hc2hlYXJZO1xyXG4gICAgICBpZiAoc2hlYXJNaXggIT0gMClcclxuICAgICAgICBzaGVhclkgKz0gKHRhcmdldC5hc2hlYXJZICsgdGhpcy5kYXRhLm9mZnNldFNoZWFyWSkgKiBzaGVhck1peDtcclxuICAgICAgYm9uZS51cGRhdGVXb3JsZFRyYW5zZm9ybVdpdGgoXHJcbiAgICAgICAgeCxcclxuICAgICAgICB5LFxyXG4gICAgICAgIHJvdGF0aW9uLFxyXG4gICAgICAgIHNjYWxlWCxcclxuICAgICAgICBzY2FsZVksXHJcbiAgICAgICAgYm9uZS5hc2hlYXJYLFxyXG4gICAgICAgIHNoZWFyWVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=