@esotericsoftware/spine-core
Version:
The official Spine Runtimes for the web.
270 lines • 35.7 kB
JavaScript
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated April 5, 2025. Replaces all prior versions.
*
* Copyright (c) 2013-2025, 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.
*****************************************************************************/
import { TextureFilter, TextureWrap, TextureRegion } from "./Texture.js";
import { Utils } from "./Utils.js";
export class TextureAtlas {
pages = new Array();
regions = new Array();
constructor(atlasText) {
let reader = new TextureAtlasReader(atlasText);
let entry = new Array(4);
let pageFields = {};
pageFields["size"] = (page) => {
page.width = parseInt(entry[1]);
page.height = parseInt(entry[2]);
};
pageFields["format"] = () => {
// page.format = Format[tuple[0]]; we don't need format in WebGL
};
pageFields["filter"] = (page) => {
page.minFilter = Utils.enumValue(TextureFilter, entry[1]);
page.magFilter = Utils.enumValue(TextureFilter, entry[2]);
};
pageFields["repeat"] = (page) => {
if (entry[1].indexOf('x') != -1)
page.uWrap = TextureWrap.Repeat;
if (entry[1].indexOf('y') != -1)
page.vWrap = TextureWrap.Repeat;
};
pageFields["pma"] = (page) => {
page.pma = entry[1] == "true";
};
var regionFields = {};
regionFields["xy"] = (region) => {
region.x = parseInt(entry[1]);
region.y = parseInt(entry[2]);
};
regionFields["size"] = (region) => {
region.width = parseInt(entry[1]);
region.height = parseInt(entry[2]);
};
regionFields["bounds"] = (region) => {
region.x = parseInt(entry[1]);
region.y = parseInt(entry[2]);
region.width = parseInt(entry[3]);
region.height = parseInt(entry[4]);
};
regionFields["offset"] = (region) => {
region.offsetX = parseInt(entry[1]);
region.offsetY = parseInt(entry[2]);
};
regionFields["orig"] = (region) => {
region.originalWidth = parseInt(entry[1]);
region.originalHeight = parseInt(entry[2]);
};
regionFields["offsets"] = (region) => {
region.offsetX = parseInt(entry[1]);
region.offsetY = parseInt(entry[2]);
region.originalWidth = parseInt(entry[3]);
region.originalHeight = parseInt(entry[4]);
};
regionFields["rotate"] = (region) => {
let value = entry[1];
if (value == "true")
region.degrees = 90;
else if (value != "false")
region.degrees = parseInt(value);
};
regionFields["index"] = (region) => {
region.index = parseInt(entry[1]);
};
let line = reader.readLine();
// Ignore empty lines before first entry.
while (line && line.trim().length == 0)
line = reader.readLine();
// Header entries.
while (true) {
if (!line || line.trim().length == 0)
break;
if (reader.readEntry(entry, line) == 0)
break; // Silently ignore all header fields.
line = reader.readLine();
}
// Page and region entries.
let page = null;
let names = null;
let values = null;
while (true) {
if (line === null)
break;
if (line.trim().length == 0) {
page = null;
line = reader.readLine();
}
else if (!page) {
page = new TextureAtlasPage(line.trim());
while (true) {
if (reader.readEntry(entry, line = reader.readLine()) == 0)
break;
let field = pageFields[entry[0]];
if (field)
field(page);
}
this.pages.push(page);
}
else {
let region = new TextureAtlasRegion(page, line);
while (true) {
let count = reader.readEntry(entry, line = reader.readLine());
if (count == 0)
break;
let field = regionFields[entry[0]];
if (field)
field(region);
else {
if (!names)
names = [];
if (!values)
values = [];
names.push(entry[0]);
let entryValues = [];
for (let i = 0; i < count; i++)
entryValues.push(parseInt(entry[i + 1]));
values.push(entryValues);
}
}
if (region.originalWidth == 0 && region.originalHeight == 0) {
region.originalWidth = region.width;
region.originalHeight = region.height;
}
if (names && names.length > 0 && values && values.length > 0) {
region.names = names;
region.values = values;
names = null;
values = null;
}
region.u = region.x / page.width;
region.v = region.y / page.height;
if (region.degrees == 90) {
region.u2 = (region.x + region.height) / page.width;
region.v2 = (region.y + region.width) / page.height;
}
else {
region.u2 = (region.x + region.width) / page.width;
region.v2 = (region.y + region.height) / page.height;
}
this.regions.push(region);
}
}
}
findRegion(name) {
for (let i = 0; i < this.regions.length; i++) {
if (this.regions[i].name == name) {
return this.regions[i];
}
}
return null;
}
setTextures(assetManager, pathPrefix = "") {
for (let page of this.pages)
page.setTexture(assetManager.get(pathPrefix + page.name));
}
dispose() {
for (let i = 0; i < this.pages.length; i++) {
this.pages[i].texture?.dispose();
}
}
}
class TextureAtlasReader {
lines;
index = 0;
constructor(text) {
this.lines = text.split(/\r\n|\r|\n/);
}
readLine() {
if (this.index >= this.lines.length)
return null;
return this.lines[this.index++];
}
readEntry(entry, line) {
if (!line)
return 0;
line = line.trim();
if (line.length == 0)
return 0;
let colon = line.indexOf(':');
if (colon == -1)
return 0;
entry[0] = line.substr(0, colon).trim();
for (let i = 1, lastMatch = colon + 1;; i++) {
let comma = line.indexOf(',', lastMatch);
if (comma == -1) {
entry[i] = line.substr(lastMatch).trim();
return i;
}
entry[i] = line.substr(lastMatch, comma - lastMatch).trim();
lastMatch = comma + 1;
if (i == 4)
return 4;
}
}
}
export class TextureAtlasPage {
name;
minFilter = TextureFilter.Nearest;
magFilter = TextureFilter.Nearest;
uWrap = TextureWrap.ClampToEdge;
vWrap = TextureWrap.ClampToEdge;
texture = null;
width = 0;
height = 0;
pma = false;
regions = new Array();
constructor(name) {
this.name = name;
}
setTexture(texture) {
this.texture = texture;
texture.setFilters(this.minFilter, this.magFilter);
texture.setWraps(this.uWrap, this.vWrap);
for (let region of this.regions)
region.texture = texture;
}
}
export class TextureAtlasRegion extends TextureRegion {
page;
name;
x = 0;
y = 0;
offsetX = 0;
offsetY = 0;
originalWidth = 0;
originalHeight = 0;
index = 0;
degrees = 0;
names = null;
values = null;
constructor(page, name) {
super();
this.page = page;
this.name = name;
page.regions.push(this);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dHVyZUF0bGFzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1RleHR1cmVBdGxhcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFHL0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQVcsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxLQUFLLEVBQWEsTUFBTSxZQUFZLENBQUM7QUFFMUQsTUFBTSxPQUFPLFlBQVk7SUFDeEIsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFvQixDQUFDO0lBQ3RDLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBc0IsQ0FBQztJQUUxQyxZQUFhLFNBQWlCO1FBQzdCLElBQUksTUFBTSxHQUFHLElBQUksa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFFakMsSUFBSSxVQUFVLEdBQWdELEVBQUUsQ0FBQztRQUNqRSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFzQixFQUFFLEVBQUU7WUFDL0MsSUFBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsRUFBRTtZQUMzQixnRUFBZ0U7UUFDakUsQ0FBQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBc0IsRUFBRSxFQUFFO1lBQ2pELElBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUM7UUFDRixVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFzQixFQUFFLEVBQUU7WUFDakQsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxJQUFLLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDbEUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxJQUFLLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDbkUsQ0FBQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBc0IsRUFBRSxFQUFFO1lBQzlDLElBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztRQUNoQyxDQUFDLENBQUM7UUFFRixJQUFJLFlBQVksR0FBb0QsRUFBRSxDQUFDO1FBQ3ZFLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQTBCLEVBQUUsRUFBRTtZQUNuRCxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUM7UUFDRixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUEwQixFQUFFLEVBQUU7WUFDckQsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDO1FBQ0YsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBMEIsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQztRQUNGLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQTBCLEVBQUUsRUFBRTtZQUN2RCxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFDRixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUEwQixFQUFFLEVBQUU7WUFDckQsTUFBTSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDO1FBQ0YsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBMEIsRUFBRSxFQUFFO1lBQ3hELE1BQU0sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFD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Q0FBQyxDQUFDO0lBQzFCLGNBQWMsR0FBVyxDQUFDLENBQUM7SUFDM0IsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUNsQixPQUFPLEdBQVcsQ0FBQyxDQUFDO0lBQ3BCLEtBQUssR0FBb0IsSUFBSSxDQUFDO0lBQzlCLE1BQU0sR0FBc0IsSUFBSSxDQUFDO0lBRWpDLFlBQWEsSUFBc0IsRUFBRSxJQUFZO1FBQ2hELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBc3NldE1hbmFnZXJCYXNlIH0gZnJvbSBcIi4vQXNzZXRNYW5hZ2VyQmFzZS5qc1wiO1xuaW1wb3J0IHsgVGV4dHVyZUZpbHRlciwgVGV4dHVyZVdyYXAsIFRleHR1cmUsIFRleHR1cmVSZWdpb24gfSBmcm9tIFwiLi9UZXh0dXJlLmpzXCI7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCBVdGlscywgU3RyaW5nTWFwIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhcyBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuXHRwYWdlcyA9IG5ldyBBcnJheTxUZXh0dXJlQXRsYXNQYWdlPigpO1xuXHRyZWdpb25zID0gbmV3IEFycmF5PFRleHR1cmVBdGxhc1JlZ2lvbj4oKTtcblxuXHRjb25zdHJ1Y3RvciAoYXRsYXNUZXh0OiBzdHJpbmcpIHtcblx0XHRsZXQgcmVhZGVyID0gbmV3IFRleHR1cmVBdGxhc1JlYWRlcihhdGxhc1RleHQpO1xuXHRcdGxldCBlbnRyeSA9IG5ldyBBcnJheTxzdHJpbmc+KDQpO1xuXG5cdFx0bGV0IHBhZ2VGaWVsZHM6IFN0cmluZ01hcDwocGFnZTogVGV4dHVyZUF0bGFzUGFnZSkgPT4gdm9pZD4gPSB7fTtcblx0XHRwYWdlRmllbGRzW1wic2l6ZVwiXSA9IChwYWdlOiBUZXh0dXJlQXRsYXNQYWdlKSA9PiB7XG5cdFx0XHRwYWdlIS53aWR0aCA9IHBhcnNlSW50KGVudHJ5WzFdKTtcblx0XHRcdHBhZ2UhLmhlaWdodCA9IHBhcnNlSW50KGVudHJ5WzJdKTtcblx0XHR9O1xuXHRcdHBhZ2VGaWVsZHNbXCJmb3JtYXRcIl0gPSAoKSA9PiB7XG5cdFx0XHQvLyBwYWdlLmZvcm1hdCA9IEZvcm1hdFt0dXBsZVswXV07IHdlIGRvbid0IG5lZWQgZm9ybWF0IGluIFdlYkdMXG5cdFx0fTtcblx0XHRwYWdlRmllbGRzW1wiZmlsdGVyXCJdID0gKHBhZ2U6IFRleHR1cmVBdGxhc1BhZ2UpID0+IHtcblx0XHRcdHBhZ2UhLm1pbkZpbHRlciA9IFV0aWxzLmVudW1WYWx1ZShUZXh0dXJlRmlsdGVyLCBlbnRyeVsxXSk7XG5cdFx0XHRwYWdlIS5tYWdGaWx0ZXIgPSBVdGlscy5lbnVtVmFsdWUoVGV4dHVyZUZpbHRlciwgZW50cnlbMl0pO1xuXHRcdH07XG5cdFx0cGFnZUZpZWxkc1tcInJlcGVhdFwiXSA9IChwYWdlOiBUZXh0dXJlQXRsYXNQYWdlKSA9PiB7XG5cdFx0XHRpZiAoZW50cnlbMV0uaW5kZXhPZigneCcpICE9IC0xKSBwYWdlIS51V3JhcCA9IFRleHR1cmVXcmFwLlJlcGVhdDtcblx0XHRcdGlmIChlbnRyeVsxXS5pbmRleE9mKCd5JykgIT0gLTEpIHBhZ2UhLnZXcmFwID0gVGV4dHVyZVdyYXAuUmVwZWF0O1xuXHRcdH07XG5cdFx0cGFnZUZpZWxkc1tcInBtYVwiXSA9IChwYWdlOiBUZXh0dXJlQXRsYXNQYWdlKSA9PiB7XG5cdFx0XHRwYWdlIS5wbWEgPSBlbnRyeVsxXSA9PSBcInRydWVcIjtcblx0XHR9O1xuXG5cdFx0dmFyIHJlZ2lvbkZpZWxkczogU3RyaW5nTWFwPChyZWdpb246IFRleHR1cmVBdGxhc1JlZ2lvbikgPT4gdm9pZD4gPSB7fTtcblx0XHRyZWdpb25GaWVsZHNbXCJ4eVwiXSA9IChyZWdpb246IFRleHR1cmVBdGxhc1JlZ2lvbikgPT4geyAvLyBEZXByZWNhdGVkLCB1c2UgYm91bmRzLlxuXHRcdFx0cmVnaW9uLnggPSBwYXJzZUludChlbnRyeVsxXSk7XG5cdFx0XHRyZWdpb24ueSA9IHBhcnNlSW50KGVudHJ5WzJdKTtcblx0XHR9O1xuXHRcdHJlZ2lvbkZpZWxkc1tcInNpemVcIl0gPSAocmVnaW9uOiBUZXh0dXJlQXRsYXNSZWdpb24pID0+IHsgLy8gRGVwcmVjYXRlZCwgdXNlIGJvdW5kcy5cblx0XHRcdHJlZ2lvbi53aWR0aCA9IHBhcnNlSW50KGVudHJ5WzFdKTtcblx0XHRcdHJlZ2lvbi5oZWlnaHQgPSBwYXJzZUludChlbnRyeVsyXSk7XG5cdFx0fTtcblx0XHRyZWdpb25GaWVsZHNbXCJib3VuZHNcIl0gPSAocmVnaW9uOiBUZXh0dXJlQXRsYXNSZWdpb24pID0+IHtcblx0XHRcdHJlZ2lvbi54ID0gcGFyc2VJbnQoZW50cnlbMV0pO1xuXHRcdFx0cmVnaW9uLnkgPSBwYXJzZUludChlbnRyeVsyXSk7XG5cdFx0XHRyZWdpb24ud2lkdGggPSBwYXJzZUludChlbnRyeVszXSk7XG5cdFx0XHRyZWdpb24uaGVpZ2h0ID0gcGFyc2VJbnQoZW50cnlbNF0pO1xuXHRcdH07XG5cdFx0cmVnaW9uRmllbGRzW1wib2Zmc2V0XCJdID0gKHJlZ2lvbjogVGV4dHVyZUF0bGFzUmVnaW9uKSA9PiB7IC8vIERlcHJlY2F0ZWQsIHVzZSBvZmZzZXRzLlxuXHRcdFx0cmVnaW9uLm9mZnNldFggPSBwYXJzZUludChlbnRyeVsxXSk7XG5cdFx0XHRyZWdpb24ub2Zmc2V0WSA9IHBhcnNlSW50KGVudHJ5WzJdKTtcblx0XHR9O1xuXHRcdHJlZ2lvbkZpZWxkc1tcIm9yaWdcIl0gPSAocmVnaW9uOiBUZXh0dXJlQXRsYXNSZWdpb24pID0+IHsgLy8gRGVwcmVjYXRlZCwgdXNlIG9mZnNldHMuXG5cdFx0XHRyZWdpb24ub3JpZ2luYWxXaWR0aCA9IHBhcnNlSW50KGVudHJ5WzFdKTtcblx0XHRcdHJlZ2lvbi5vcmlnaW5hbEhlaWdodCA9IHBhcnNlSW50KGVudHJ5WzJdKTtcblx0XHR9O1xuXHRcdHJlZ2lvbkZpZWxkc1tcIm9mZnNldHNcIl0gPSAocmVnaW9uOiBUZXh0dXJlQXRsYXNSZWdpb24pID0+IHtcblx0XHRcdHJlZ2lvbi5vZmZzZXRYID0gcGFyc2VJbnQoZW50cnlbMV0pO1xuXHRcdFx0cmVnaW9uLm9mZnNldFkgPSBwYXJzZUludChlbnRyeVsyXSk7XG5cdFx0XHRyZWdpb24ub3JpZ2luYWxXaWR0aCA9IHBhcnNlSW50KGVudHJ5WzNdKTtcblx0XHRcdHJlZ2lvbi5vcmlnaW5hbEhlaWdodCA9IHBhcnNlSW50KGVudHJ5WzRdKTtcblx0XHR9O1xuXHRcdHJlZ2lvbkZpZWxkc1tcInJvdGF0ZVwiXSA9IChyZWdpb246IFRleHR1cmVBdGxhc1JlZ2lvbikgPT4ge1xuXHRcdFx0bGV0IHZhbHVlID0gZW50cnlbMV07XG5cdFx0XHRpZiAodmFsdWUgPT0gXCJ0cnVlXCIpXG5cdFx0XHRcdHJlZ2lvbi5kZWdyZWVzID0gOTA7XG5cdFx0XHRlbHNlIGlmICh2YWx1ZSAhPSBcImZhbHNlXCIpXG5cdFx0XHRcdHJlZ2lvbi5kZWdyZWVzID0gcGFyc2VJbnQodmFsdWUpO1xuXHRcdH07XG5cdFx0cmVnaW9uRmllbGRzW1wiaW5kZXhcIl0gPSAocmVnaW9uOiBUZXh0dXJlQXRsYXNSZWdpb24pID0+IHtcblx0XHRcdHJlZ2lvbi5pbmRleCA9IHBhcnNlSW50KGVudHJ5WzFdKTtcblx0XHR9O1xuXG5cdFx0bGV0IGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTtcblx0XHQvLyBJZ25vcmUgZW1wdHkgbGluZXMgYmVmb3JlIGZpcnN0IGVudHJ5LlxuXHRcdHdoaWxlIChsaW5lICYmIGxpbmUudHJpbSgpLmxlbmd0aCA9PSAwKVxuXHRcdFx0bGluZSA9IHJlYWRlci5yZWFkTGluZSgpO1xuXHRcdC8vIEhlYWRlciBlbnRyaWVzLlxuXHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHRpZiAoIWxpbmUgfHwgbGluZS50cmltKCkubGVuZ3RoID09IDApIGJyZWFrO1xuXHRcdFx0aWYgKHJlYWRlci5yZWFkRW50cnkoZW50cnksIGxpbmUpID09IDApIGJyZWFrOyAvLyBTaWxlbnRseSBpZ25vcmUgYWxsIGhlYWRlciBmaWVsZHMuXG5cdFx0XHRsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7XG5cdFx0fVxuXG5cdFx0Ly8gUGFnZSBhbmQgcmVnaW9uIGVudHJpZXMuXG5cdFx0bGV0IHBhZ2U6IFRleHR1cmVBdGxhc1BhZ2UgfCBudWxsID0gbnVsbDtcblx0XHRsZXQgbmFtZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG5cdFx0bGV0IHZhbHVlczogbnVtYmVyW11bXSB8IG51bGwgPSBudWxsO1xuXHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHRpZiAobGluZSA9PT0gbnVsbCkgYnJlYWs7XG5cdFx0XHRpZiAobGluZS50cmltKCkubGVuZ3RoID09IDApIHtcblx0XHRcdFx0cGFnZSA9IG51bGw7XG5cdFx0XHRcdGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTtcblx0XHRcdH0gZWxzZSBpZiAoIXBhZ2UpIHtcblx0XHRcdFx0cGFnZSA9IG5ldyBUZXh0dXJlQXRsYXNQYWdlKGxpbmUudHJpbSgpKTtcblx0XHRcdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdFx0XHRpZiAocmVhZGVyLnJlYWRFbnRyeShlbnRyeSwgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSA9PSAwKSBicmVhaztcblx0XHRcdFx0XHRsZXQgZmllbGQgPSBwYWdlRmllbGRzW2VudHJ5WzBdXTtcblx0XHRcdFx0XHRpZiAoZmllbGQpIGZpZWxkKHBhZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMucGFnZXMucHVzaChwYWdlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxldCByZWdpb24gPSBuZXcgVGV4dHVyZUF0bGFzUmVnaW9uKHBhZ2UsIGxpbmUpO1xuXG5cdFx0XHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHRcdFx0bGV0IGNvdW50ID0gcmVhZGVyLnJlYWRFbnRyeShlbnRyeSwgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpKTtcblx0XHRcdFx0XHRpZiAoY291bnQgPT0gMCkgYnJlYWs7XG5cdFx0XHRcdFx0bGV0IGZpZWxkID0gcmVnaW9uRmllbGRzW2VudHJ5WzBdXTtcblx0XHRcdFx0XHRpZiAoZmllbGQpXG5cdFx0XHRcdFx0XHRmaWVsZChyZWdpb24pO1xuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCFuYW1lcykgbmFtZXMgPSBbXTtcblx0XHRcdFx0XHRcdGlmICghdmFsdWVzKSB2YWx1ZXMgPSBbXTtcblx0XHRcdFx0XHRcdG5hbWVzLnB1c2goZW50cnlbMF0pO1xuXHRcdFx0XHRcdFx0bGV0IGVudHJ5VmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0XHRlbnRyeVZhbHVlcy5wdXNoKHBhcnNlSW50KGVudHJ5W2kgKyAxXSkpO1xuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goZW50cnlWYWx1ZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocmVnaW9uLm9yaWdpbmFsV2lkdGggPT0gMCAmJiByZWdpb24ub3JpZ2luYWxIZWlnaHQgPT0gMCkge1xuXHRcdFx0XHRcdHJlZ2lvbi5vcmlnaW5hbFdpZHRoID0gcmVnaW9uLndpZHRoO1xuXHRcdFx0XHRcdHJlZ2lvbi5vcmlnaW5hbEhlaWdodCA9IHJlZ2lvbi5oZWlnaHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzICYmIG5hbWVzLmxlbmd0aCA+IDAgJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0cmVnaW9uLm5hbWVzID0gbmFtZXM7XG5cdFx0XHRcdFx0cmVnaW9uLnZhbHVlcyA9IHZhbHVlcztcblx0XHRcdFx0XHRuYW1lcyA9IG51bGw7XG5cdFx0XHRcdFx0dmFsdWVzID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZWdpb24udSA9IHJlZ2lvbi54IC8gcGFnZS53aWR0aDtcblx0XHRcdFx0cmVnaW9uLnYgPSByZWdpb24ueSAvIHBhZ2UuaGVpZ2h0O1xuXHRcdFx0XHRpZiAocmVnaW9uLmRlZ3JlZXMgPT0gOTApIHtcblx0XHRcdFx0XHRyZWdpb24udTIgPSAocmVnaW9uLnggKyByZWdpb24uaGVpZ2h0KSAvIHBhZ2Uud2lkdGg7XG5cdFx0XHRcdFx0cmVnaW9uLnYyID0gKHJlZ2lvbi55ICsgcmVnaW9uLndpZHRoKSAvIHBhZ2UuaGVpZ2h0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlZ2lvbi51MiA9IChyZWdpb24ueCArIHJlZ2lvbi53aWR0aCkgLyBwYWdlLndpZHRoO1xuXHRcdFx0XHRcdHJlZ2lvbi52MiA9IChyZWdpb24ueSArIHJlZ2lvbi5oZWlnaHQpIC8gcGFnZS5oZWlnaHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5yZWdpb25zLnB1c2gocmVnaW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmaW5kUmVnaW9uIChuYW1lOiBzdHJpbmcpOiBUZXh0dXJlQXRsYXNSZWdpb24gfCBudWxsIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVnaW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHRoaXMucmVnaW9uc1tpXS5uYW1lID09IG5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVnaW9uc1tpXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRzZXRUZXh0dXJlcyAoYXNzZXRNYW5hZ2VyOiBBc3NldE1hbmFnZXJCYXNlLCBwYXRoUHJlZml4OiBzdHJpbmcgPSBcIlwiKSB7XG5cdFx0Zm9yIChsZXQgcGFnZSBvZiB0aGlzLnBhZ2VzKVxuXHRcdFx0cGFnZS5zZXRUZXh0dXJlKGFzc2V0TWFuYWdlci5nZXQocGF0aFByZWZpeCArIHBhZ2UubmFtZSkpO1xuXHR9XG5cblx0ZGlzcG9zZSAoKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR0aGlzLnBhZ2VzW2ldLnRleHR1cmU/LmRpc3Bvc2UoKTtcblx0XHR9XG5cdH1cbn1cblxuY2xhc3MgVGV4dHVyZUF0bGFzUmVhZGVyIHtcblx0bGluZXM6IEFycmF5PHN0cmluZz47XG5cdGluZGV4OiBudW1iZXIgPSAwO1xuXG5cdGNvbnN0cnVjdG9yICh0ZXh0OiBzdHJpbmcpIHtcblx0XHR0aGlzLmxpbmVzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcblx0fVxuXG5cdHJlYWRMaW5lICgpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRpZiAodGhpcy5pbmRleCA+PSB0aGlzLmxpbmVzLmxlbmd0aClcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdHJldHVybiB0aGlzLmxpbmVzW3RoaXMuaW5kZXgrK107XG5cdH1cblxuXHRyZWFkRW50cnkgKGVudHJ5OiBzdHJpbmdbXSwgbGluZTogc3RyaW5nIHwgbnVsbCk6IG51bWJlciB7XG5cdFx0aWYgKCFsaW5lKSByZXR1cm4gMDtcblx0XHRsaW5lID0gbGluZS50cmltKCk7XG5cdFx0aWYgKGxpbmUubGVuZ3RoID09IDApIHJldHVybiAwO1xuXG5cdFx0bGV0IGNvbG9uID0gbGluZS5pbmRleE9mKCc6Jyk7XG5cdFx0aWYgKGNvbG9uID09IC0xKSByZXR1cm4gMDtcblx0XHRlbnRyeVswXSA9IGxpbmUuc3Vic3RyKDAsIGNvbG9uKS50cmltKCk7XG5cdFx0Zm9yIChsZXQgaSA9IDEsIGxhc3RNYXRjaCA9IGNvbG9uICsgMTsgOyBpKyspIHtcblx0XHRcdGxldCBjb21tYSA9IGxpbmUuaW5kZXhPZignLCcsIGxhc3RNYXRjaCk7XG5cdFx0XHRpZiAoY29tbWEgPT0gLTEpIHtcblx0XHRcdFx0ZW50cnlbaV0gPSBsaW5lLnN1YnN0cihsYXN0TWF0Y2gpLnRyaW0oKTtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0XHRlbnRyeVtpXSA9IGxpbmUuc3Vic3RyKGxhc3RNYXRjaCwgY29tbWEgLSBsYXN0TWF0Y2gpLnRyaW0oKTtcblx0XHRcdGxhc3RNYXRjaCA9IGNvbW1hICsgMTtcblx0XHRcdGlmIChpID09IDQpIHJldHVybiA0O1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY2xhc3MgVGV4dHVyZUF0bGFzUGFnZSB7XG5cdG5hbWU6IHN0cmluZztcblx0bWluRmlsdGVyOiBUZXh0dXJlRmlsdGVyID0gVGV4dHVyZUZpbHRlci5OZWFyZXN0O1xuXHRtYWdGaWx0ZXI6IFRleHR1cmVGaWx0ZXIgPSBUZXh0dXJlRmlsdGVyLk5lYXJlc3Q7XG5cdHVXcmFwOiBUZXh0dXJlV3JhcCA9IFRleHR1cmVXcmFwLkNsYW1wVG9FZGdlO1xuXHR2V3JhcDogVGV4dHVyZVdyYXAgPSBUZXh0dXJlV3JhcC5DbGFtcFRvRWRnZTtcblx0dGV4dHVyZTogVGV4dHVyZSB8IG51bGwgPSBudWxsO1xuXHR3aWR0aDogbnVtYmVyID0gMDtcblx0aGVpZ2h0OiBudW1iZXIgPSAwO1xuXHRwbWE6IGJvb2xlYW4gPSBmYWxzZTtcblx0cmVnaW9ucyA9IG5ldyBBcnJheTxUZXh0dXJlQXRsYXNSZWdpb24+KCk7XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZykge1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdH1cblxuXHRzZXRUZXh0dXJlICh0ZXh0dXJlOiBUZXh0dXJlKSB7XG5cdFx0dGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcblx0XHR0ZXh0dXJlLnNldEZpbHRlcnModGhpcy5taW5GaWx0ZXIsIHRoaXMubWFnRmlsdGVyKTtcblx0XHR0ZXh0dXJlLnNldFdyYXBzKHRoaXMudVdyYXAsIHRoaXMudldyYXApO1xuXHRcdGZvciAobGV0IHJlZ2lvbiBvZiB0aGlzLnJlZ2lvbnMpXG5cdFx0XHRyZWdpb24udGV4dHVyZSA9IHRleHR1cmU7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhc1JlZ2lvbiBleHRlbmRzIFRleHR1cmVSZWdpb24ge1xuXHRwYWdlOiBUZXh0dXJlQXRsYXNQYWdlO1xuXHRuYW1lOiBzdHJpbmc7XG5cdHg6IG51bWJlciA9IDA7XG5cdHk6IG51bWJlciA9IDA7XG5cdG9mZnNldFg6IG51bWJlciA9IDA7XG5cdG9mZnNldFk6IG51bWJlciA9IDA7XG5cdG9yaWdpbmFsV2lkdGg6IG51bWJlciA9IDA7XG5cdG9yaWdpbmFsSGVpZ2h0OiBudW1iZXIgPSAwO1xuXHRpbmRleDogbnVtYmVyID0gMDtcblx0ZGVncmVlczogbnVtYmVyID0gMDtcblx0bmFtZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG5cdHZhbHVlczogbnVtYmVyW11bXSB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChwYWdlOiBUZXh0dXJlQXRsYXNQYWdlLCBuYW1lOiBzdHJpbmcpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMucGFnZSA9IHBhZ2U7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHRwYWdlLnJlZ2lvbnMucHVzaCh0aGlzKTtcblx0fVxufVxuIl19