UNPKG

@esotericsoftware/spine-core

Version:
172 lines 27.7 kB
/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Utils } from "../Utils.js"; /** The base class for all attachments. Multiple {@link Skeleton} instances, slots, or skins can use the same attachments. */ export class Attachment { static empty = []; name; /** Timelines for the timeline attachment are also applied to this attachment. * @return May be null if no attachment-specific timelines should be applied. */ timelineAttachment; /** Slots that can have attachments whose {@link timelineAttachment} is this attachment. */ timelineSlots = Attachment.empty; constructor(name) { if (!name) throw new Error("name cannot be null."); this.name = name; this.timelineAttachment = this; } /** Returns true if the {@code slotIndex} or any {@link timelineSlots} have an attachment whose {@link timelineAttachment} is * this attachment. * @param slots The {@link Skeleton.slots}. * @param slotIndex The timeline's primary slot index. */ isTimelineActive(slots, slotIndex, appliedPose) { let slot = slots[slotIndex]; if (slot.bone.isActive()) { const other = (appliedPose ? slot.getAppliedPose() : slot.getPose()).getAttachment(); if (other != null && other.timelineAttachment === this) return true; } for (let i = 0, n = this.timelineSlots.length; i < n; i++) { slot = slots[this.timelineSlots[i]]; if (!slot.bone.isActive()) continue; const other = (appliedPose ? slot.getAppliedPose() : slot.getPose()).getAttachment(); if (other != null && other.timelineAttachment === this) return true; } return false; } } /** Base class for an attachment with vertices that are transformed by one or more bones and can be deformed by * {@link SlotPose.deform}. */ export class VertexAttachment extends Attachment { static nextID = 0; /** The unique ID for this attachment. */ id = VertexAttachment.nextID++; /** The bones that affect the {@link vertices}. The entries are, for each vertex, the number of bones affecting the vertex * followed by that many bone indices, which is {@link Skeleton.getBones} index. Null if this attachment has no weights. */ bones = null; /** The vertex positions in the bone's coordinate system. For a non-weighted attachment, the values are `x,y` * entries for each vertex. For a weighted attachment, the values are `x,y,weight` triplets for each bone affecting * each vertex. */ vertices = []; /** The maximum number of world vertex values that can be output by * {@link computeWorldVertices} using the `count` parameter. */ worldVerticesLength = 0; constructor(name) { super(name); } /** Transforms the attachment's local {@link vertices} to world coordinates. If {@link SlotPose.getDeform} is not empty, it * is used to deform the vertices. * * See <a href="https://esotericsoftware.com/spine-runtime-skeletons#World-transforms">World transforms</a> in the Spine * Runtimes Guide. * @param start The index of the first {@link vertices} value to transform. Each vertex has 2 values, x and y. * @param count The number of world vertex values to output. Must be <= {@link worldVerticesLength} - `start`. * @param worldVertices The output world vertices. Must have a length >= `offset` + `count` * * `stride` / 2. * @param offset The `worldVertices` index to begin writing values. * @param stride The number of `worldVertices` entries between the value pairs written. */ computeWorldVertices(skeleton, slot, start, count, worldVertices, offset, stride) { count = offset + (count >> 1) * stride; const deformArray = slot.appliedPose.deform; let vertices = this.vertices; const bones = this.bones; if (!bones) { if (deformArray.length > 0) vertices = deformArray; const bone = slot.bone.appliedPose; const x = bone.worldX; const y = bone.worldY; const a = bone.a, b = bone.b, c = bone.c, d = bone.d; for (let v = start, w = offset; w < count; v += 2, w += stride) { const vx = vertices[v], vy = vertices[v + 1]; worldVertices[w] = vx * a + vy * b + x; worldVertices[w + 1] = vx * c + vy * d + y; } return; } let v = 0, skip = 0; for (let i = 0; i < start; i += 2) { const n = bones[v]; v += n + 1; skip += n; } const skeletonBones = skeleton.bones; if (deformArray.length === 0) { for (let w = offset, b = skip * 3; w < count; w += stride) { let wx = 0, wy = 0; let n = bones[v++]; n += v; for (; v < n; v++, b += 3) { const bone = skeletonBones[bones[v]].appliedPose; const vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; } worldVertices[w] = wx; worldVertices[w + 1] = wy; } } else { const deform = deformArray; for (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) { let wx = 0, wy = 0; let n = bones[v++]; n += v; for (; v < n; v++, b += 3, f += 2) { const bone = skeletonBones[bones[v]].appliedPose; const vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2]; wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; } worldVertices[w] = wx; worldVertices[w + 1] = wy; } } } /** Does not copy id (generated) or name (set on construction). **/ copyTo(attachment) { if (this.bones) { attachment.bones = []; Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length); } else attachment.bones = null; if (this.vertices) { attachment.vertices = Utils.newFloatArray(this.vertices.length); Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length); } attachment.worldVerticesLength = this.worldVerticesLength; attachment.timelineAttachment = this.timelineAttachment; attachment.timelineSlots = this.timelineSlots; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdHRhY2htZW50cy9BdHRhY2htZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUsvRSxPQUFPLEVBQXdCLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUxRCw2SEFBNkg7QUFDN0gsTUFBTSxPQUFnQixVQUFVO0lBQ3ZCLE1BQU0sQ0FBVSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBRTdDLElBQUksQ0FBUztJQUViO29GQUNnRjtJQUNoRixrQkFBa0IsQ0FBYztJQUVoQywyRkFBMkY7SUFDM0YsYUFBYSxHQUFhLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFM0MsWUFBYSxJQUFZO1FBQ3hCLElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUlEOzs7NkRBR3lEO0lBQ2xELGdCQUFnQixDQUFFLEtBQWEsRUFBRSxTQUFpQixFQUFFLFdBQW9CO1FBQzlFLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUMxQixNQUFNLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyRixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLGtCQUFrQixLQUFLLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFD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QUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUVELFVBQVUsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDMUQsVUFBVSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUN4RCxVQUFVLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuLi9Ta2VsZXRvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTbG90IH0gZnJvbSBcIi4uL1Nsb3QuanNcIjtcbmltcG9ydCB0eXBlIHsgU2xvdFBvc2UgfSBmcm9tIFwiLi4vU2xvdFBvc2UuanNcIjtcbmltcG9ydCB7IHR5cGUgTnVtYmVyQXJyYXlMaWtlLCBVdGlscyB9IGZyb20gXCIuLi9VdGlscy5qc1wiO1xuXG4vKiogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBhdHRhY2htZW50cy4gTXVsdGlwbGUge0BsaW5rIFNrZWxldG9ufSBpbnN0YW5jZXMsIHNsb3RzLCBvciBza2lucyBjYW4gdXNlIHRoZSBzYW1lIGF0dGFjaG1lbnRzLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF0dGFjaG1lbnQge1xuXHRwcml2YXRlIHN0YXRpYyByZWFkb25seSBlbXB0eTogbnVtYmVyW10gPSBbXTtcblxuXHRuYW1lOiBzdHJpbmc7XG5cblx0LyoqIFRpbWVsaW5lcyBmb3IgdGhlIHRpbWVsaW5lIGF0dGFjaG1lbnQgYXJlIGFsc28gYXBwbGllZCB0byB0aGlzIGF0dGFjaG1lbnQuXG5cdCAqIEByZXR1cm4gTWF5IGJlIG51bGwgaWYgbm8gYXR0YWNobWVudC1zcGVjaWZpYyB0aW1lbGluZXMgc2hvdWxkIGJlIGFwcGxpZWQuICovXG5cdHRpbWVsaW5lQXR0YWNobWVudD86IEF0dGFjaG1lbnQ7XG5cblx0LyoqIFNsb3RzIHRoYXQgY2FuIGhhdmUgYXR0YWNobWVudHMgd2hvc2Uge0BsaW5rIHRpbWVsaW5lQXR0YWNobWVudH0gaXMgdGhpcyBhdHRhY2htZW50LiAqL1xuXHR0aW1lbGluZVNsb3RzOiBudW1iZXJbXSA9IEF0dGFjaG1lbnQuZW1wdHk7XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZykge1xuXHRcdGlmICghbmFtZSkgdGhyb3cgbmV3IEVycm9yKFwibmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLnRpbWVsaW5lQXR0YWNobWVudCA9IHRoaXM7XG5cdH1cblxuXHRhYnN0cmFjdCBjb3B5ICgpOiBBdHRhY2htZW50O1xuXG5cdC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAY29kZSBzbG90SW5kZXh9IG9yIGFueSB7QGxpbmsgdGltZWxpbmVTbG90c30gaGF2ZSBhbiBhdHRhY2htZW50IHdob3NlIHtAbGluayB0aW1lbGluZUF0dGFjaG1lbnR9IGlzXG5cdCAqIHRoaXMgYXR0YWNobWVudC5cblx0ICogQHBhcmFtIHNsb3RzIFRoZSB7QGxpbmsgU2tlbGV0b24uc2xvdHN9LlxuXHQgKiBAcGFyYW0gc2xvdEluZGV4IFRoZSB0aW1lbGluZSdzIHByaW1hcnkgc2xvdCBpbmRleC4gKi9cblx0cHVibGljIGlzVGltZWxpbmVBY3RpdmUgKHNsb3RzOiBTbG90W10sIHNsb3RJbmRleDogbnVtYmVyLCBhcHBsaWVkUG9zZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGxldCBzbG90ID0gc2xvdHNbc2xvdEluZGV4XTtcblx0XHRpZiAoc2xvdC5ib25lLmlzQWN0aXZlKCkpIHtcblx0XHRcdGNvbnN0IG90aGVyID0gKGFwcGxpZWRQb3NlID8gc2xvdC5nZXRBcHBsaWVkUG9zZSgpIDogc2xvdC5nZXRQb3NlKCkpLmdldEF0dGFjaG1lbnQoKTtcblx0XHRcdGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyLnRpbWVsaW5lQXR0YWNobWVudCA9PT0gdGhpcykgcmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy50aW1lbGluZVNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0c2xvdCA9IHNsb3RzW3RoaXMudGltZWxpbmVTbG90c1tpXV07XG5cdFx0XHRpZiAoIXNsb3QuYm9uZS5pc0FjdGl2ZSgpKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IG90aGVyID0gKGFwcGxpZWRQb3NlID8gc2xvdC5nZXRBcHBsaWVkUG9zZSgpIDogc2xvdC5nZXRQb3NlKCkpLmdldEF0dGFjaG1lbnQoKTtcblx0XHRcdGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyLnRpbWVsaW5lQXR0YWNobWVudCA9PT0gdGhpcykgcmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG4vKiogQmFzZSBjbGFzcyBmb3IgYW4gYXR0YWNobWVudCB3aXRoIHZlcnRpY2VzIHRoYXQgYXJlIHRyYW5zZm9ybWVkIGJ5IG9uZSBvciBtb3JlIGJvbmVzIGFuZCBjYW4gYmUgZGVmb3JtZWQgYnlcbiAqIHtAbGluayBTbG90UG9zZS5kZWZvcm19LiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZlcnRleEF0dGFjaG1lbnQgZXh0ZW5kcyBBdHRhY2htZW50IHtcblx0cHJpdmF0ZSBzdGF0aWMgbmV4dElEID0gMDtcblxuXHQvKiogVGhlIHVuaXF1ZSBJRCBmb3IgdGhpcyBhdHRhY2htZW50LiAqL1xuXHRpZCA9IFZlcnRleEF0dGFjaG1lbnQubmV4dElEKys7XG5cblx0LyoqIFRoZSBib25lcyB0aGF0IGFmZmVjdCB0aGUge0BsaW5rIHZlcnRpY2VzfS4gVGhlIGVudHJpZXMgYXJlLCBmb3IgZWFjaCB2ZXJ0ZXgsIHRoZSBudW1iZXIgb2YgYm9uZXMgYWZmZWN0aW5nIHRoZSB2ZXJ0ZXhcblx0ICogZm9sbG93ZWQgYnkgdGhhdCBtYW55IGJvbmUgaW5kaWNlcywgd2hpY2ggaXMge0BsaW5rIFNrZWxldG9uLmdldEJvbmVzfSBpbmRleC4gTnVsbCBpZiB0aGlzIGF0dGFjaG1lbnQgaGFzIG5vIHdlaWdodHMuICovXG5cdGJvbmVzOiBBcnJheTxudW1iZXI+IHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIFRoZSB2ZXJ0ZXggcG9zaXRpb25zIGluIHRoZSBib25lJ3MgY29vcmRpbmF0ZSBzeXN0ZW0uIEZvciBhIG5vbi13ZWlnaHRlZCBhdHRhY2htZW50LCB0aGUgdmFsdWVzIGFyZSBgeCx5YFxuXHQgKiBlbnRyaWVzIGZvciBlYWNoIHZlcnRleC4gRm9yIGEgd2VpZ2h0ZWQgYXR0YWNobWVudCwgdGhlIHZhbHVlcyBhcmUgYHgseSx3ZWlnaHRgIHRyaXBsZXRzIGZvciBlYWNoIGJvbmUgYWZmZWN0aW5nXG5cdCAqIGVhY2ggdmVydGV4LiAqL1xuXHR2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlID0gW107XG5cblx0LyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JsZCB2ZXJ0ZXggdmFsdWVzIHRoYXQgY2FuIGJlIG91dHB1dCBieVxuXHQgKiB7QGxpbmsgY29tcHV0ZVdvcmxkVmVydGljZXN9IHVzaW5nIHRoZSBgY291bnRgIHBhcmFtZXRlci4gKi9cblx0d29ybGRWZXJ0aWNlc0xlbmd0aCA9IDA7XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUpO1xuXHR9XG5cblx0LyoqIFRyYW5zZm9ybXMgdGhlIGF0dGFjaG1lbnQncyBsb2NhbCB7QGxpbmsgdmVydGljZXN9IHRvIHdvcmxkIGNvb3JkaW5hdGVzLiBJZiB7QGxpbmsgU2xvdFBvc2UuZ2V0RGVmb3JtfSBpcyBub3QgZW1wdHksIGl0XG5cdCAqIGlzIHVzZWQgdG8gZGVmb3JtIHRoZSB2ZXJ0aWNlcy5cblx0ICpcblx0ICogU2VlIDxhIGhyZWY9XCJodHRwczovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtc2tlbGV0b25zI1dvcmxkLXRyYW5zZm9ybXNcIj5Xb3JsZCB0cmFuc2Zvcm1zPC9hPiBpbiB0aGUgU3BpbmVcblx0ICogUnVudGltZXMgR3VpZGUuXG5cdCAqIEBwYXJhbSBzdGFydCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHtAbGluayB2ZXJ0aWNlc30gdmFsdWUgdG8gdHJhbnNmb3JtLiBFYWNoIHZlcnRleCBoYXMgMiB2YWx1ZXMsIHggYW5kIHkuXG5cdCAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIHdvcmxkIHZlcnRleCB2YWx1ZXMgdG8gb3V0cHV0LiBNdXN0IGJlIDw9IHtAbGluayB3b3JsZFZlcnRpY2VzTGVuZ3RofSAtIGBzdGFydGAuXG5cdCAqIEBwYXJhbSB3b3JsZFZlcnRpY2VzIFRoZSBvdXRwdXQgd29ybGQgdmVydGljZXMuIE11c3QgaGF2ZSBhIGxlbmd0aCA+PSBgb2Zmc2V0YCArIGBjb3VudGAgKlxuXHQgKiAgICAgICAgICAgYHN0cmlkZWAgLyAyLlxuXHQgKiBAcGFyYW0gb2Zmc2V0IFRoZSBgd29ybGRWZXJ0aWNlc2AgaW5kZXggdG8gYmVnaW4gd3JpdGluZyB2YWx1ZXMuXG5cdCAqIEBwYXJhbSBzdHJpZGUgVGhlIG51bWJlciBvZiBgd29ybGRWZXJ0aWNlc2AgZW50cmllcyBiZXR3ZWVuIHRoZSB2YWx1ZSBwYWlycyB3cml0dGVuLiAqL1xuXHRjb21wdXRlV29ybGRWZXJ0aWNlcyAoc2tlbGV0b246IFNrZWxldG9uLCBzbG90OiBTbG90LCBzdGFydDogbnVtYmVyLCBjb3VudDogbnVtYmVyLCB3b3JsZFZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIG9mZnNldDogbnVtYmVyLFxuXHRcdHN0cmlkZTogbnVtYmVyKSB7XG5cblx0XHRjb3VudCA9IG9mZnNldCArIChjb3VudCA+PiAxKSAqIHN0cmlkZTtcblx0XHRjb25zdCBkZWZvcm1BcnJheSA9IHNsb3QuYXBwbGllZFBvc2UuZGVmb3JtO1xuXHRcdGxldCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdGlmICghYm9uZXMpIHtcblx0XHRcdGlmIChkZWZvcm1BcnJheS5sZW5ndGggPiAwKSB2ZXJ0aWNlcyA9IGRlZm9ybUFycmF5O1xuXHRcdFx0Y29uc3QgYm9uZSA9IHNsb3QuYm9uZS5hcHBsaWVkUG9zZTtcblx0XHRcdGNvbnN0IHggPSBib25lLndvcmxkWDtcblx0XHRcdGNvbnN0IHkgPSBib25lLndvcmxkWTtcblx0XHRcdGNvbnN0IGEgPSBib25lLmEsIGIgPSBib25lLmIsIGMgPSBib25lLmMsIGQgPSBib25lLmQ7XG5cdFx0XHRmb3IgKGxldCB2ID0gc3RhcnQsIHcgPSBvZmZzZXQ7IHcgPCBjb3VudDsgdiArPSAyLCB3ICs9IHN0cmlkZSkge1xuXHRcdFx0XHRjb25zdCB2eCA9IHZlcnRpY2VzW3ZdLCB2eSA9IHZlcnRpY2VzW3YgKyAxXTtcblx0XHRcdFx0d29ybGRWZXJ0aWNlc1t3XSA9IHZ4ICogYSArIHZ5ICogYiArIHg7XG5cdFx0XHRcdHdvcmxkVmVydGljZXNbdyArIDFdID0gdnggKiBjICsgdnkgKiBkICsgeTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IHYgPSAwLCBza2lwID0gMDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHN0YXJ0OyBpICs9IDIpIHtcblx0XHRcdGNvbnN0IG4gPSBib25lc1t2XTtcblx0XHRcdHYgKz0gbiArIDE7XG5cdFx0XHRza2lwICs9IG47XG5cdFx0fVxuXHRcdGNvbnN0IHNrZWxldG9uQm9uZXMgPSBza2VsZXRvbi5ib25lcztcblx0XHRpZiAoZGVmb3JtQXJyYXkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRmb3IgKGxldCB3ID0gb2Zmc2V0LCBiID0gc2tpcCAqIDM7IHcgPCBjb3VudDsgdyArPSBzdHJpZGUpIHtcblx0XHRcdFx0bGV0IHd4ID0gMCwgd3kgPSAwO1xuXHRcdFx0XHRsZXQgbiA9IGJvbmVzW3YrK107XG5cdFx0XHRcdG4gKz0gdjtcblx0XHRcdFx0Zm9yICg7IHYgPCBuOyB2KyssIGIgKz0gMykge1xuXHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkJvbmVzW2JvbmVzW3ZdXS5hcHBsaWVkUG9zZTtcblx0XHRcdFx0XHRjb25zdCB2eCA9IHZlcnRpY2VzW2JdLCB2eSA9IHZlcnRpY2VzW2IgKyAxXSwgd2VpZ2h0ID0gdmVydGljZXNbYiArIDJdO1xuXHRcdFx0XHRcdHd4ICs9ICh2eCAqIGJvbmUuYSArIHZ5ICogYm9uZS5iICsgYm9uZS53b3JsZFgpICogd2VpZ2h0O1xuXHRcdFx0XHRcdHd5ICs9ICh2eCAqIGJvbmUuYyArIHZ5ICogYm9uZS5kICsgYm9uZS53b3JsZFkpICogd2VpZ2h0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHdvcmxkVmVydGljZXNbd10gPSB3eDtcblx0XHRcdFx0d29ybGRWZXJ0aWNlc1t3ICsgMV0gPSB3eTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgZGVmb3JtID0gZGVmb3JtQXJyYXk7XG5cdFx0XHRmb3IgKGxldCB3ID0gb2Zmc2V0LCBiID0gc2tpcCAqIDMsIGYgPSBza2lwIDw8IDE7IHcgPCBjb3VudDsgdyArPSBzdHJpZGUpIHtcblx0XHRcdFx0bGV0IHd4ID0gMCwgd3kgPSAwO1xuXHRcdFx0XHRsZXQgbiA9IGJvbmVzW3YrK107XG5cdFx0XHRcdG4gKz0gdjtcblx0XHRcdFx0Zm9yICg7IHYgPCBuOyB2KyssIGIgKz0gMywgZiArPSAyKSB7XG5cdFx0XHRcdFx0Y29uc3QgYm9uZSA9IHNrZWxldG9uQm9uZXNbYm9uZXNbdl1dLmFwcGxpZWRQb3NlO1xuXHRcdFx0XHRcdGNvbnN0IHZ4ID0gdmVydGljZXNbYl0gKyBkZWZvcm1bZl0sIHZ5ID0gdmVydGljZXNbYiArIDFdICsgZGVmb3JtW2YgKyAxXSwgd2VpZ2h0ID0gdmVydGljZXNbYiArIDJdO1xuXHRcdFx0XHRcdHd4ICs9ICh2eCAqIGJvbmUuYSArIHZ5ICogYm9uZS5iICsgYm9uZS53b3JsZFgpICogd2VpZ2h0O1xuXHRcdFx0XHRcdHd5ICs9ICh2eCAqIGJvbmUuYyArIHZ5ICogYm9uZS5kICsgYm9uZS53b3JsZFkpICogd2VpZ2h0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHdvcmxkVmVydGljZXNbd10gPSB3eDtcblx0XHRcdFx0d29ybGRWZXJ0aWNlc1t3ICsgMV0gPSB3eTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKiogRG9lcyBub3QgY29weSBpZCAoZ2VuZXJhdGVkKSBvciBuYW1lIChzZXQgb24gY29uc3RydWN0aW9uKS4gKiovXG5cdGNvcHlUbyAoYXR0YWNobWVudDogVmVydGV4QXR0YWNobWVudCkge1xuXHRcdGlmICh0aGlzLmJvbmVzKSB7XG5cdFx0XHRhdHRhY2htZW50LmJvbmVzID0gW107XG5cdFx0XHRVdGlscy5hcnJheUNvcHkodGhpcy5ib25lcywgMCwgYXR0YWNobWVudC5ib25lcywgMCwgdGhpcy5ib25lcy5sZW5ndGgpO1xuXHRcdH0gZWxzZVxuXHRcdFx0YXR0YWNobWVudC5ib25lcyA9IG51bGw7XG5cblx0XHRpZiAodGhpcy52ZXJ0aWNlcykge1xuXHRcdFx0YXR0YWNobWVudC52ZXJ0aWNlcyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkodGhpcy52ZXJ0aWNlcy5sZW5ndGgpO1xuXHRcdFx0VXRpbHMuYXJyYXlDb3B5KHRoaXMudmVydGljZXMsIDAsIGF0dGFjaG1lbnQudmVydGljZXMsIDAsIHRoaXMudmVydGljZXMubGVuZ3RoKTtcblx0XHR9XG5cblx0XHRhdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGggPSB0aGlzLndvcmxkVmVydGljZXNMZW5ndGg7XG5cdFx0YXR0YWNobWVudC50aW1lbGluZUF0dGFjaG1lbnQgPSB0aGlzLnRpbWVsaW5lQXR0YWNobWVudDtcblx0XHRhdHRhY2htZW50LnRpbWVsaW5lU2xvdHMgPSB0aGlzLnRpbWVsaW5lU2xvdHM7XG5cdH1cbn1cbiJdfQ==