ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
369 lines • 27.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.
*****************************************************************************/
var Assets = /** @class */ (function () {
function Assets(clientId) {
this.toLoad = new Array();
this.assets = {};
this.clientId = clientId;
}
/**
* @return {?}
*/
Assets.prototype.loaded = /**
* @return {?}
*/
function () {
/** @type {?} */
var i = 0;
for (var v in this.assets)
i++;
return i;
};
return Assets;
}());
if (false) {
/** @type {?} */
Assets.prototype.clientId;
/** @type {?} */
Assets.prototype.toLoad;
/** @type {?} */
Assets.prototype.assets;
/** @type {?} */
Assets.prototype.textureLoader;
}
var SharedAssetManager = /** @class */ (function () {
function SharedAssetManager(pathPrefix) {
if (pathPrefix === void 0) { pathPrefix = ""; }
this.clientAssets = {};
this.queuedAssets = {};
this.rawAssets = {};
this.errors = {};
this.pathPrefix = pathPrefix;
}
/**
* @private
* @param {?} clientId
* @param {?} textureLoader
* @param {?} path
* @return {?}
*/
SharedAssetManager.prototype.queueAsset = /**
* @private
* @param {?} clientId
* @param {?} textureLoader
* @param {?} path
* @return {?}
*/
function (clientId, textureLoader, path) {
/** @type {?} */
var clientAssets = this.clientAssets[clientId];
if (clientAssets === null || clientAssets === undefined) {
clientAssets = new Assets(clientId);
this.clientAssets[clientId] = clientAssets;
}
if (textureLoader !== null)
clientAssets.textureLoader = textureLoader;
clientAssets.toLoad.push(path);
// check if already queued, in which case we can skip actual
// loading
if (this.queuedAssets[path] === path) {
return false;
}
else {
this.queuedAssets[path] = path;
return true;
}
};
/**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
SharedAssetManager.prototype.loadText = /**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
function (clientId, path) {
var _this = this;
path = this.pathPrefix + path;
if (!this.queueAsset(clientId, null, path))
return;
/** @type {?} */
var request = new XMLHttpRequest();
request.onreadystatechange = (/**
* @return {?}
*/
function () {
if (request.readyState == XMLHttpRequest.DONE) {
if (request.status >= 200 && request.status < 300) {
_this.rawAssets[path] = request.responseText;
}
else {
_this.errors[path] = "Couldn't load text " + path + ": status " + request.status + ", " + request.responseText;
}
}
});
request.open("GET", path, true);
request.send();
};
/**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
SharedAssetManager.prototype.loadJson = /**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
function (clientId, path) {
var _this = this;
path = this.pathPrefix + path;
if (!this.queueAsset(clientId, null, path))
return;
/** @type {?} */
var request = new XMLHttpRequest();
request.onreadystatechange = (/**
* @return {?}
*/
function () {
if (request.readyState == XMLHttpRequest.DONE) {
if (request.status >= 200 && request.status < 300) {
_this.rawAssets[path] = JSON.parse(request.responseText);
}
else {
_this.errors[path] = "Couldn't load text " + path + ": status " + request.status + ", " + request.responseText;
}
}
});
request.open("GET", path, true);
request.send();
};
/**
* @param {?} clientId
* @param {?} textureLoader
* @param {?} path
* @return {?}
*/
SharedAssetManager.prototype.loadTexture = /**
* @param {?} clientId
* @param {?} textureLoader
* @param {?} path
* @return {?}
*/
function (clientId, textureLoader, path) {
var _this = this;
path = this.pathPrefix + path;
if (!this.queueAsset(clientId, textureLoader, path))
return;
/** @type {?} */
var img = new Image();
img.src = path;
img.crossOrigin = "anonymous";
img.onload = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
_this.rawAssets[path] = img;
});
img.onerror = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
_this.errors[path] = "Couldn't load image " + path;
});
};
/**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
SharedAssetManager.prototype.get = /**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
function (clientId, path) {
path = this.pathPrefix + path;
/** @type {?} */
var clientAssets = this.clientAssets[clientId];
if (clientAssets === null || clientAssets === undefined)
return true;
return clientAssets.assets[path];
};
/**
* @private
* @param {?} clientAssets
* @return {?}
*/
SharedAssetManager.prototype.updateClientAssets = /**
* @private
* @param {?} clientAssets
* @return {?}
*/
function (clientAssets) {
for (var i = 0; i < clientAssets.toLoad.length; i++) {
/** @type {?} */
var path = clientAssets.toLoad[i];
/** @type {?} */
var asset = clientAssets.assets[path];
if (asset === null || asset === undefined) {
/** @type {?} */
var rawAsset = this.rawAssets[path];
if (rawAsset === null || rawAsset === undefined)
continue;
if (rawAsset instanceof HTMLImageElement) {
clientAssets.assets[path] = clientAssets.textureLoader((/** @type {?} */ (rawAsset)));
}
else {
clientAssets.assets[path] = rawAsset;
}
}
}
};
/**
* @param {?} clientId
* @return {?}
*/
SharedAssetManager.prototype.isLoadingComplete = /**
* @param {?} clientId
* @return {?}
*/
function (clientId) {
/** @type {?} */
var clientAssets = this.clientAssets[clientId];
if (clientAssets === null || clientAssets === undefined)
return true;
this.updateClientAssets(clientAssets);
return clientAssets.toLoad.length == clientAssets.loaded();
};
/*remove (clientId: string, path: string) {
path = this.pathPrefix + path;
let asset = this.assets[path];
if ((<any>asset).dispose) (<any>asset).dispose();
this.assets[path] = null;
}
removeAll () {
for (let key in this.assets) {
let asset = this.assets[key];
if ((<any>asset).dispose) (<any>asset).dispose();
}
this.assets = {};
}*/
/*remove (clientId: string, path: string) {
path = this.pathPrefix + path;
let asset = this.assets[path];
if ((<any>asset).dispose) (<any>asset).dispose();
this.assets[path] = null;
}
removeAll () {
for (let key in this.assets) {
let asset = this.assets[key];
if ((<any>asset).dispose) (<any>asset).dispose();
}
this.assets = {};
}*/
/**
* @return {?}
*/
SharedAssetManager.prototype.dispose = /*remove (clientId: string, path: string) {
path = this.pathPrefix + path;
let asset = this.assets[path];
if ((<any>asset).dispose) (<any>asset).dispose();
this.assets[path] = null;
}
removeAll () {
for (let key in this.assets) {
let asset = this.assets[key];
if ((<any>asset).dispose) (<any>asset).dispose();
}
this.assets = {};
}*/
/**
* @return {?}
*/
function () {
// this.removeAll();
};
/**
* @return {?}
*/
SharedAssetManager.prototype.hasErrors = /**
* @return {?}
*/
function () {
return Object.keys(this.errors).length > 0;
};
/**
* @return {?}
*/
SharedAssetManager.prototype.getErrors = /**
* @return {?}
*/
function () {
return this.errors;
};
return SharedAssetManager;
}());
export { SharedAssetManager };
if (false) {
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.pathPrefix;
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.clientAssets;
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.queuedAssets;
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.rawAssets;
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.errors;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkQXNzZXRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvU2hhcmVkQXNzZXRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0JBO0lBS0UsZ0JBQVksUUFBZ0I7UUFINUIsV0FBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDN0IsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUdwQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDOzs7O0lBQ0QsdUJBQU07OztJQUFOOztZQUNNLENBQUMsR0FBRyxDQUFDO1FBQ1QsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNILGFBQUM7QUFBRCxDQUFDLEFBYkQsSUFhQzs7O0lBWkMsMEJBQWlCOztJQUNqQix3QkFBNkI7O0lBQzdCLHdCQUFzQjs7SUFDdEIsK0JBQWdEOztBQVVsRDtJQU1FLDRCQUFZLFVBQXVCO1FBQXZCLDJCQUFBLEVBQUEsZUFBdUI7UUFKM0IsaUJBQVksR0FBZ0IsRUFBRSxDQUFDO1FBQy9CLGlCQUFZLEdBQWdCLEVBQUUsQ0FBQztRQUMvQixjQUFTLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLFdBQU0sR0FBZ0IsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7Ozs7Ozs7O0lBQ08sdUNBQVU7Ozs7Ozs7SUFBbEIsVUFDRSxRQUFnQixFQUNoQixhQUErQyxFQUMvQyxJQUFZOztZQUVSLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUM5QyxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZ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Q0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7OztJQUNELHNDQUFTOzs7SUFBVDtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBQ0gseUJBQUM7QUFBRCxDQUFDLEFBdElELElBc0lDOzs7Ozs7O0lBcklDLHdDQUEyQjs7Ozs7SUFDM0IsMENBQXVDOzs7OztJQUN2QywwQ0FBdUM7Ozs7O0lBQ3ZDLHVDQUFpQzs7Ozs7SUFDakMsb0NBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxyXG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTksIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xyXG4gKlxyXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcclxuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcclxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcclxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXHJcbiAqXHJcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxyXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXHJcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cclxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXHJcbiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcclxuICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU5cclxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXHJcbiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXHJcbiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgQlVTSU5FU1NcclxuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxyXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcclxuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxyXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5pbXBvcnQgeyBNYXAsIERpc3Bvc2FibGUgfSBmcm9tIFwiLi9VdGlsc1wiO1xyXG5cclxuY2xhc3MgQXNzZXRzIHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG4gIHRvTG9hZCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgYXNzZXRzOiBNYXA8YW55PiA9IHt9O1xyXG4gIHRleHR1cmVMb2FkZXI6IChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4gYW55O1xyXG4gIGNvbnN0cnVjdG9yKGNsaWVudElkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcclxuICB9XHJcbiAgbG9hZGVkKCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChsZXQgdiBpbiB0aGlzLmFzc2V0cykgaSsrO1xyXG4gICAgcmV0dXJuIGk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBTaGFyZWRBc3NldE1hbmFnZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcclxuICBwcml2YXRlIHBhdGhQcmVmaXg6IHN0cmluZztcclxuICBwcml2YXRlIGNsaWVudEFzc2V0czogTWFwPEFzc2V0cz4gPSB7fTtcclxuICBwcml2YXRlIHF1ZXVlZEFzc2V0czogTWFwPHN0cmluZz4gPSB7fTtcclxuICBwcml2YXRlIHJhd0Fzc2V0czogTWFwPGFueT4gPSB7fTtcclxuICBwcml2YXRlIGVycm9yczogTWFwPHN0cmluZz4gPSB7fTtcclxuICBjb25zdHJ1Y3RvcihwYXRoUHJlZml4OiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICB0aGlzLnBhdGhQcmVmaXggPSBwYXRoUHJlZml4O1xyXG4gIH1cclxuICBwcml2YXRlIHF1ZXVlQXNzZXQoXHJcbiAgICBjbGllbnRJZDogc3RyaW5nLFxyXG4gICAgdGV4dHVyZUxvYWRlcjogKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiBhbnksXHJcbiAgICBwYXRoOiBzdHJpbmdcclxuICApOiBib29sZWFuIHtcclxuICAgIGxldCBjbGllbnRBc3NldHMgPSB0aGlzLmNsaWVudEFzc2V0c1tjbGllbnRJZF07XHJcbiAgICBpZiAoY2xpZW50QXNzZXRzID09PSBudWxsIHx8IGNsaWVudEFzc2V0cyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNsaWVudEFzc2V0cyA9IG5ldyBBc3NldHMoY2xpZW50SWQpO1xyXG4gICAgICB0aGlzLmNsaWVudEFzc2V0c1tjbGllbnRJZF0gPSBjbGllbnRBc3NldHM7XHJcbiAgICB9XHJcbiAgICBpZiAodGV4dHVyZUxvYWRlciAhPT0gbnVsbCkgY2xpZW50QXNzZXRzLnRleHR1cmVMb2FkZXIgPSB0ZXh0dXJlTG9hZGVyO1xyXG4gICAgY2xpZW50QXNzZXRzLnRvTG9hZC5wdXNoKHBhdGgpO1xyXG4gICAgLy8gY2hlY2sgaWYgYWxyZWFkeSBxdWV1ZWQsIGluIHdoaWNoIGNhc2Ugd2UgY2FuIHNraXAgYWN0dWFsXHJcbiAgICAvLyBsb2FkaW5nXHJcbiAgICBpZiAodGhpcy5xdWV1ZWRBc3NldHNbcGF0aF0gPT09IHBhdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5xdWV1ZWRBc3NldHNbcGF0aF0gPSBwYXRoO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgbG9hZFRleHQoY2xpZW50SWQ6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIGlmICghdGhpcy5xdWV1ZUFzc2V0KGNsaWVudElkLCBudWxsLCBwYXRoKSkgcmV0dXJuO1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcclxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPj0gMjAwICYmIHJlcXVlc3Quc3RhdHVzIDwgMzAwKSB7XHJcbiAgICAgICAgICB0aGlzLnJhd0Fzc2V0c1twYXRoXSA9IHJlcXVlc3QucmVzcG9uc2VUZXh0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmVycm9yc1tcclxuICAgICAgICAgICAgcGF0aFxyXG4gICAgICAgICAgXSA9IGBDb3VsZG4ndCBsb2FkIHRleHQgJHtwYXRofTogc3RhdHVzICR7cmVxdWVzdC5zdGF0dXN9LCAke3JlcXVlc3QucmVzcG9uc2VUZXh0fWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVxdWVzdC5vcGVuKFwiR0VUXCIsIHBhdGgsIHRydWUpO1xyXG4gICAgcmVxdWVzdC5zZW5kKCk7XHJcbiAgfVxyXG4gIGxvYWRKc29uKGNsaWVudElkOiBzdHJpbmcsIHBhdGg6IHN0cmluZykge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICBpZiAoIXRoaXMucXVldWVBc3NldChjbGllbnRJZCwgbnVsbCwgcGF0aCkpIHJldHVybjtcclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XHJcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID49IDIwMCAmJiByZXF1ZXN0LnN0YXR1cyA8IDMwMCkge1xyXG4gICAgICAgICAgdGhpcy5yYXdBc3NldHNbcGF0aF0gPSBKU09OLnBhcnNlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICAgIHBhdGhcclxuICAgICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0ICR7cGF0aH06IHN0YXR1cyAke3JlcXVlc3Quc3RhdHVzfSwgJHtyZXF1ZXN0LnJlc3BvbnNlVGV4dH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCBwYXRoLCB0cnVlKTtcclxuICAgIHJlcXVlc3Quc2VuZCgpO1xyXG4gIH1cclxuICBsb2FkVGV4dHVyZShcclxuICAgIGNsaWVudElkOiBzdHJpbmcsXHJcbiAgICB0ZXh0dXJlTG9hZGVyOiAoaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IGFueSxcclxuICAgIHBhdGg6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICBpZiAoIXRoaXMucXVldWVBc3NldChjbGllbnRJZCwgdGV4dHVyZUxvYWRlciwgcGF0aCkpIHJldHVybjtcclxuICAgIGxldCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgIGltZy5zcmMgPSBwYXRoO1xyXG4gICAgaW1nLmNyb3NzT3JpZ2luID0gXCJhbm9ueW1vdXNcIjtcclxuICAgIGltZy5vbmxvYWQgPSBldiA9PiB7XHJcbiAgICAgIHRoaXMucmF3QXNzZXRzW3BhdGhdID0gaW1nO1xyXG4gICAgfTtcclxuICAgIGltZy5vbmVycm9yID0gZXYgPT4ge1xyXG4gICAgICB0aGlzLmVycm9yc1twYXRoXSA9IGBDb3VsZG4ndCBsb2FkIGltYWdlICR7cGF0aH1gO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZ2V0KGNsaWVudElkOiBzdHJpbmcsIHBhdGg6IHN0cmluZykge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICBsZXQgY2xpZW50QXNzZXRzID0gdGhpcy5jbGllbnRBc3NldHNbY2xpZW50SWRdO1xyXG4gICAgaWYgKGNsaWVudEFzc2V0cyA9PT0gbnVsbCB8fCBjbGllbnRBc3NldHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gY2xpZW50QXNzZXRzLmFzc2V0c1twYXRoXTtcclxuICB9XHJcbiAgcHJpdmF0ZSB1cGRhdGVDbGllbnRBc3NldHMoY2xpZW50QXNzZXRzOiBBc3NldHMpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xpZW50QXNzZXRzLnRvTG9hZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcGF0aCA9IGNsaWVudEFzc2V0cy50b0xvYWRbaV07XHJcbiAgICAgIGxldCBhc3NldCA9IGNsaWVudEFzc2V0cy5hc3NldHNbcGF0aF07XHJcbiAgICAgIGlmIChhc3NldCA9PT0gbnVsbCB8fCBhc3NldCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbGV0IHJhd0Fzc2V0ID0gdGhpcy5yYXdBc3NldHNbcGF0aF07XHJcbiAgICAgICAgaWYgKHJhd0Fzc2V0ID09PSBudWxsIHx8IHJhd0Fzc2V0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmIChyYXdBc3NldCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHtcclxuICAgICAgICAgIGNsaWVudEFzc2V0cy5hc3NldHNbcGF0aF0gPSBjbGllbnRBc3NldHMudGV4dHVyZUxvYWRlcig8XHJcbiAgICAgICAgICAgIEhUTUxJbWFnZUVsZW1lbnRcclxuICAgICAgICAgID5yYXdBc3NldCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNsaWVudEFzc2V0cy5hc3NldHNbcGF0aF0gPSByYXdBc3NldDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgaXNMb2FkaW5nQ29tcGxldGUoY2xpZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNsaWVudEFzc2V0cyA9IHRoaXMuY2xpZW50QXNzZXRzW2NsaWVudElkXTtcclxuICAgIGlmIChjbGllbnRBc3NldHMgPT09IG51bGwgfHwgY2xpZW50QXNzZXRzID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xyXG4gICAgdGhpcy51cGRhdGVDbGllbnRBc3NldHMoY2xpZW50QXNzZXRzKTtcclxuICAgIHJldHVybiBjbGllbnRBc3NldHMudG9Mb2FkLmxlbmd0aCA9PSBjbGllbnRBc3NldHMubG9hZGVkKCk7XHJcbiAgfVxyXG4gIC8qcmVtb3ZlIChjbGllbnRJZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcclxuXHRcdFx0cGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcblx0XHRcdGxldCBhc3NldCA9IHRoaXMuYXNzZXRzW3BhdGhdO1xyXG5cdFx0XHRpZiAoKDxhbnk+YXNzZXQpLmRpc3Bvc2UpICg8YW55PmFzc2V0KS5kaXNwb3NlKCk7XHJcblx0XHRcdHRoaXMuYXNzZXRzW3BhdGhdID0gbnVsbDtcclxuXHRcdH1cclxuXHRcdHJlbW92ZUFsbCAoKSB7XHJcblx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmFzc2V0cykge1xyXG5cdFx0XHRcdGxldCBhc3NldCA9IHRoaXMuYXNzZXRzW2tleV07XHJcblx0XHRcdFx0aWYgKCg8YW55PmFzc2V0KS5kaXNwb3NlKSAoPGFueT5hc3NldCkuZGlzcG9zZSgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuYXNzZXRzID0ge307XHJcblx0XHR9Ki9cclxuICBkaXNwb3NlKCkge1xyXG4gICAgLy8gdGhpcy5yZW1vdmVBbGwoKTtcclxuICB9XHJcbiAgaGFzRXJyb3JzKCkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZXJyb3JzKS5sZW5ndGggPiAwO1xyXG4gIH1cclxuICBnZXRFcnJvcnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lcnJvcnM7XHJcbiAgfVxyXG59XHJcbiJdfQ==