ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
322 lines • 29 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 { MeshAttachment } from "./attachments/MeshAttachment";
var SkinEntry = /** @class */ (function () {
function SkinEntry(slotIndex, name, attachment) {
this.slotIndex = slotIndex;
this.name = name;
this.attachment = attachment;
}
return SkinEntry;
}());
export { SkinEntry };
if (false) {
/** @type {?} */
SkinEntry.prototype.slotIndex;
/** @type {?} */
SkinEntry.prototype.name;
/** @type {?} */
SkinEntry.prototype.attachment;
}
var Skin = /** @class */ (function () {
function Skin(name) {
this.attachments = new Array();
this.bones = Array();
this.constraints = new Array();
if (name == null)
throw new Error("name cannot be null.");
this.name = name;
}
/**
* @param {?} slotIndex
* @param {?} name
* @param {?} attachment
* @return {?}
*/
Skin.prototype.setAttachment = /**
* @param {?} slotIndex
* @param {?} name
* @param {?} attachment
* @return {?}
*/
function (slotIndex, name, attachment) {
if (attachment == null)
throw new Error("attachment cannot be null.");
/** @type {?} */
var attachments = this.attachments;
if (slotIndex >= attachments.length)
attachments.length = slotIndex + 1;
if (!attachments[slotIndex])
attachments[slotIndex] = {};
attachments[slotIndex][name] = attachment;
};
/**
* @param {?} skin
* @return {?}
*/
Skin.prototype.addSkin = /**
* @param {?} skin
* @return {?}
*/
function (skin) {
for (var i = 0; i < skin.bones.length; i++) {
/** @type {?} */
var bone = skin.bones[i];
/** @type {?} */
var contained = false;
for (var j = 0; j < this.bones.length; j++) {
if (this.bones[j] == bone) {
contained = true;
break;
}
}
if (!contained)
this.bones.push(bone);
}
for (var i = 0; i < skin.constraints.length; i++) {
/** @type {?} */
var constraint = skin.constraints[i];
/** @type {?} */
var contained = false;
for (var j = 0; j < this.constraints.length; j++) {
if (this.constraints[j] == constraint) {
contained = true;
break;
}
}
if (!contained)
this.constraints.push(constraint);
}
/** @type {?} */
var attachments = skin.getAttachments();
for (var i = 0; i < attachments.length; i++) {
/** @type {?} */
var attachment = attachments[i];
this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
}
};
/**
* @param {?} skin
* @return {?}
*/
Skin.prototype.copySkin = /**
* @param {?} skin
* @return {?}
*/
function (skin) {
for (var i = 0; i < skin.bones.length; i++) {
/** @type {?} */
var bone = skin.bones[i];
/** @type {?} */
var contained = false;
for (var j = 0; j < this.bones.length; j++) {
if (this.bones[j] == bone) {
contained = true;
break;
}
}
if (!contained)
this.bones.push(bone);
}
for (var i = 0; i < skin.constraints.length; i++) {
/** @type {?} */
var constraint = skin.constraints[i];
/** @type {?} */
var contained = false;
for (var j = 0; j < this.constraints.length; j++) {
if (this.constraints[j] == constraint) {
contained = true;
break;
}
}
if (!contained)
this.constraints.push(constraint);
}
/** @type {?} */
var attachments = skin.getAttachments();
for (var i = 0; i < attachments.length; i++) {
/** @type {?} */
var attachment = attachments[i];
if (attachment.attachment == null)
continue;
if (attachment.attachment instanceof MeshAttachment) {
attachment.attachment = attachment.attachment.newLinkedMesh();
this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
}
else {
attachment.attachment = attachment.attachment.copy();
this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
}
}
};
/** @return May be null. */
/**
* @param {?} slotIndex
* @param {?} name
* @return {?} May be null.
*/
Skin.prototype.getAttachment = /**
* @param {?} slotIndex
* @param {?} name
* @return {?} May be null.
*/
function (slotIndex, name) {
/** @type {?} */
var dictionary = this.attachments[slotIndex];
return dictionary ? dictionary[name] : null;
};
/**
* @param {?} slotIndex
* @param {?} name
* @return {?}
*/
Skin.prototype.removeAttachment = /**
* @param {?} slotIndex
* @param {?} name
* @return {?}
*/
function (slotIndex, name) {
/** @type {?} */
var dictionary = this.attachments[slotIndex];
if (dictionary)
dictionary[name] = null;
};
/**
* @return {?}
*/
Skin.prototype.getAttachments = /**
* @return {?}
*/
function () {
/** @type {?} */
var entries = new Array();
for (var i = 0; i < this.attachments.length; i++) {
/** @type {?} */
var slotAttachments = this.attachments[i];
if (slotAttachments) {
for (var name_1 in slotAttachments) {
/** @type {?} */
var attachment = slotAttachments[name_1];
if (attachment)
entries.push(new SkinEntry(i, name_1, attachment));
}
}
}
return entries;
};
/**
* @param {?} slotIndex
* @param {?} attachments
* @return {?}
*/
Skin.prototype.getAttachmentsForSlot = /**
* @param {?} slotIndex
* @param {?} attachments
* @return {?}
*/
function (slotIndex, attachments) {
/** @type {?} */
var slotAttachments = this.attachments[slotIndex];
if (slotAttachments) {
for (var name_2 in slotAttachments) {
/** @type {?} */
var attachment = slotAttachments[name_2];
if (attachment)
attachments.push(new SkinEntry(slotIndex, name_2, attachment));
}
}
};
/**
* @return {?}
*/
Skin.prototype.clear = /**
* @return {?}
*/
function () {
this.attachments.length = 0;
this.bones.length = 0;
this.constraints.length = 0;
};
/** Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached. */
/**
* Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached.
* @param {?} skeleton
* @param {?} oldSkin
* @return {?}
*/
Skin.prototype.attachAll = /**
* Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached.
* @param {?} skeleton
* @param {?} oldSkin
* @return {?}
*/
function (skeleton, oldSkin) {
/** @type {?} */
var slotIndex = 0;
for (var i = 0; i < skeleton.slots.length; i++) {
/** @type {?} */
var slot = skeleton.slots[i];
/** @type {?} */
var slotAttachment = slot.getAttachment();
if (slotAttachment && slotIndex < oldSkin.attachments.length) {
/** @type {?} */
var dictionary = oldSkin.attachments[slotIndex];
for (var key in dictionary) {
/** @type {?} */
var skinAttachment = dictionary[key];
if (slotAttachment == skinAttachment) {
/** @type {?} */
var attachment = this.getAttachment(slotIndex, key);
if (attachment != null)
slot.setAttachment(attachment);
break;
}
}
}
slotIndex++;
}
};
return Skin;
}());
export { Skin };
if (false) {
/** @type {?} */
Skin.prototype.name;
/** @type {?} */
Skin.prototype.attachments;
/** @type {?} */
Skin.prototype.bones;
/** @type {?} */
Skin.prototype.constraints;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL1NraW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSzlEO0lBQ0UsbUJBQ1MsU0FBaUIsRUFDakIsSUFBWSxFQUNaLFVBQXNCO1FBRnRCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGVBQVUsR0FBVixVQUFVLENBQVk7SUFDNUIsQ0FBQztJQUNOLGdCQUFDO0FBQUQsQ0FBQyxBQU5ELElBTUM7Ozs7SUFKRyw4QkFBd0I7O0lBQ3hCLHlCQUFtQjs7SUFDbkIsK0JBQTZCOztBQUdqQztJQUtFLGNBQVksSUFBWTtRQUh4QixnQkFBVyxHQUFHLElBQUksS0FBSyxFQUFtQixDQUFDO1FBQzNDLFVBQUssR0FBRyxLQUFLLEVBQVksQ0FBQztRQUMxQixnQkFBVyxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO1FBRXhDLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQzs7Ozs7OztJQUNELDRCQUFhOzs7Ozs7SUFBYixVQUFjLFNBQWlCLEVBQUUsSUFBWSxFQUFFLFVBQXNCO1FBQ25FLElBQUksVUFBVSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7O1lBQ2xFLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVztRQUNsQyxJQUFJLFNBQVMsSUFBSSxXQUFXLENBQUMsTUFBTTtZQUFFLFdBQVcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUN4RSxJQUFJ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QUFHLENBQUM7b0JBQ2hELElBQUksY0FBYyxJQUFJLGNBQWMsRUFBRTs7NEJBQ2hDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7d0JBQ25ELElBQUksVUFBVSxJQUFJLElBQUk7NEJBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDdkQsTUFBTTtxQkFDUDtpQkFDRjthQUNGO1lBQ0QsU0FBUyxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7SUFDSCxXQUFDO0FBQUQsQ0FBQyxBQXRKRCxJQXNKQzs7OztJQXJKQyxvQkFBYTs7SUFDYiwyQkFBMkM7O0lBQzNDLHFCQUEwQjs7SUFDMUIsMkJBQTBDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxyXG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTksIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xyXG4gKlxyXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcclxuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcclxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcclxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXHJcbiAqXHJcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxyXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXHJcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cclxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXHJcbiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcclxuICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU5cclxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXHJcbiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXHJcbiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgQlVTSU5FU1NcclxuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxyXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcclxuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxyXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5pbXBvcnQgeyBNYXAgfSBmcm9tIFwiLi9VdGlsc1wiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBNZXNoQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL01lc2hBdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IEJvbmVEYXRhIH0gZnJvbSBcIi4vQm9uZURhdGFcIjtcclxuaW1wb3J0IHsgQ29uc3RyYWludERhdGEgfSBmcm9tIFwiLi9Db25zdHJhaW50XCI7XHJcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSBcIi4vU2tlbGV0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTa2luRW50cnkge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHNsb3RJbmRleDogbnVtYmVyLFxyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcclxuICAgIHB1YmxpYyBhdHRhY2htZW50OiBBdHRhY2htZW50XHJcbiAgKSB7fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBTa2luIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgYXR0YWNobWVudHMgPSBuZXcgQXJyYXk8TWFwPEF0dGFjaG1lbnQ+PigpO1xyXG4gIGJvbmVzID0gQXJyYXk8Qm9uZURhdGE+KCk7XHJcbiAgY29uc3RyYWludHMgPSBuZXcgQXJyYXk8Q29uc3RyYWludERhdGE+KCk7XHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAobmFtZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgfVxyXG4gIHNldEF0dGFjaG1lbnQoc2xvdEluZGV4OiBudW1iZXIsIG5hbWU6IHN0cmluZywgYXR0YWNobWVudDogQXR0YWNobWVudCkge1xyXG4gICAgaWYgKGF0dGFjaG1lbnQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiYXR0YWNobWVudCBjYW5ub3QgYmUgbnVsbC5cIik7XHJcbiAgICBsZXQgYXR0YWNobWVudHMgPSB0aGlzLmF0dGFjaG1lbnRzO1xyXG4gICAgaWYgKHNsb3RJbmRleCA+PSBhdHRhY2htZW50cy5sZW5ndGgpIGF0dGFjaG1lbnRzLmxlbmd0aCA9IHNsb3RJbmRleCArIDE7XHJcbiAgICBpZiAoIWF0dGFjaG1lbnRzW3Nsb3RJbmRleF0pIGF0dGFjaG1lbnRzW3Nsb3RJbmRleF0gPSB7fTtcclxuICAgIGF0dGFjaG1lbnRzW3Nsb3RJbmRleF1bbmFtZV0gPSBhdHRhY2htZW50O1xyXG4gIH1cclxuICBhZGRTa2luKHNraW46IFNraW4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2tpbi5ib25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYm9uZSA9IHNraW4uYm9uZXNbaV07XHJcbiAgICAgIGxldCBjb250YWluZWQgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmJvbmVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYm9uZXNbal0gPT0gYm9uZSkge1xyXG4gICAgICAgICAgY29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWNvbnRhaW5lZCkgdGhpcy5ib25lcy5wdXNoKGJvbmUpO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBza2luLmNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjb25zdHJhaW50ID0gc2tpbi5jb25zdHJhaW50c1tpXTtcclxuICAgICAgbGV0IGNvbnRhaW5lZCA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29uc3RyYWludHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy5jb25zdHJhaW50c1tqXSA9PSBjb25zdHJhaW50KSB7XHJcbiAgICAgICAgICBjb250YWluZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghY29udGFpbmVkKSB0aGlzLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XHJcbiAgICB9XHJcbiAgICBsZXQgYXR0YWNobWVudHMgPSBza2luLmdldEF0dGFjaG1lbnRzKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBhdHRhY2htZW50ID0gYXR0YWNobWVudHNbaV07XHJcbiAgICAgIHRoaXMuc2V0QXR0YWNobWVudChcclxuICAgICAgICBhdHRhY2htZW50LnNsb3RJbmRleCxcclxuICAgICAgICBhdHRhY2htZW50Lm5hbWUsXHJcbiAgICAgICAgYXR0YWNobWVudC5hdHRhY2htZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvcHlTa2luKHNraW46IFNraW4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2tpbi5ib25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYm9uZSA9IHNraW4uYm9uZXNbaV07XHJcbiAgICAgIGxldCBjb250YWluZWQgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmJvbmVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYm9uZXNbal0gPT0gYm9uZSkge1xyXG4gICAgICAgICAgY29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWNvbnRhaW5lZCkgdGhpcy5ib25lcy5wdXNoKGJvbmUpO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBza2luLmNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjb25zdHJhaW50ID0gc2tpbi5jb25zdHJhaW50c1tpXTtcclxuICAgICAgbGV0IGNvbnRhaW5lZCA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29uc3RyYWludHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy5jb25zdHJhaW50c1tqXSA9PSBjb25zdHJhaW50KSB7XHJcbiAgICAgICAgICBjb250YWluZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghY29udGFpbmVkKSB0aGlzLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XHJcbiAgICB9XHJcbiAgICBsZXQgYXR0YWNobWVudHMgPSBza2luLmdldEF0dGFjaG1lbnRzKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBhdHRhY2htZW50ID0gYXR0YWNobWVudHNbaV07XHJcbiAgICAgIGlmIChhdHRhY2htZW50LmF0dGFjaG1lbnQgPT0gbnVsbCkgY29udGludWU7XHJcbiAgICAgIGlmIChhdHRhY2htZW50LmF0dGFjaG1lbnQgaW5zdGFuY2VvZiBNZXNoQXR0YWNobWVudCkge1xyXG4gICAgICAgIGF0dGFjaG1lbnQuYXR0YWNobWVudCA9IGF0dGFjaG1lbnQuYXR0YWNobWVudC5uZXdMaW5rZWRNZXNoKCk7XHJcbiAgICAgICAgdGhpcy5zZXRBdHRhY2htZW50KFxyXG4gICAgICAgICAgYXR0YWNobWVudC5zbG90SW5kZXgsXHJcbiAgICAgICAgICBhdHRhY2htZW50Lm5hbWUsXHJcbiAgICAgICAgICBhdHRhY2htZW50LmF0dGFjaG1lbnRcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF0dGFjaG1lbnQuYXR0YWNobWVudCA9IGF0dGFjaG1lbnQuYXR0YWNobWVudC5jb3B5KCk7XHJcbiAgICAgICAgdGhpcy5zZXRBdHRhY2htZW50KFxyXG4gICAgICAgICAgYXR0YWNobWVudC5zbG90SW5kZXgsXHJcbiAgICAgICAgICBhdHRhY2htZW50Lm5hbWUsXHJcbiAgICAgICAgICBhdHRhY2htZW50LmF0dGFjaG1lbnRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKiBAcmV0dXJuIE1heSBiZSBudWxsLiAqL1xyXG4gIGdldEF0dGFjaG1lbnQoc2xvdEluZGV4OiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IEF0dGFjaG1lbnQge1xyXG4gICAgbGV0IGRpY3Rpb25hcnkgPSB0aGlzLmF0dGFjaG1lbnRzW3Nsb3RJbmRleF07XHJcbiAgICByZXR1cm4gZGljdGlvbmFyeSA/IGRpY3Rpb25hcnlbbmFtZV0gOiBudWxsO1xyXG4gIH1cclxuICByZW1vdmVBdHRhY2htZW50KHNsb3RJbmRleDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgIGxldCBkaWN0aW9uYXJ5ID0gdGhpcy5hdHRhY2htZW50c1tzbG90SW5kZXhdO1xyXG4gICAgaWYgKGRpY3Rpb25hcnkpIGRpY3Rpb25hcnlbbmFtZV0gPSBudWxsO1xyXG4gIH1cclxuICBnZXRBdHRhY2htZW50cygpOiBBcnJheTxTa2luRW50cnk+IHtcclxuICAgIGxldCBlbnRyaWVzID0gbmV3IEFycmF5PFNraW5FbnRyeT4oKTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hdHRhY2htZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc2xvdEF0dGFjaG1lbnRzID0gdGhpcy5hdHRhY2htZW50c1tpXTtcclxuICAgICAgaWYgKHNsb3RBdHRhY2htZW50cykge1xyXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gc2xvdEF0dGFjaG1lbnRzKSB7XHJcbiAgICAgICAgICBsZXQgYXR0YWNobWVudCA9IHNsb3RBdHRhY2htZW50c1tuYW1lXTtcclxuICAgICAgICAgIGlmIChhdHRhY2htZW50KSBlbnRyaWVzLnB1c2gobmV3IFNraW5FbnRyeShpLCBuYW1lLCBhdHRhY2htZW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50cmllcztcclxuICB9XHJcbiAgZ2V0QXR0YWNobWVudHNGb3JTbG90KHNsb3RJbmRleDogbnVtYmVyLCBhdHRhY2htZW50czogQXJyYXk8U2tpbkVudHJ5Pikge1xyXG4gICAgbGV0IHNsb3RBdHRhY2htZW50cyA9IHRoaXMuYXR0YWNobWVudHNbc2xvdEluZGV4XTtcclxuICAgIGlmIChzbG90QXR0YWNobWVudHMpIHtcclxuICAgICAgZm9yIChsZXQgbmFtZSBpbiBzbG90QXR0YWNobWVudHMpIHtcclxuICAgICAgICBsZXQgYXR0YWNobWVudCA9IHNsb3RBdHRhY2htZW50c1tuYW1lXTtcclxuICAgICAgICBpZiAoYXR0YWNobWVudClcclxuICAgICAgICAgIGF0dGFjaG1lbnRzLnB1c2gobmV3IFNraW5FbnRyeShzbG90SW5kZXgsIG5hbWUsIGF0dGFjaG1lbnQpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuYXR0YWNobWVudHMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuYm9uZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuY29uc3RyYWludHMubGVuZ3RoID0gMDtcclxuICB9XHJcbiAgLyoqIEF0dGFjaCBlYWNoIGF0dGFjaG1lbnQgaW4gdGhpcyBza2luIGlmIHRoZSBjb3JyZXNwb25kaW5nIGF0dGFjaG1lbnQgaW4gdGhlIG9sZCBza2luIGlzIGN1cnJlbnRseSBhdHRhY2hlZC4gKi9cclxuICBhdHRhY2hBbGwoc2tlbGV0b246IFNrZWxldG9uLCBvbGRTa2luOiBTa2luKSB7XHJcbiAgICBsZXQgc2xvdEluZGV4ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2tlbGV0b24uc2xvdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHNsb3QgPSBza2VsZXRvbi5zbG90c1tpXTtcclxuICAgICAgbGV0IHNsb3RBdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XHJcbiAgICAgIGlmIChzbG90QXR0YWNobWVudCAmJiBzbG90SW5kZXggPCBvbGRTa2luLmF0dGFjaG1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBkaWN0aW9uYXJ5ID0gb2xkU2tpbi5hdHRhY2htZW50c1tzbG90SW5kZXhdO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkaWN0aW9uYXJ5KSB7XHJcbiAgICAgICAgICBsZXQgc2tpbkF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQgPSBkaWN0aW9uYXJ5W2tleV07XHJcbiAgICAgICAgICBpZiAoc2xvdEF0dGFjaG1lbnQgPT0gc2tpbkF0dGFjaG1lbnQpIHtcclxuICAgICAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSB0aGlzLmdldEF0dGFjaG1lbnQoc2xvdEluZGV4LCBrZXkpO1xyXG4gICAgICAgICAgICBpZiAoYXR0YWNobWVudCAhPSBudWxsKSBzbG90LnNldEF0dGFjaG1lbnQoYXR0YWNobWVudCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzbG90SW5kZXgrKztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19