UNPKG

@esotericsoftware/spine-player

Version:
129 lines (127 loc) 16.1 kB
/****************************************************************************** * Spine Runtimes License Agreement * Last updated January 1, 2020. Replaces all prior versions. * * Copyright (c) 2013-2020, 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. *****************************************************************************/ function loadScript(url) { return new Promise((resolve, reject) => { const script = document.createElement('script'); script.src = url; script.onload = () => resolve(); script.onerror = () => reject(new Error(`Script load error for ${url}`)); document.head.appendChild(script); }); } function loadCss(url) { return new Promise((resolve, reject) => { const link = document.createElement('link'); link.href = url; link.rel = 'stylesheet'; link.onload = () => resolve(); link.onerror = () => reject(new Error(`CSS load error for ${url}`)); document.head.appendChild(link); }); } export class SpinePlayerEditor { parent; static DEFAULT_CODE = ` <script src="https://esotericsoftware.com/files/spine-player/4.1/spine-player.js"></script> <link rel="stylesheet" href="https://esotericsoftware.com/files/spine-player/4.1/spine-player.css"> <div id="player-container" style="width: 100vw; height: 100vh;"></div> <script> new spine.SpinePlayer("player-container", { jsonUrl: "https://esotericsoftware.com/files/examples/4.1/spineboy/export/spineboy-pro.json", atlasUrl: "https://esotericsoftware.com/files/examples/4.1/spineboy/export/spineboy-pma.atlas" }); </script> `.trim(); prefix = `<html> <head> <style> body { margin: 0px; } </style> </head> <body>`.trim(); postfix = `</body>`; code; player; constructor(parent) { this.parent = parent; this.load(); } async load() { await Promise.all([loadScript("https://www.unpkg.com/codemirror@5.51.0/lib/codemirror.js"), loadCss("https://www.unpkg.com/codemirror@5.51.0/lib/codemirror.css")]); this.render(this.parent); } render(parent) { let dom = /*html*/ ` <div style="display: flex; flex-direction: column; width: 100%; height: 100%;"> <div style="width: 100%; height: 50%"></div> <iframe style="width: 100%; height: 50%; outline: none; border: none;"></iframe> </div> `; parent.innerHTML = dom; let codeElement = parent.children[0].children[0]; this.player = parent.children[0].children[1]; requestAnimationFrame(() => { this.code = CodeMirror(codeElement, { lineNumbers: true, tabSize: 3, indentUnit: 3, indentWithTabs: true, scrollBarStyle: "native", mode: "htmlmixed", theme: "monokai" }); this.code.on("change", () => { this.startPlayer(); }); codeElement.children[0].style.height = "100%"; this.setCode(SpinePlayerEditor.DEFAULT_CODE); }); } setPreAndPostfix(prefix, postfix) { this.prefix = prefix; this.postfix = postfix; this.startPlayer(); } setCode(code) { this.code.setValue(code); this.startPlayer(); } timerId = 0; startPlayer() { clearTimeout(this.timerId); this.timerId = setTimeout(() => { let code = this.code.getDoc().getValue(); code = this.prefix + code + this.postfix; code = window.btoa(code); this.player.src = ""; this.player.src = "data:text/html;base64," + code; }, 500); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGxheWVyRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BsYXllckVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFJL0UsU0FBUyxVQUFVLENBQUUsR0FBVztJQUMvQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFFLEdBQVc7SUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN0QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRSxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0lBNEJDO0lBM0J0QixNQUFNLENBQUMsWUFBWSxHQUMxQjs7Ozs7Ozs7Ozs7O0dBWUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVGLE1BQU0sR0FDYjs7Ozs7O09BTUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNMLE9BQU8sR0FBVyxTQUFTLENBQUM7SUFDNUIsSUFBSSxDQUFNO0lBQ1YsTUFBTSxDQUFxQjtJQUVuQyxZQUE4QixNQUFtQjtRQUFuQixXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ2hELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFTyxLQUFLLENBQUMsSUFBSTtRQUNqQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsMkRBQTJELENBQUMsRUFBRSxPQUFPLENBQUMsNERBQTRELENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVPLE1BQU0sQ0FBRSxNQUFtQjtRQUNsQyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUE7Ozs7O0lBS2hCLENBQUM7UUFDSCxNQUFNLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUN2QixJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBc0IsQ0FBQztRQUVsRSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUNuQyxXQUFXLEVBQUUsSUFBSTtnQkFDakIsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsVUFBVSxFQUFFLENBQUM7Z0JBQ2IsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixJQUFJLEVBQUUsV0FBVztnQkFDakIsS0FBSyxFQUFFLFNBQVM7YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1lBRUYsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDL0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxNQUFjLEVBQUUsT0FBZTtRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVELE9BQU8sQ0FBRSxJQUFZO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sT0FBTyxHQUFRLENBQUMsQ0FBQztJQUN6QixXQUFXO1FBQ1YsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6QyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN6QyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU8sQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3BELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEphbnVhcnkgMSwgMjAyMC4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDIwLCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZGVjbGFyZSBmdW5jdGlvbiBDb2RlTWlycm9yIChlbDogRWxlbWVudCwgY29uZmlnOiBhbnkpOiB2b2lkO1xuXG5mdW5jdGlvbiBsb2FkU2NyaXB0ICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdFx0c2NyaXB0Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKTtcblx0XHRzY3JpcHQub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFNjcmlwdCBsb2FkIGVycm9yIGZvciAke3VybH1gKSk7XG5cdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gbG9hZENzcyAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuXHRcdGxpbmsuaHJlZiA9IHVybDtcblx0XHRsaW5rLnJlbCA9ICdzdHlsZXNoZWV0Jztcblx0XHRsaW5rLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKTtcblx0XHRsaW5rLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBDU1MgbG9hZCBlcnJvciBmb3IgJHt1cmx9YCkpO1xuXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgU3BpbmVQbGF5ZXJFZGl0b3Ige1xuXHRwcml2YXRlIHN0YXRpYyBERUZBVUxUX0NPREUgPVxuXHRcdGBcbjxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9maWxlcy9zcGluZS1wbGF5ZXIvNC4xL3NwaW5lLXBsYXllci5qc1wiPjwvc2NyaXB0PlxuPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCJodHRwczovL2Vzb3Rlcmljc29mdHdhcmUuY29tL2ZpbGVzL3NwaW5lLXBsYXllci80LjEvc3BpbmUtcGxheWVyLmNzc1wiPlxuXG48ZGl2IGlkPVwicGxheWVyLWNvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMHZ3OyBoZWlnaHQ6IDEwMHZoO1wiPjwvZGl2PlxuXG48c2NyaXB0PlxubmV3IHNwaW5lLlNwaW5lUGxheWVyKFwicGxheWVyLWNvbnRhaW5lclwiLCB7XG5cdGpzb25Vcmw6IFwiaHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9maWxlcy9leGFtcGxlcy80LjEvc3BpbmVib3kvZXhwb3J0L3NwaW5lYm95LXByby5qc29uXCIsXG5cdGF0bGFzVXJsOiBcImh0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vZmlsZXMvZXhhbXBsZXMvNC4xL3NwaW5lYm95L2V4cG9ydC9zcGluZWJveS1wbWEuYXRsYXNcIlxufSk7XG48L3NjcmlwdD5cblx0XHRgLnRyaW0oKTtcblxuXHRwcml2YXRlIHByZWZpeDogc3RyaW5nID1cblx0XHRgPGh0bWw+XG48aGVhZD5cbjxzdHlsZT5cbmJvZHkgeyBtYXJnaW46IDBweDsgfVxuPC9zdHlsZT5cbjwvaGVhZD5cbjxib2R5PmAudHJpbSgpXG5cdHByaXZhdGUgcG9zdGZpeDogc3RyaW5nID0gYDwvYm9keT5gO1xuXHRwcml2YXRlIGNvZGU6IGFueTtcblx0cHJpdmF0ZSBwbGF5ZXI/OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuXHRjb25zdHJ1Y3RvciAocHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG5cdFx0dGhpcy5sb2FkKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGxvYWQgKCkge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtsb2FkU2NyaXB0KFwiaHR0cHM6Ly93d3cudW5wa2cuY29tL2NvZGVtaXJyb3JANS41MS4wL2xpYi9jb2RlbWlycm9yLmpzXCIpLCBsb2FkQ3NzKFwiaHR0cHM6Ly93d3cudW5wa2cuY29tL2NvZGVtaXJyb3JANS41MS4wL2xpYi9jb2RlbWlycm9yLmNzc1wiKV0pO1xuXHRcdHRoaXMucmVuZGVyKHRoaXMucGFyZW50KTtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyIChwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG5cdFx0bGV0IGRvbSA9IC8qaHRtbCovYFxuXHRcdFx0XHQ8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIj5cblx0XHRcdFx0XHQ8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogNTAlXCI+PC9kaXY+XG5cdFx0XHRcdFx0PGlmcmFtZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDUwJTsgb3V0bGluZTogbm9uZTsgYm9yZGVyOiBub25lO1wiPjwvaWZyYW1lPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdGA7XG5cdFx0cGFyZW50LmlubmVySFRNTCA9IGRvbTtcblx0XHRsZXQgY29kZUVsZW1lbnQgPSBwYXJlbnQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF07XG5cdFx0dGhpcy5wbGF5ZXIgPSBwYXJlbnQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV0gYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0dGhpcy5jb2RlID0gQ29kZU1pcnJvcihjb2RlRWxlbWVudCwge1xuXHRcdFx0XHRsaW5lTnVtYmVyczogdHJ1ZSxcblx0XHRcdFx0dGFiU2l6ZTogMyxcblx0XHRcdFx0aW5kZW50VW5pdDogMyxcblx0XHRcdFx0aW5kZW50V2l0aFRhYnM6IHRydWUsXG5cdFx0XHRcdHNjcm9sbEJhclN0eWxlOiBcIm5hdGl2ZVwiLFxuXHRcdFx0XHRtb2RlOiBcImh0bWxtaXhlZFwiLFxuXHRcdFx0XHR0aGVtZTogXCJtb25va2FpXCJcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5jb2RlLm9uKFwiY2hhbmdlXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5zdGFydFBsYXllcigpO1xuXHRcdFx0fSk7XG5cblx0XHRcdChjb2RlRWxlbWVudC5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XG5cdFx0XHR0aGlzLnNldENvZGUoU3BpbmVQbGF5ZXJFZGl0b3IuREVGQVVMVF9DT0RFKTtcblx0XHR9KVxuXHR9XG5cblx0c2V0UHJlQW5kUG9zdGZpeCAocHJlZml4OiBzdHJpbmcsIHBvc3RmaXg6IHN0cmluZykge1xuXHRcdHRoaXMucHJlZml4ID0gcHJlZml4O1xuXHRcdHRoaXMucG9zdGZpeCA9IHBvc3RmaXg7XG5cdFx0dGhpcy5zdGFydFBsYXllcigpXG5cdH1cblxuXHRzZXRDb2RlIChjb2RlOiBzdHJpbmcpIHtcblx0XHR0aGlzLmNvZGUuc2V0VmFsdWUoY29kZSk7XG5cdFx0dGhpcy5zdGFydFBsYXllcigpO1xuXHR9XG5cblx0cHJpdmF0ZSB0aW1lcklkOiBhbnkgPSAwO1xuXHRzdGFydFBsYXllciAoKSB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7XG5cdFx0dGhpcy50aW1lcklkID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRsZXQgY29kZSA9IHRoaXMuY29kZS5nZXREb2MoKS5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29kZSA9IHRoaXMucHJlZml4ICsgY29kZSArIHRoaXMucG9zdGZpeDtcblx0XHRcdGNvZGUgPSB3aW5kb3cuYnRvYShjb2RlKTtcblx0XHRcdHRoaXMucGxheWVyIS5zcmMgPSBcIlwiO1xuXHRcdFx0dGhpcy5wbGF5ZXIhLnNyYyA9IFwiZGF0YTp0ZXh0L2h0bWw7YmFzZTY0LFwiICsgY29kZTtcblx0XHR9LCA1MDApO1xuXHR9XG59XG4iXX0=