UNPKG

ngx-spine

Version:

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

575 lines 45.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /****************************************************************************** * 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 { FakeTexture } from "./Texture"; import { TextureAtlas } from "./TextureAtlas"; var AssetManager = /** @class */ (function () { function AssetManager(textureLoader, pathPrefix) { if (pathPrefix === void 0) { pathPrefix = ""; } this.assets = {}; this.errors = {}; this.toLoad = 0; this.loaded = 0; this.textureLoader = textureLoader; this.pathPrefix = pathPrefix; } /** * @private * @param {?} url * @param {?} success * @param {?} error * @return {?} */ AssetManager.downloadText = /** * @private * @param {?} url * @param {?} success * @param {?} error * @return {?} */ function (url, success, error) { /** @type {?} */ var request = new XMLHttpRequest(); request.open("GET", url, true); request.onload = (/** * @return {?} */ function () { if (request.status == 200) { success(request.responseText); } else { error(request.status, request.responseText); } }); request.onerror = (/** * @return {?} */ function () { error(request.status, request.responseText); }); request.send(); }; /** * @private * @param {?} url * @param {?} success * @param {?} error * @return {?} */ AssetManager.downloadBinary = /** * @private * @param {?} url * @param {?} success * @param {?} error * @return {?} */ function (url, success, error) { /** @type {?} */ var request = new XMLHttpRequest(); request.open("GET", url, true); request.responseType = "arraybuffer"; request.onload = (/** * @return {?} */ function () { if (request.status == 200) { success(new Uint8Array((/** @type {?} */ (request.response)))); } else { error(request.status, request.responseText); } }); request.onerror = (/** * @return {?} */ function () { error(request.status, request.responseText); }); request.send(); }; /** * @param {?} path * @param {?=} success * @param {?=} error * @return {?} */ AssetManager.prototype.loadBinary = /** * @param {?} path * @param {?=} success * @param {?=} error * @return {?} */ function (path, success, error) { var _this = this; if (success === void 0) { success = null; } if (error === void 0) { error = null; } path = this.pathPrefix + path; this.toLoad++; AssetManager.downloadBinary(path, (/** * @param {?} data * @return {?} */ function (data) { _this.assets[path] = data; if (success) success(path, data); _this.toLoad--; _this.loaded++; }), (/** * @param {?} state * @param {?} responseText * @return {?} */ function (state, responseText) { _this.errors[path] = "Couldn't load binary " + path + ": status " + status + ", " + responseText; if (error) error(path, "Couldn't load binary " + path + ": status " + status + ", " + responseText); _this.toLoad--; _this.loaded++; })); }; /** * @param {?} path * @param {?=} success * @param {?=} error * @return {?} */ AssetManager.prototype.loadText = /** * @param {?} path * @param {?=} success * @param {?=} error * @return {?} */ function (path, success, error) { var _this = this; if (success === void 0) { success = null; } if (error === void 0) { error = null; } path = this.pathPrefix + path; this.toLoad++; AssetManager.downloadText(path, (/** * @param {?} data * @return {?} */ function (data) { _this.assets[path] = data; if (success) success(path, data); _this.toLoad--; _this.loaded++; }), (/** * @param {?} state * @param {?} responseText * @return {?} */ function (state, responseText) { _this.errors[path] = "Couldn't load text " + path + ": status " + status + ", " + responseText; if (error) error(path, "Couldn't load text " + path + ": status " + status + ", " + responseText); _this.toLoad--; _this.loaded++; })); }; /** * @param {?} path * @param {?=} success * @param {?=} error * @return {?} */ AssetManager.prototype.loadTexture = /** * @param {?} path * @param {?=} success * @param {?=} error * @return {?} */ function (path, success, error) { var _this = this; if (success === void 0) { success = null; } if (error === void 0) { error = null; } path = this.pathPrefix + path; this.toLoad++; /** @type {?} */ var img = new Image(); img.crossOrigin = "anonymous"; img.onload = (/** * @param {?} ev * @return {?} */ function (ev) { /** @type {?} */ var texture = _this.textureLoader(img); _this.assets[path] = texture; _this.toLoad--; _this.loaded++; if (success) success(path, img); }); img.onerror = (/** * @param {?} ev * @return {?} */ function (ev) { _this.errors[path] = "Couldn't load image " + path; _this.toLoad--; _this.loaded++; if (error) error(path, "Couldn't load image " + path); }); img.src = path; }; /** * @param {?} path * @param {?} data * @param {?=} success * @param {?=} error * @return {?} */ AssetManager.prototype.loadTextureData = /** * @param {?} path * @param {?} data * @param {?=} success * @param {?=} error * @return {?} */ function (path, data, success, error) { var _this = this; if (success === void 0) { success = null; } if (error === void 0) { error = null; } path = this.pathPrefix + path; this.toLoad++; /** @type {?} */ var img = new Image(); img.onload = (/** * @param {?} ev * @return {?} */ function (ev) { /** @type {?} */ var texture = _this.textureLoader(img); _this.assets[path] = texture; _this.toLoad--; _this.loaded++; if (success) success(path, img); }); img.onerror = (/** * @param {?} ev * @return {?} */ function (ev) { _this.errors[path] = "Couldn't load image " + path; _this.toLoad--; _this.loaded++; if (error) error(path, "Couldn't load image " + path); }); img.src = data; }; /** * @param {?} path * @param {?=} success * @param {?=} error * @return {?} */ AssetManager.prototype.loadTextureAtlas = /** * @param {?} path * @param {?=} success * @param {?=} error * @return {?} */ function (path, success, error) { var _this = this; if (success === void 0) { success = null; } if (error === void 0) { error = null; } /** @type {?} */ var parent = path.lastIndexOf("/") >= 0 ? path.substring(0, path.lastIndexOf("/")) : ""; path = this.pathPrefix + path; this.toLoad++; AssetManager.downloadText(path, (/** * @param {?} atlasData * @return {?} */ function (atlasData) { var e_1, _a; /** @type {?} */ var pagesLoaded = { count: 0 }; /** @type {?} */ var atlasPages = new Array(); try { /** @type {?} */ var atlas = new TextureAtlas(atlasData, (/** * @param {?} path * @return {?} */ function (path) { atlasPages.push(parent + "/" + path); /** @type {?} */ var image = (/** @type {?} */ (document.createElement("img"))); image.width = 16; image.height = 16; return new FakeTexture(image); })); } catch (e) { /** @type {?} */ var ex = (/** @type {?} */ (e)); _this.errors[path] = "Couldn't load texture atlas " + path + ": " + ex.message; if (error) error(path, "Couldn't load texture atlas " + path + ": " + ex.message); _this.toLoad--; _this.loaded++; return; } var _loop_1 = function (atlasPage) { /** @type {?} */ var pageLoadError = false; _this.loadTexture(atlasPage, (/** * @param {?} imagePath * @param {?} image * @return {?} */ function (imagePath, image) { pagesLoaded.count++; if (pagesLoaded.count == atlasPages.length) { if (!pageLoadError) { try { /** @type {?} */ var atlas = new TextureAtlas(atlasData, (/** * @param {?} path * @return {?} */ function (path) { return _this.get(parent + "/" + path); })); _this.assets[path] = atlas; if (success) success(path, atlas); _this.toLoad--; _this.loaded++; } catch (e) { /** @type {?} */ var ex = (/** @type {?} */ (e)); _this.errors[path] = "Couldn't load texture atlas " + path + ": " + ex.message; if (error) error(path, "Couldn't load texture atlas " + path + ": " + ex.message); _this.toLoad--; _this.loaded++; } } else { _this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path; if (error) error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path); _this.toLoad--; _this.loaded++; } } }), (/** * @param {?} imagePath * @param {?} errorMessage * @return {?} */ function (imagePath, errorMessage) { pageLoadError = true; pagesLoaded.count++; if (pagesLoaded.count == atlasPages.length) { _this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path; if (error) error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path); _this.toLoad--; _this.loaded++; } })); }; try { for (var atlasPages_1 = tslib_1.__values(atlasPages), atlasPages_1_1 = atlasPages_1.next(); !atlasPages_1_1.done; atlasPages_1_1 = atlasPages_1.next()) { var atlasPage = atlasPages_1_1.value; _loop_1(atlasPage); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (atlasPages_1_1 && !atlasPages_1_1.done && (_a = atlasPages_1.return)) _a.call(atlasPages_1); } finally { if (e_1) throw e_1.error; } } }), (/** * @param {?} state * @param {?} responseText * @return {?} */ function (state, responseText) { _this.errors[path] = "Couldn't load texture atlas " + path + ": status " + status + ", " + responseText; if (error) error(path, "Couldn't load texture atlas " + path + ": status " + status + ", " + responseText); _this.toLoad--; _this.loaded++; })); }; /** * @param {?} path * @return {?} */ AssetManager.prototype.get = /** * @param {?} path * @return {?} */ function (path) { path = this.pathPrefix + path; return this.assets[path]; }; /** * @param {?} path * @return {?} */ AssetManager.prototype.remove = /** * @param {?} path * @return {?} */ function (path) { path = this.pathPrefix + path; /** @type {?} */ var asset = this.assets[path]; if (((/** @type {?} */ (asset))).dispose) ((/** @type {?} */ (asset))).dispose(); this.assets[path] = null; }; /** * @return {?} */ AssetManager.prototype.removeAll = /** * @return {?} */ function () { for (var key in this.assets) { /** @type {?} */ var asset = this.assets[key]; if (((/** @type {?} */ (asset))).dispose) ((/** @type {?} */ (asset))).dispose(); } this.assets = {}; }; /** * @return {?} */ AssetManager.prototype.isLoadingComplete = /** * @return {?} */ function () { return this.toLoad == 0; }; /** * @return {?} */ AssetManager.prototype.getToLoad = /** * @return {?} */ function () { return this.toLoad; }; /** * @return {?} */ AssetManager.prototype.getLoaded = /** * @return {?} */ function () { return this.loaded; }; /** * @return {?} */ AssetManager.prototype.dispose = /** * @return {?} */ function () { this.removeAll(); }; /** * @return {?} */ AssetManager.prototype.hasErrors = /** * @return {?} */ function () { return Object.keys(this.errors).length > 0; }; /** * @return {?} */ AssetManager.prototype.getErrors = /** * @return {?} */ function () { return this.errors; }; return AssetManager; }()); export { AssetManager }; if (false) { /** * @type {?} * @private */ AssetManager.prototype.pathPrefix; /** * @type {?} * @private */ AssetManager.prototype.textureLoader; /** * @type {?} * @private */ AssetManager.prototype.assets; /** * @type {?} * @private */ AssetManager.prototype.errors; /** * @type {?} * @private */ AssetManager.prototype.toLoad; /** * @type {?} * @private */ AssetManager.prototype.loaded; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNzZXRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvQXNzZXRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QztJQU9FLHNCQUNFLGFBQStDLEVBQy9DLFVBQXVCO1FBQXZCLDJCQUFBLEVBQUEsZUFBdUI7UUFOakIsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixXQUFNLEdBQWdCLEVBQUUsQ0FBQztRQUN6QixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUtqQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDOzs7Ozs7OztJQUNjLHlCQUFZOzs7Ozs7O0lBQTNCLFVBQ0UsR0FBVyxFQUNYLE9BQStCLEVBQy9CLEtBQXFEOztZQUVqRCxPQUFPLEdBQUcsSUFBSSxjQUFjLEVBQUU7UUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxNQUFNOzs7UUFBRztZQUNmLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDL0I7aUJBQU07Z0JBQ0wsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxDQUFBLENBQUM7UUFDRixPQUFPLENBQUMsT0FBTzs7O1FBQUc7WUFDaEIs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QUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDNUIsSUFBSSxDQUFDLG1CQUFLLEtBQUssRUFBQSxDQUFDLENBQUMsT0FBTztnQkFBRSxDQUFDLG1CQUFLLEtBQUssRUFBQSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDOzs7O0lBQ0Qsd0NBQWlCOzs7SUFBakI7UUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7Ozs7SUFDRCxnQ0FBUzs7O0lBQVQ7UUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQzs7OztJQUNELGdDQUFTOzs7SUFBVDtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOzs7O0lBQ0QsOEJBQU87OztJQUFQO1FBQ0UsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7Ozs7SUFDRCxnQ0FBUzs7O0lBQVQ7UUFDRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7OztJQUNELGdDQUFTOzs7SUFBVDtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBalRELElBaVRDOzs7Ozs7O0lBaFRDLGtDQUEyQjs7Ozs7SUFDM0IscUNBQXdEOzs7OztJQUN4RCw4QkFBOEI7Ozs7O0lBQzlCLDhCQUFpQzs7Ozs7SUFDakMsOEJBQW1COzs7OztJQUNuQiw4QkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IE1hcCwgRGlzcG9zYWJsZSB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbmltcG9ydCB7IEZha2VUZXh0dXJlIH0gZnJvbSBcIi4vVGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tIFwiLi9UZXh0dXJlQXRsYXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBc3NldE1hbmFnZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcclxuICBwcml2YXRlIHBhdGhQcmVmaXg6IHN0cmluZztcclxuICBwcml2YXRlIHRleHR1cmVMb2FkZXI6IChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4gYW55O1xyXG4gIHByaXZhdGUgYXNzZXRzOiBNYXA8YW55PiA9IHt9O1xyXG4gIHByaXZhdGUgZXJyb3JzOiBNYXA8c3RyaW5nPiA9IHt9O1xyXG4gIHByaXZhdGUgdG9Mb2FkID0gMDtcclxuICBwcml2YXRlIGxvYWRlZCA9IDA7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB0ZXh0dXJlTG9hZGVyOiAoaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IGFueSxcclxuICAgIHBhdGhQcmVmaXg6IHN0cmluZyA9IFwiXCJcclxuICApIHtcclxuICAgIHRoaXMudGV4dHVyZUxvYWRlciA9IHRleHR1cmVMb2FkZXI7XHJcbiAgICB0aGlzLnBhdGhQcmVmaXggPSBwYXRoUHJlZml4O1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBkb3dubG9hZFRleHQoXHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIHN1Y2Nlc3M6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQsXHJcbiAgICBlcnJvcjogKHN0YXR1czogbnVtYmVyLCByZXNwb25zZVRleHQ6IHN0cmluZykgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCB1cmwsIHRydWUpO1xyXG4gICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICBzdWNjZXNzKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBlcnJvcihyZXF1ZXN0LnN0YXR1cywgcmVxdWVzdC5yZXNwb25zZVRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICBlcnJvcihyZXF1ZXN0LnN0YXR1cywgcmVxdWVzdC5yZXNwb25zZVRleHQpO1xyXG4gICAgfTtcclxuICAgIHJlcXVlc3Quc2VuZCgpO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBkb3dubG9hZEJpbmFyeShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQsXHJcbiAgICBlcnJvcjogKHN0YXR1czogbnVtYmVyLCByZXNwb25zZVRleHQ6IHN0cmluZykgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCB1cmwsIHRydWUpO1xyXG4gICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XHJcbiAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgIHN1Y2Nlc3MobmV3IFVpbnQ4QXJyYXkocmVxdWVzdC5yZXNwb25zZSBhcyBBcnJheUJ1ZmZlcikpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGVycm9yKHJlcXVlc3Quc3RhdHVzLCByZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgIGVycm9yKHJlcXVlc3Quc3RhdHVzLCByZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgICB9O1xyXG4gICAgcmVxdWVzdC5zZW5kKCk7XHJcbiAgfVxyXG4gIGxvYWRCaW5hcnkoXHJcbiAgICBwYXRoOiBzdHJpbmcsXHJcbiAgICBzdWNjZXNzOiAocGF0aDogc3RyaW5nLCBiaW5hcnk6IFVpbnQ4QXJyYXkpID0+IHZvaWQgPSBudWxsLFxyXG4gICAgZXJyb3I6IChwYXRoOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsXHJcbiAgKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHRoaXMudG9Mb2FkKys7XHJcbiAgICBBc3NldE1hbmFnZXIuZG93bmxvYWRCaW5hcnkoXHJcbiAgICAgIHBhdGgsXHJcbiAgICAgIChkYXRhOiBVaW50OEFycmF5KTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5hc3NldHNbcGF0aF0gPSBkYXRhO1xyXG4gICAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzKHBhdGgsIGRhdGEpO1xyXG4gICAgICAgIHRoaXMudG9Mb2FkLS07XHJcbiAgICAgICAgdGhpcy5sb2FkZWQrKztcclxuICAgICAgfSxcclxuICAgICAgKHN0YXRlOiBudW1iZXIsIHJlc3BvbnNlVGV4dDogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICBwYXRoXHJcbiAgICAgICAgXSA9IGBDb3VsZG4ndCBsb2FkIGJpbmFyeSAke3BhdGh9OiBzdGF0dXMgJHtzdGF0dXN9LCAke3Jlc3BvbnNlVGV4dH1gO1xyXG4gICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgIGVycm9yKFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCBiaW5hcnkgJHtwYXRofTogc3RhdHVzICR7c3RhdHVzfSwgJHtyZXNwb25zZVRleHR9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGxvYWRUZXh0KFxyXG4gICAgcGF0aDogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKHBhdGg6IHN0cmluZywgdGV4dDogc3RyaW5nKSA9PiB2b2lkID0gbnVsbCxcclxuICAgIGVycm9yOiAocGF0aDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkID0gbnVsbFxyXG4gICkge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICB0aGlzLnRvTG9hZCsrO1xyXG4gICAgQXNzZXRNYW5hZ2VyLmRvd25sb2FkVGV4dChcclxuICAgICAgcGF0aCxcclxuICAgICAgKGRhdGE6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuYXNzZXRzW3BhdGhdID0gZGF0YTtcclxuICAgICAgICBpZiAoc3VjY2Vzcykgc3VjY2VzcyhwYXRoLCBkYXRhKTtcclxuICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIH0sXHJcbiAgICAgIChzdGF0ZTogbnVtYmVyLCByZXNwb25zZVRleHQ6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuZXJyb3JzW1xyXG4gICAgICAgICAgcGF0aFxyXG4gICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0ICR7cGF0aH06IHN0YXR1cyAke3N0YXR1c30sICR7cmVzcG9uc2VUZXh0fWA7XHJcbiAgICAgICAgaWYgKGVycm9yKVxyXG4gICAgICAgICAgZXJyb3IoXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIGBDb3VsZG4ndCBsb2FkIHRleHQgJHtwYXRofTogc3RhdHVzICR7c3RhdHVzfSwgJHtyZXNwb25zZVRleHR9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGxvYWRUZXh0dXJlKFxyXG4gICAgcGF0aDogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKHBhdGg6IHN0cmluZywgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHZvaWQgPSBudWxsLFxyXG4gICAgZXJyb3I6IChwYXRoOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsXHJcbiAgKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHRoaXMudG9Mb2FkKys7XHJcbiAgICBsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcuY3Jvc3NPcmlnaW4gPSBcImFub255bW91c1wiO1xyXG4gICAgaW1nLm9ubG9hZCA9IGV2ID0+IHtcclxuICAgICAgbGV0IHRleHR1cmUgPSB0aGlzLnRleHR1cmVMb2FkZXIoaW1nKTtcclxuICAgICAgdGhpcy5hc3NldHNbcGF0aF0gPSB0ZXh0dXJlO1xyXG4gICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICB0aGlzLmxvYWRlZCsrO1xyXG4gICAgICBpZiAoc3VjY2Vzcykgc3VjY2VzcyhwYXRoLCBpbWcpO1xyXG4gICAgfTtcclxuICAgIGltZy5vbmVycm9yID0gZXYgPT4ge1xyXG4gICAgICB0aGlzLmVycm9yc1twYXRoXSA9IGBDb3VsZG4ndCBsb2FkIGltYWdlICR7cGF0aH1gO1xyXG4gICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICB0aGlzLmxvYWRlZCsrO1xyXG4gICAgICBpZiAoZXJyb3IpIGVycm9yKHBhdGgsIGBDb3VsZG4ndCBsb2FkIGltYWdlICR7cGF0aH1gKTtcclxuICAgIH07XHJcbiAgICBpbWcuc3JjID0gcGF0aDtcclxuICB9XHJcbiAgbG9hZFRleHR1cmVEYXRhKFxyXG4gICAgcGF0aDogc3RyaW5nLFxyXG4gICAgZGF0YTogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKHBhdGg6IHN0cmluZywgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHZvaWQgPSBudWxsLFxyXG4gICAgZXJyb3I6IChwYXRoOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsXHJcbiAgKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHRoaXMudG9Mb2FkKys7XHJcbiAgICBsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcub25sb2FkID0gZXYgPT4ge1xyXG4gICAgICBsZXQgdGV4dHVyZSA9IHRoaXMudGV4dHVyZUxvYWRlcihpbWcpO1xyXG4gICAgICB0aGlzLmFzc2V0c1twYXRoXSA9IHRleHR1cmU7XHJcbiAgICAgIHRoaXMudG9Mb2FkLS07XHJcbiAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzKHBhdGgsIGltZyk7XHJcbiAgICB9O1xyXG4gICAgaW1nLm9uZXJyb3IgPSBldiA9PiB7XHJcbiAgICAgIHRoaXMuZXJyb3JzW3BhdGhdID0gYENvdWxkbid0IGxvYWQgaW1hZ2UgJHtwYXRofWA7XHJcbiAgICAgIHRoaXMudG9Mb2FkLS07XHJcbiAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIGlmIChlcnJvcikgZXJyb3IocGF0aCwgYENvdWxkbid0IGxvYWQgaW1hZ2UgJHtwYXRofWApO1xyXG4gICAgfTtcclxuICAgIGltZy5zcmMgPSBkYXRhO1xyXG4gIH1cclxuICBsb2FkVGV4dHVyZUF0bGFzKFxyXG4gICAgcGF0aDogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKHBhdGg6IHN0cmluZywgYXRsYXM6IFRleHR1cmVBdGxhcykgPT4gdm9pZCA9IG51bGwsXHJcbiAgICBlcnJvcjogKHBhdGg6IHN0cmluZywgZXJyb3I6IHN0cmluZykgPT4gdm9pZCA9IG51bGxcclxuICApIHtcclxuICAgIGxldCBwYXJlbnQgPVxyXG4gICAgICBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA+PSAwXHJcbiAgICAgICAgPyBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSlcclxuICAgICAgICA6IFwiXCI7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHRoaXMudG9Mb2FkKys7XHJcbiAgICBBc3NldE1hbmFnZXIuZG93bmxvYWRUZXh0KFxyXG4gICAgICBwYXRoLFxyXG4gICAgICAoYXRsYXNEYXRhOiBzdHJpbmcpOiB2b2lkID0+IHtcclxuICAgICAgICBsZXQgcGFnZXNMb2FkZWQ6IGFueSA9IHsgY291bnQ6IDAgfTtcclxuICAgICAgICBsZXQgYXRsYXNQYWdlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCBhdGxhcyA9IG5ldyBUZXh0dXJlQXRsYXMoYXRsYXNEYXRhLCAocGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGF0bGFzUGFnZXMucHVzaChwYXJlbnQgKyBcIi9cIiArIHBhdGgpO1xyXG4gICAgICAgICAgICBsZXQgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGltYWdlLndpZHRoID0gMTY7XHJcbiAgICAgICAgICAgIGltYWdlLmhlaWdodCA9IDE2O1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZha2VUZXh0dXJlKGltYWdlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGxldCBleCA9IGUgYXMgRXJyb3I7XHJcbiAgICAgICAgICB0aGlzLmVycm9yc1tcclxuICAgICAgICAgICAgcGF0aFxyXG4gICAgICAgICAgXSA9IGBDb3VsZG4ndCBsb2FkIHRleHR1cmUgYXRsYXMgJHtwYXRofTogJHtleC5tZXNzYWdlfWA7XHJcbiAgICAgICAgICBpZiAoZXJyb3IpXHJcbiAgICAgICAgICAgIGVycm9yKHBhdGgsIGBDb3VsZG4ndCBsb2FkIHRleHR1cmUgYXRsYXMgJHtwYXRofTogJHtleC5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgdGhpcy50b0xvYWQtLTtcclxuICAgICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGF0bGFzUGFnZSBvZiBhdGxhc1BhZ2VzKSB7XHJcbiAgICAgICAgICBsZXQgcGFnZUxvYWRFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5sb2FkVGV4dHVyZShcclxuICAgICAgICAgICAgYXRsYXNQYWdlLFxyXG4gICAgICAgICAgICAoaW1hZ2VQYXRoOiBzdHJpbmcsIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgcGFnZXNMb2FkZWQuY291bnQrKztcclxuICAgICAgICAgICAgICBpZiAocGFnZXNMb2FkZWQuY291bnQgPT0gYXRsYXNQYWdlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGlmICghcGFnZUxvYWRFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhdGxhcyA9IG5ldyBUZXh0dXJlQXRsYXMoYXRsYXNEYXRhLCAocGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQocGFyZW50ICsgXCIvXCIgKyBwYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2V0c1twYXRoXSA9IGF0bGFzO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzKHBhdGgsIGF0bGFzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXggPSBlIGFzIEVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzW1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzICR7cGF0aH06ICR7ZXgubWVzc2FnZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzICR7cGF0aH06ICR7ZXgubWVzc2FnZX1gXHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9Mb2FkLS07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQrKztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aFxyXG4gICAgICAgICAgICAgICAgICBdID0gYENvdWxkbid0IGxvYWQgdGV4dHVyZSBhdGxhcyBwYWdlICR7aW1hZ2VQYXRofX0gb2YgYXRsYXMgJHtwYXRofWA7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzIHBhZ2UgJHtpbWFnZVBhdGh9IG9mIGF0bGFzICR7cGF0aH1gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy50b0xvYWQtLTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChpbWFnZVBhdGg6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBwYWdlTG9hZEVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBwYWdlc0xvYWRlZC5jb3VudCsrO1xyXG4gICAgICAgICAgICAgIGlmIChwYWdlc0xvYWRlZC5jb3VudCA9PSBhdGxhc1BhZ2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICAgICAgICAgIHBhdGhcclxuICAgICAgICAgICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzIHBhZ2UgJHtpbWFnZVBhdGh9fSBvZiBhdGxhcyAke3BhdGh9YDtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgICAgICAgICAgZXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzIHBhZ2UgJHtpbWFnZVBhdGh9IG9mIGF0bGFzICR7cGF0aH1gXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQrKztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoc3RhdGU6IG51bWJlciwgcmVzcG9uc2VUZXh0OiBzdHJpbmcpOiB2b2lkID0+IHtcclxuICAgICAgICB0aGlzLmVycm9yc1tcclxuICAgICAgICAgIHBhdGhcclxuICAgICAgICBdID0gYENvdWxkbid0IGxvYWQgdGV4dHVyZSBhdGxhcyAke3BhdGh9OiBzdGF0dXMgJHtzdGF0dXN9LCAke3Jlc3BvbnNlVGV4dH1gO1xyXG4gICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgIGVycm9yKFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzICR7cGF0aH06IHN0YXR1cyAke3N0YXR1c30sICR7cmVzcG9uc2VUZXh0fWBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgdGhpcy50b0xvYWQtLTtcclxuICAgICAgICB0aGlzLmxvYWRlZCsrO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICBnZXQocGF0aDogc3RyaW5nKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHJldHVybiB0aGlzLmFzc2V0c1twYXRoXTtcclxuICB9XHJcbiAgcmVtb3ZlKHBhdGg6IHN0cmluZykge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICBsZXQgYXNzZXQgPSB0aGlzLmFzc2V0c1twYXRoXTtcclxuICAgIGlmICgoPGFueT5hc3NldCkuZGlzcG9zZSkgKDxhbnk+YXNzZXQpLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuYXNzZXRzW3BhdGhdID0gbnVsbDtcclxuICB9XHJcbiAgcmVtb3ZlQWxsKCkge1xyXG4gICAgZm9yIChsZXQga2V5IGluIHRoaXMuYXNzZXRzKSB7XHJcbiAgICAgIGxldCBhc3NldCA9IHRoaXMuYXNzZXRzW2tleV07XHJcbiAgICAgIGlmICgoPGFueT5hc3NldCkuZGlzcG9zZSkgKDxhbnk+YXNzZXQpLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMuYXNzZXRzID0ge307XHJcbiAgfVxyXG4gIGlzTG9hZGluZ0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudG9Mb2FkID09IDA7XHJcbiAgfVxyXG4gIGdldFRvTG9hZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG9Mb2FkO1xyXG4gIH1cclxuICBnZXRMb2FkZWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmxvYWRlZDtcclxuICB9XHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMucmVtb3ZlQWxsKCk7XHJcbiAgfVxyXG4gIGhhc0Vycm9ycygpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmVycm9ycykubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgZ2V0RXJyb3JzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzO1xyXG4gIH1cclxufVxyXG4iXX0=