UNPKG

ngx-spine

Version:

[![Build Status](https://travis-ci.org/PoiScript/ngx-spine.svg?branch=master)](https://travis-ci.org/PoiScript/ngx-spine)

416 lines 43.2 kB
/** * @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 { MathUtils } from "./Utils"; export class IkConstraint { /** * @param {?} data * @param {?} skeleton */ constructor(data, skeleton) { this.bendDirection = 0; this.compress = false; this.stretch = false; this.mix = 1; this.softness = 0; 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.mix = data.mix; this.softness = data.softness; this.bendDirection = data.bendDirection; this.compress = data.compress; this.stretch = data.stretch; this.bones = new Array(); for (let i = 0; i < data.bones.length; i++) this.bones.push(skeleton.findBone(data.bones[i].name)); this.target = skeleton.findBone(data.target.name); } /** * @return {?} */ isActive() { return this.active; } /** * @return {?} */ apply() { this.update(); } /** * @return {?} */ update() { /** @type {?} */ let target = this.target; /** @type {?} */ let bones = this.bones; switch (bones.length) { case 1: this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix); break; case 2: this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.softness, this.mix); break; } } /** * Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world * coordinate system. * @param {?} bone * @param {?} targetX * @param {?} targetY * @param {?} compress * @param {?} stretch * @param {?} uniform * @param {?} alpha * @return {?} */ apply1(bone, targetX, targetY, compress, stretch, uniform, alpha) { if (!bone.appliedValid) bone.updateAppliedTransform(); /** @type {?} */ let p = bone.parent; /** @type {?} */ let id = 1 / (p.a * p.d - p.b * p.c); /** @type {?} */ let x = targetX - p.worldX; /** @type {?} */ let y = targetY - p.worldY; /** @type {?} */ let tx = (x * p.d - y * p.b) * id - bone.ax; /** @type {?} */ let ty = (y * p.a - x * p.c) * id - bone.ay; /** @type {?} */ let rotationIK = Math.atan2(ty, tx) * MathUtils.radDeg - bone.ashearX - bone.arotation; if (bone.ascaleX < 0) rotationIK += 180; if (rotationIK > 180) rotationIK -= 360; else if (rotationIK < -180) rotationIK += 360; /** @type {?} */ let sx = bone.ascaleX; /** @type {?} */ let sy = bone.ascaleY; if (compress || stretch) { /** @type {?} */ let b = bone.data.length * sx; /** @type {?} */ let dd = Math.sqrt(tx * tx + ty * ty); if ((compress && dd < b) || (stretch && dd > b && b > 0.0001)) { /** @type {?} */ let s = (dd / b - 1) * alpha + 1; sx *= s; if (uniform) sy *= s; } } bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY); } /** * Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The * target is specified in the world coordinate system. * @param {?} parent * @param {?} child A direct descendant of the parent bone. * @param {?} targetX * @param {?} targetY * @param {?} bendDir * @param {?} stretch * @param {?} softness * @param {?} alpha * @return {?} */ apply2(parent, child, targetX, targetY, bendDir, stretch, softness, alpha) { if (alpha == 0) { child.updateWorldTransform(); return; } if (!parent.appliedValid) parent.updateAppliedTransform(); if (!child.appliedValid) child.updateAppliedTransform(); /** @type {?} */ let px = parent.ax; /** @type {?} */ let py = parent.ay; /** @type {?} */ let psx = parent.ascaleX; /** @type {?} */ let sx = psx; /** @type {?} */ let psy = parent.ascaleY; /** @type {?} */ let csx = child.ascaleX; /** @type {?} */ let os1 = 0; /** @type {?} */ let os2 = 0; /** @type {?} */ let s2 = 0; if (psx < 0) { psx = -psx; os1 = 180; s2 = -1; } else { os1 = 0; s2 = 1; } if (psy < 0) { psy = -psy; s2 = -s2; } if (csx < 0) { csx = -csx; os2 = 180; } else os2 = 0; /** @type {?} */ let cx = child.ax; /** @type {?} */ let cy = 0; /** @type {?} */ let cwx = 0; /** @type {?} */ let cwy = 0; /** @type {?} */ let a = parent.a; /** @type {?} */ let b = parent.b; /** @type {?} */ let c = parent.c; /** @type {?} */ let d = parent.d; /** @type {?} */ let u = Math.abs(psx - psy) <= 0.0001; if (!u) { cy = 0; cwx = a * cx + parent.worldX; cwy = c * cx + parent.worldY; } else { cy = child.ay; cwx = a * cx + b * cy + parent.worldX; cwy = c * cx + d * cy + parent.worldY; } /** @type {?} */ let pp = parent.parent; a = pp.a; b = pp.b; c = pp.c; d = pp.d; /** @type {?} */ let id = 1 / (a * d - b * c); /** @type {?} */ let x = cwx - pp.worldX; /** @type {?} */ let y = cwy - pp.worldY; /** @type {?} */ let dx = (x * d - y * b) * id - px; /** @type {?} */ let dy = (y * a - x * c) * id - py; /** @type {?} */ let l1 = Math.sqrt(dx * dx + dy * dy); /** @type {?} */ let l2 = child.data.length * csx; /** @type {?} */ let a1; /** @type {?} */ let a2; if (l1 < 0.0001) { this.apply1(parent, targetX, targetY, false, stretch, false, alpha); child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); return; } x = targetX - pp.worldX; y = targetY - pp.worldY; /** @type {?} */ let tx = (x * d - y * b) * id - px; /** @type {?} */ let ty = (y * a - x * c) * id - py; /** @type {?} */ let dd = tx * tx + ty * ty; if (softness != 0) { softness *= (psx * (csx + 1)) / 2; /** @type {?} */ let td = Math.sqrt(dd); /** @type {?} */ let sd = td - l1 - l2 * psx + softness; if (sd > 0) { /** @type {?} */ let p = Math.min(1, sd / (softness * 2)) - 1; p = (sd - softness * (1 - p * p)) / td; tx -= p * tx; ty -= p * ty; dd = tx * tx + ty * ty; } } outer: if (u) { l2 *= psx; /** @type {?} */ let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2); if (cos < -1) cos = -1; else if (cos > 1) { cos = 1; if (stretch) sx *= (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1; } a2 = Math.acos(cos) * bendDir; a = l1 + l2 * cos; b = l2 * Math.sin(a2); a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b); } else { a = psx * l2; b = psy * l2; /** @type {?} */ let aa = a * a; /** @type {?} */ let bb = b * b; /** @type {?} */ let ta = Math.atan2(ty, tx); c = bb * l1 * l1 + aa * dd - aa * bb; /** @type {?} */ let c1 = -2 * bb * l1; /** @type {?} */ let c2 = bb - aa; d = c1 * c1 - 4 * c2 * c; if (d >= 0) { /** @type {?} */ let q = Math.sqrt(d); if (c1 < 0) q = -q; q = -(c1 + q) / 2; /** @type {?} */ let r0 = q / c2; /** @type {?} */ let r1 = c / q; /** @type {?} */ let r = Math.abs(r0) < Math.abs(r1) ? r0 : r1; if (r * r <= dd) { y = Math.sqrt(dd - r * r) * bendDir; a1 = ta - Math.atan2(y, r); a2 = Math.atan2(y / psy, (r - l1) / psx); break outer; } } /** @type {?} */ let minAngle = MathUtils.PI; /** @type {?} */ let minX = l1 - a; /** @type {?} */ let minDist = minX * minX; /** @type {?} */ let minY = 0; /** @type {?} */ let maxAngle = 0; /** @type {?} */ let maxX = l1 + a; /** @type {?} */ let maxDist = maxX * maxX; /** @type {?} */ let maxY = 0; c = (-a * l1) / (aa - bb); if (c >= -1 && c <= 1) { c = Math.acos(c); x = a * Math.cos(c) + l1; y = b * Math.sin(c); d = x * x + y * y; if (d < minDist) { minAngle = c; minDist = d; minX = x; minY = y; } if (d > maxDist) { maxAngle = c; maxDist = d; maxX = x; maxY = y; } } if (dd <= (minDist + maxDist) / 2) { a1 = ta - Math.atan2(minY * bendDir, minX); a2 = minAngle * bendDir; } else { a1 = ta - Math.atan2(maxY * bendDir, maxX); a2 = maxAngle * bendDir; } } /** @type {?} */ let os = Math.atan2(cy, cx) * s2; /** @type {?} */ let rotation = parent.arotation; a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation; if (a1 > 180) a1 -= 360; else if (a1 < -180) a1 += 360; parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 0, 0); rotation = child.arotation; a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation; if (a2 > 180) a2 -= 360; else if (a2 < -180) a2 += 360; child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); } } if (false) { /** @type {?} */ IkConstraint.prototype.data; /** @type {?} */ IkConstraint.prototype.bones; /** @type {?} */ IkConstraint.prototype.target; /** @type {?} */ IkConstraint.prototype.bendDirection; /** @type {?} */ IkConstraint.prototype.compress; /** @type {?} */ IkConstraint.prototype.stretch; /** @type {?} */ IkConstraint.prototype.mix; /** @type {?} */ IkConstraint.prototype.softness; /** @type {?} */ IkConstraint.prototype.active; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWtDb25zdHJhaW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvSWtDb25zdHJhaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFNcEMsTUFBTSxPQUFPLFlBQVk7Ozs7O0lBVXZCLFlBQVksSUFBc0IsRUFBRSxRQUFrQjtRQU50RCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNSLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxRCxJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBUSxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxF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OztJQUNuQiw4QkFBYTs7SUFDYixxQ0FBa0I7O0lBQ2xCLGdDQUFpQjs7SUFDakIsK0JBQWdCOztJQUNoQiwyQkFBUTs7SUFDUixnQ0FBYTs7SUFDYiw4QkFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgTWF0aFV0aWxzIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgSWtDb25zdHJhaW50RGF0YSB9IGZyb20gXCIuL0lrQ29uc3RyYWludERhdGFcIjtcclxuaW1wb3J0IHsgQm9uZSB9IGZyb20gXCIuL0JvbmVcIjtcclxuaW1wb3J0IHsgVXBkYXRhYmxlIH0gZnJvbSBcIi4vVXBkYXRhYmxlXCI7XHJcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSBcIi4vU2tlbGV0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJa0NvbnN0cmFpbnQgaW1wbGVtZW50cyBVcGRhdGFibGUge1xyXG4gIGRhdGE6IElrQ29uc3RyYWludERhdGE7XHJcbiAgYm9uZXM6IEFycmF5PEJvbmU+O1xyXG4gIHRhcmdldDogQm9uZTtcclxuICBiZW5kRGlyZWN0aW9uID0gMDtcclxuICBjb21wcmVzcyA9IGZhbHNlO1xyXG4gIHN0cmV0Y2ggPSBmYWxzZTtcclxuICBtaXggPSAxO1xyXG4gIHNvZnRuZXNzID0gMDtcclxuICBhY3RpdmUgPSBmYWxzZTtcclxuICBjb25zdHJ1Y3RvcihkYXRhOiBJa0NvbnN0cmFpbnREYXRhLCBza2VsZXRvbjogU2tlbGV0b24pIHtcclxuICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcImRhdGEgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgaWYgKHNrZWxldG9uID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLm1peCA9IGRhdGEubWl4O1xyXG4gICAgdGhpcy5zb2Z0bmVzcyA9IGRhdGEuc29mdG5lc3M7XHJcbiAgICB0aGlzLmJlbmREaXJlY3Rpb24gPSBkYXRhLmJlbmREaXJlY3Rpb247XHJcbiAgICB0aGlzLmNvbXByZXNzID0gZGF0YS5jb21wcmVzcztcclxuICAgIHRoaXMuc3RyZXRjaCA9IGRhdGEuc3RyZXRjaDtcclxuICAgIHRoaXMuYm9uZXMgPSBuZXcgQXJyYXk8Qm9uZT4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5ib25lcy5sZW5ndGg7IGkrKylcclxuICAgICAgdGhpcy5ib25lcy5wdXNoKHNrZWxldG9uLmZpbmRCb25lKGRhdGEuYm9uZXNbaV0ubmFtZSkpO1xyXG4gICAgdGhpcy50YXJnZXQgPSBza2VsZXRvbi5maW5kQm9uZShkYXRhLnRhcmdldC5uYW1lKTtcclxuICB9XHJcbiAgaXNBY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XHJcbiAgfVxyXG4gIGFwcGx5KCkge1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcbiAgdXBkYXRlKCkge1xyXG4gICAgbGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0O1xyXG4gICAgbGV0IGJvbmVzID0gdGhpcy5ib25lcztcclxuICAgIHN3aXRjaCAoYm9uZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLmFwcGx5MShcclxuICAgICAgICAgIGJvbmVzWzBdLFxyXG4gICAgICAgICAgdGFyZ2V0LndvcmxkWCxcclxuICAgICAgICAgIHRhcmdldC53b3JsZFksXHJcbiAgICAgICAgICB0aGlzLmNvbXByZXNzLFxyXG4gICAgICAgICAgdGhpcy5zdHJldGNoLFxyXG4gICAgICAgICAgdGhpcy5kYXRhLnVuaWZvcm0sXHJcbiAgICAgICAgICB0aGlzLm1peFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICB0aGlzLmFwcGx5MihcclxuICAgICAgICAgIGJvbmVzWzBdLFxyXG4gICAgICAgICAgYm9uZXNbMV0sXHJcbiAgICAgICAgICB0YXJnZXQud29ybGRYLFxyXG4gICAgICAgICAgdGFyZ2V0LndvcmxkWSxcclxuICAgICAgICAgIHRoaXMuYmVuZERpcmVjdGlvbixcclxuICAgICAgICAgIHRoaXMuc3RyZXRjaCxcclxuICAgICAgICAgIHRoaXMuc29mdG5lc3MsXHJcbiAgICAgICAgICB0aGlzLm1peFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKiBBZGp1c3RzIHRoZSBib25lIHJvdGF0aW9uIHNvIHRoZSB0aXAgaXMgYXMgY2xvc2UgdG8gdGhlIHRhcmdldCBwb3NpdGlvbiBhcyBwb3NzaWJsZS4gVGhlIHRhcmdldCBpcyBzcGVjaWZpZWQgaW4gdGhlIHdvcmxkXHJcbiAgICogY29vcmRpbmF0ZSBzeXN0ZW0uICovXHJcbiAgYXBwbHkxKFxyXG4gICAgYm9uZTogQm9uZSxcclxuICAgIHRhcmdldFg6IG51bWJlcixcclxuICAgIHRhcmdldFk6IG51bWJlcixcclxuICAgIGNvbXByZXNzOiBib29sZWFuLFxyXG4gICAgc3RyZXRjaDogYm9vbGVhbixcclxuICAgIHVuaWZvcm06IGJvb2xlYW4sXHJcbiAgICBhbHBoYTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAoIWJvbmUuYXBwbGllZFZhbGlkKSBib25lLnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgIGxldCBwID0gYm9uZS5wYXJlbnQ7XHJcbiAgICBsZXQgaWQgPSAxIC8gKHAuYSAqIHAuZCAtIHAuYiAqIHAuYyk7XHJcbiAgICBsZXQgeCA9IHRhcmdldFggLSBwLndvcmxkWCxcclxuICAgICAgeSA9IHRhcmdldFkgLSBwLndvcmxkWTtcclxuICAgIGxldCB0eCA9ICh4ICogcC5kIC0geSAqIHAuYikgKiBpZCAtIGJvbmUuYXgsXHJcbiAgICAgIHR5ID0gKHkgKiBwLmEgLSB4ICogcC5jKSAqIGlkIC0gYm9uZS5heTtcclxuICAgIGxldCByb3RhdGlvbklLID1cclxuICAgICAgTWF0aC5hdGFuMih0eSwgdHgpICogTWF0aFV0aWxzLnJhZERlZyAtIGJvbmUuYXNoZWFyWCAtIGJvbmUuYXJvdGF0aW9uO1xyXG4gICAgaWYgKGJvbmUuYXNjYWxlWCA8IDApIHJvdGF0aW9uSUsgKz0gMTgwO1xyXG4gICAgaWYgKHJvdGF0aW9uSUsgPiAxODApIHJvdGF0aW9uSUsgLT0gMzYwO1xyXG4gICAgZWxzZSBpZiAocm90YXRpb25JSyA8IC0xODApIHJvdGF0aW9uSUsgKz0gMzYwO1xyXG4gICAgbGV0IHN4ID0gYm9uZS5hc2NhbGVYLFxyXG4gICAgICBzeSA9IGJvbmUuYXNjYWxlWTtcclxuICAgIGlmIChjb21wcmVzcyB8fCBzdHJldGNoKSB7XHJcbiAgICAgIGxldCBiID0gYm9uZS5kYXRhLmxlbmd0aCAqIHN4LFxyXG4gICAgICAgIGRkID0gTWF0aC5zcXJ0KHR4ICogdHggKyB0eSAqIHR5KTtcclxuICAgICAgaWYgKChjb21wcmVzcyAmJiBkZCA8IGIpIHx8IChzdHJldGNoICYmIGRkID4gYiAmJiBiID4gMC4wMDAxKSkge1xyXG4gICAgICAgIGxldCBzID0gKGRkIC8gYiAtIDEpICogYWxwaGEgKyAxO1xyXG4gICAgICAgIHN4ICo9IHM7XHJcbiAgICAgICAgaWYgKHVuaWZvcm0pIHN5ICo9IHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGJvbmUudXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoKFxyXG4gICAgICBib25lLmF4LFxyXG4gICAgICBib25lLmF5LFxyXG4gICAgICBib25lLmFyb3RhdGlvbiArIHJvdGF0aW9uSUsgKiBhbHBoYSxcclxuICAgICAgc3gsXHJcbiAgICAgIHN5LFxyXG4gICAgICBib25lLmFzaGVhclgsXHJcbiAgICAgIGJvbmUuYXNoZWFyWVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqIEFkanVzdHMgdGhlIHBhcmVudCBhbmQgY2hpbGQgYm9uZSByb3RhdGlvbnMgc28gdGhlIHRpcCBvZiB0aGUgY2hpbGQgaXMgYXMgY2xvc2UgdG8gdGhlIHRhcmdldCBwb3NpdGlvbiBhcyBwb3NzaWJsZS4gVGhlXHJcbiAgICogdGFyZ2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgd29ybGQgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcbiAgICogQHBhcmFtIGNoaWxkIEEgZGlyZWN0IGRlc2NlbmRhbnQgb2YgdGhlIHBhcmVudCBib25lLiAqL1xyXG4gIGFwcGx5MihcclxuICAgIHBhcmVudDogQm9uZSxcclxuICAgIGNoaWxkOiBCb25lLFxyXG4gICAgdGFyZ2V0WDogbnVtYmVyLFxyXG4gICAgdGFyZ2V0WTogbnVtYmVyLFxyXG4gICAgYmVuZERpcjogbnVtYmVyLFxyXG4gICAgc3RyZXRjaDogYm9vbGVhbixcclxuICAgIHNvZnRuZXNzOiBudW1iZXIsXHJcbiAgICBhbHBoYTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAoYWxwaGEgPT0gMCkge1xyXG4gICAgICBjaGlsZC51cGRhdGVXb3JsZFRyYW5zZm9ybSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXBhcmVudC5hcHBsaWVkVmFsaWQpIHBhcmVudC51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICBpZiAoIWNoaWxkLmFwcGxpZWRWYWxpZCkgY2hpbGQudXBkYXRlQXBwbGllZFRyYW5zZm9ybSgpO1xyXG4gICAgbGV0IHB4ID0gcGFyZW50LmF4LFxyXG4gICAgICBweSA9IHBhcmVudC5heSxcclxuICAgICAgcHN4ID0gcGFyZW50LmFzY2FsZVgsXHJcbiAgICAgIHN4ID0gcHN4LFxyXG4gICAgICBwc3kgPSBwYXJlbnQuYXNjYWxlWSxcclxuICAgICAgY3N4ID0gY2hpbGQuYXNjYWxlWDtcclxuICAgIGxldCBvczEgPSAwLFxyXG4gICAgICBvczIgPSAwLFxyXG4gICAgICBzMiA9IDA7XHJcbiAgICBpZiAocHN4IDwgMCkge1xyXG4gICAgICBwc3ggPSAtcHN4O1xyXG4gICAgICBvczEgPSAxODA7XHJcbiAgICAgIHMyID0gLTE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvczEgPSAwO1xyXG4gICAgICBzMiA9IDE7XHJcbiAgICB9XHJcbiAgICBpZiAocHN5IDwgMCkge1xyXG4gICAgICBwc3kgPSAtcHN5O1xyXG4gICAgICBzMiA9IC1zMjtcclxuICAgIH1cclxuICAgIGlmIChjc3ggPCAwKSB7XHJcbiAgICAgIGNzeCA9IC1jc3g7XHJcbiAgICAgIG9zMiA9IDE4MDtcclxuICAgIH0gZWxzZSBvczIgPSAwO1xyXG4gICAgbGV0IGN4ID0gY2hpbGQuYXgsXHJcbiAgICAgIGN5ID0gMCxcclxuICAgICAgY3d4ID0gMCxcclxuICAgICAgY3d5ID0gMCxcclxuICAgICAgYSA9IHBhcmVudC5hLFxyXG4gICAgICBiID0gcGFyZW50LmIsXHJcbiAgICAgIGMgPSBwYXJlbnQuYyxcclxuICAgICAgZCA9IHBhcmVudC5kO1xyXG4gICAgbGV0IHUgPSBNYXRoLmFicyhwc3ggLSBwc3kpIDw9IDAuMDAwMTtcclxuICAgIGlmICghdSkge1xyXG4gICAgICBjeSA9IDA7XHJcbiAgICAgIGN3eCA9IGEgKiBjeCArIHBhcmVudC53b3JsZFg7XHJcbiAgICAgIGN3eSA9IGMgKiBjeCArIHBhcmVudC53b3JsZFk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjeSA9IGNoaWxkLmF5O1xyXG4gICAgICBjd3ggPSBhICogY3ggKyBiICogY3kgKyBwYXJlbnQud29ybGRYO1xyXG4gICAgICBjd3kgPSBjICogY3ggKyBkICogY3kgKyBwYXJlbnQud29ybGRZO1xyXG4gICAgfVxyXG4gICAgbGV0IHBwID0gcGFyZW50LnBhcmVudDtcclxuICAgIGEgPSBwcC5hO1xyXG4gICAgYiA9IHBwLmI7XHJcbiAgICBjID0gcHAuYztcclxuICAgIGQgPSBwcC5kO1xyXG4gICAgbGV0IGlkID0gMSAvIChhICogZCAtIGIgKiBjKSxcclxuICAgICAgeCA9IGN3eCAtIHBwLndvcmxkWCxcclxuICAgICAgeSA9IGN3eSAtIHBwLndvcmxkWTtcclxuICAgIGxldCBkeCA9ICh4ICogZCAtIHkgKiBiKSAqIGlkIC0gcHgsXHJcbiAgICAgIGR5ID0gKHkgKiBhIC0geCAqIGMpICogaWQgLSBweTtcclxuICAgIGxldCBsMSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSksXHJcbiAgICAgIGwyID0gY2hpbGQuZGF0YS5sZW5ndGggKiBjc3gsXHJcbiAgICAgIGExLFxyXG4gICAgICBhMjtcclxuICAgIGlmIChsMSA8IDAuMDAwMSkge1xyXG4gICAgICB0aGlzLmFwcGx5MShwYXJlbnQsIHRhcmdldFgsIHRhcmdldFksIGZhbHNlLCBzdHJldGNoLCBmYWxzZSwgYWxwaGEpO1xyXG4gICAgICBjaGlsZC51cGRhdGVXb3JsZFRyYW5zZm9ybVdpdGgoXHJcbiAgICAgICAgY3gsXHJcbiAgICAgICAgY3ksXHJcbiAgICAgICAgMCxcclxuICAgICAgICBjaGlsZC5hc2NhbGVYLFxyXG4gICAgICAgIGNoaWxkLmFzY2FsZVksXHJcbiAgICAgICAgY2hpbGQuYXNoZWFyWCxcclxuICAgICAgICBjaGlsZC5hc2hlYXJZXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHggPSB0YXJnZXRYIC0gcHAud29ybGRYO1xyXG4gICAgeSA9IHRhcmdldFkgLSBwcC53b3JsZFk7XHJcbiAgICBsZXQgdHggPSAoeCAqIGQgLSB5ICogYikgKiBpZCAtIHB4LFxyXG4gICAgICB0eSA9ICh5ICogYSAtIHggKiBjKSAqIGlkIC0gcHk7XHJcbiAgICBsZXQgZGQgPSB0eCAqIHR4ICsgdHkgKiB0eTtcclxuICAgIGlmIChzb2Z0bmVzcyAhPSAwKSB7XHJcbiAgICAgIHNvZnRuZXNzICo9IChwc3ggKiAoY3N4ICsgMSkpIC8gMjtcclxuICAgICAgbGV0IHRkID0gTWF0aC5zcXJ0KGRkKSxcclxuICAgICAgICBzZCA9IHRkIC0gbDEgLSBsMiAqIHBzeCArIHNvZnRuZXNzO1xyXG4gICAgICBpZiAoc2QgPiAwKSB7XHJcbiAgICAgICAgbGV0IHAgPSBNYXRoLm1pbigxLCBzZCAvIChzb2Z0bmVzcyAqIDIpKSAtIDE7XHJcbiAgICAgICAgcCA9IChzZCAtIHNvZnRuZXNzICogKDEgLSBwICogcCkpIC8gdGQ7XHJcbiAgICAgICAgdHggLT0gcCAqIHR4O1xyXG4gICAgICAgIHR5IC09IHAgKiB0eTtcclxuICAgICAgICBkZCA9IHR4ICogdHggKyB0eSAqIHR5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBvdXRlcjogaWYgKHUpIHtcclxuICAgICAgbDIgKj0gcHN4O1xyXG4gICAgICBsZXQgY29zID0gKGRkIC0gbDEgKiBsMSAtIGwyICogbDIpIC8gKDIgKiBsMSAqIGwyKTtcclxuICAgICAgaWYgKGNvcyA8IC0xKSBjb3MgPSAtMTtcclxuICAgICAgZWxzZSBpZiAoY29zID4gMSkge1xyXG4gICAgICAgIGNvcyA9IDE7XHJcbiAgICAgICAgaWYgKHN0cmV0Y2gpIHN4ICo9IChNYXRoLnNxcnQoZGQpIC8gKGwxICsgbDIpIC0gMSkgKiBhbHBoYSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgYTIgPSBNYXRoLmFjb3MoY29zKSAqIGJlbmREaXI7XHJcbiAgICAgIGEgPSBsMSArIGwyICogY29zO1xyXG4gICAgICBiID0gbDIgKiBNYXRoLnNpbihhMik7XHJcbiAgICAgIGExID0gTWF0aC5hdGFuMih0eSAqIGEgLSB0eCAqIGIsIHR4ICogYSArIHR5ICogYik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhID0gcHN4ICogbDI7XHJcbiAgICAgIGIgPSBwc3kgKiBsMjtcclxuICAgICAgbGV0IGFhID0gYSAqIGEsXHJcbiAgICAgICAgYmIgPSBiICogYixcclxuICAgICAgICB0YSA9IE1hdGguYXRhbjIodHksIHR4KTtcclxuICAgICAgYyA9IGJiICogbDEgKiBsMSArIGFhICogZGQgLSBhYSAqIGJiO1xyXG4gICAgICBsZXQgYzEgPSAtMiAqIGJiICogbDEsXHJcbiAgICAgICAgYzIgPSBiYiAtIGFhO1xyXG4gICAgICBkID0gYzEgKiBjMSAtIDQgKiBjMiAqIGM7XHJcbiAgICAgIGlmIChkID49IDApIHtcclxuICAgICAgICBsZXQgcSA9IE1hdGguc3FydChkKTtcclxuICAgICAgICBpZiAoYzEgPCAwKSBxID0gLXE7XHJcbiAgICAgICAgcSA9IC0oYzEgKyBxKSAvIDI7XHJcbiAgICAgICAgbGV0IHIwID0gcSAvIGMyLFxyXG4gICAgICAgICAgcjEgPSBjIC8gcTtcclxuICAgICAgICBsZXQgciA9IE1hdGguYWJzKHIwKSA8IE1hdGguYWJzKHIxKSA/IHIwIDogcjE7XHJcbiAgICAgICAgaWYgKHIgKiByIDw9IGRkKSB7XHJcbiAgICAgICAgICB5ID0gTWF0aC5zcXJ0KGRkIC0gciAqIHIpICogYmVuZERpcjtcclxuICAgICAgICAgIGExID0gdGEgLSBNYXRoLmF0YW4yKHksIHIpO1xyXG4gICAgICAgICAgYTIgPSBNYXRoLmF0YW4yKHkgLyBwc3ksIChyIC0gbDEpIC8gcHN4KTtcclxuICAgICAgICAgIGJyZWFrIG91dGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgbWluQW5nbGUgPSBNYXRoVXRpbHMuUEksXHJcbiAgICAgICAgbWluWCA9IGwxIC0gYSxcclxuICAgICAgICBtaW5EaXN0ID0gbWluWCAqIG1pblgsXHJcbiAgICAgICAgbWluWSA9IDA7XHJcbiAgICAgIGxldCBtYXhBbmdsZSA9IDAsXHJcbiAgICAgICAgbWF4WCA9IGwxICsgYSxcclxuICAgICAgICBtYXhEaXN0ID0gbWF4WCAqIG1heFgsXHJcbiAgICAgICAgbWF4WSA9IDA7XHJcbiAgICAgIGMgPSAoLWEgKiBsMSkgLyAoYWEgLSBiYik7XHJcbiAgICAgIGlmIChjID49IC0xICYmIGMgPD0gMSkge1xyXG4gICAgICAgIGMgPSBNYXRoLmFjb3MoYyk7XHJcbiAgICAgICAgeCA9IGEgKiBNYXRoLmNvcyhjKSArIGwxO1xyXG4gICAgICAgIHkgPSBiICogTWF0aC5zaW4oYyk7XHJcbiAgICAgICAgZCA9IHggKiB4ICsgeSAqIHk7XHJcbiAgICAgICAgaWYgKGQgPCBtaW5EaXN0KSB7XHJcbiAgICAgICAgICBtaW5BbmdsZSA9IGM7XHJcbiAgICAgICAgICBtaW5EaXN0ID0gZDtcclxuICAgICAgICAgIG1pblggPSB4O1xyXG4gICAgICAgICAgbWluWSA9IHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkID4gbWF4RGlzdCkge1xyXG4gICAgICAgICAgbWF4QW5nbGUgPSBjO1xyXG4gICAgICAgICAgbWF4RGlzdCA9IGQ7XHJcbiAgICAgICAgICBtYXhYID0geDtcclxuICAgICAgICAgIG1heFkgPSB5O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoZGQgPD0gKG1pbkRpc3QgKyBtYXhEaXN0KSAvIDIpIHtcclxuICAgICAgICBhMSA9IHRhIC0gTWF0aC5hdGFuMihtaW5ZICogYmVuZERpciwgbWluWCk7XHJcbiAgICAgICAgYTIgPSBtaW5BbmdsZSAqIGJlbmREaXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYTEgPSB0YSAtIE1hdGguYXRhbjIobWF4WSAqIGJlbmREaXIsIG1heFgpO1xyXG4gICAgICAgIGEyID0gbWF4QW5nbGUgKiBiZW5kRGlyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgb3MgPSBNYXRoLmF0YW4yKGN5LCBjeCkgKiBzMjtcclxuICAgIGxldCByb3RhdGlvbiA9IHBhcmVudC5hcm90YXRpb247XHJcbiAgICBhMSA9IChhMSAtIG9zKSAqIE1hdGhVdGlscy5yYWREZWcgKyBvczEgLSByb3RhdGlvbjtcclxuICAgIGlmIChhMSA+IDE4MCkgYTEgLT0gMzYwO1xyXG4gICAgZWxzZSBpZiAoYTEgPCAtMTgwKSBhMSArPSAzNjA7XHJcbiAgICBwYXJlbnQudXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoKFxyXG4gICAgICBweCxcclxuICAgICAgcHksXHJcbiAgICAgIHJvdGF0aW9uICsgYTEgKiBhbHBoYSxcclxuICAgICAgc3gsXHJcbiAgICAgIHBhcmVudC5hc2NhbGVZLFxyXG4gICAgICAwLFxyXG4gICAgICAwXHJcbiAgICApO1xyXG4gICAgcm90YXRpb24gPSBjaGlsZC5hcm90YXRpb247XHJcbiAgICBhMiA9ICgoYTIgKyBvcykgKiBNYXRoVXRpbHMucmFkRGVnIC0gY2hpbGQuYXNoZWFyWCkgKiBzMiArIG9zMiAtIHJvdGF0aW9uO1xyXG4gICAgaWYgKGEyID4gMTgwKSBhMiAtPSAzNjA7XHJcbiAgICBlbHNlIGlmIChhMiA8IC0xODApIGEyICs9IDM2MDtcclxuICAgIGNoaWxkLnVwZGF0ZVdvcmxkVHJhbnNmb3JtV2l0aChcclxuICAgICAgY3gsXHJcbiAgICAgIGN5LFxyXG4gICAgICByb3RhdGlvbiArIGEyICogYWxwaGEsXHJcbiAgICAgIGNoaWxkLmFzY2FsZVgsXHJcbiAgICAgIGNoaWxkLmFzY2FsZVksXHJcbiAgICAgIGNoaWxkLmFzaGVhclgsXHJcbiAgICAgIGNoaWxkLmFzaGVhcllcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==