UNPKG

ngx-spine

Version:

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

369 lines 27.3 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. *****************************************************************************/ 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==