123 lines
20 KiB
JavaScript
123 lines
20 KiB
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 { TextureAtlas } from "@esotericsoftware/spine-core";
|
|
import { SpineTexture } from "../SpineTexture.js";
|
|
import { Assets, copySearchParams } from "@pixi/assets";
|
|
import { LoaderParserPriority, checkExtension } from "@pixi/assets";
|
|
import { ALPHA_MODES, ExtensionType, settings, utils, BaseTexture, extensions } from "@pixi/core";
|
|
const loaderName = "spineTextureAtlasLoader";
|
|
const spineTextureAtlasLoader = {
|
|
extension: ExtensionType.Asset,
|
|
resolver: {
|
|
test: (value) => checkExtension(value, ".atlas"),
|
|
parse: (value) => {
|
|
const split = value.split('.');
|
|
return {
|
|
resolution: parseFloat(settings.RETINA_PREFIX?.exec(value)?.[1] ?? '1'),
|
|
format: split[split.length - 2],
|
|
src: value,
|
|
};
|
|
},
|
|
},
|
|
loader: {
|
|
name: loaderName,
|
|
extension: {
|
|
type: ExtensionType.LoadParser,
|
|
priority: LoaderParserPriority.Normal,
|
|
name: loaderName,
|
|
},
|
|
test(url) {
|
|
return checkExtension(url, ".atlas");
|
|
},
|
|
async load(url) {
|
|
const response = await settings.ADAPTER.fetch(url);
|
|
if (!response.ok)
|
|
throw new Error(`[${loaderName}] Failed to fetch ${url}: ${response.status} ${response.statusText}`);
|
|
return await response.text();
|
|
},
|
|
testParse(asset, options) {
|
|
const isExtensionRight = checkExtension(options.src, ".atlas");
|
|
const isString = typeof asset === "string";
|
|
const isExplicitLoadParserSet = options.loadParser === loaderName;
|
|
return Promise.resolve((isExtensionRight || isExplicitLoadParserSet) && isString);
|
|
},
|
|
unload(atlas) {
|
|
atlas.dispose();
|
|
},
|
|
async parse(asset, options, loader) {
|
|
const metadata = options.data || {};
|
|
let basePath = utils.path.dirname(options.src);
|
|
if (basePath && basePath.lastIndexOf("/") !== basePath.length - 1) {
|
|
basePath += "/";
|
|
}
|
|
// Retval is going to be a texture atlas. However, we need to wait for its callback to resolve this promise.
|
|
const retval = new TextureAtlas(asset);
|
|
// If the user gave me only one texture, that one is assumed to be the "first" texture in the atlas
|
|
if (metadata.images instanceof BaseTexture || typeof metadata.images === "string") {
|
|
const pixiTexture = metadata.images;
|
|
metadata.images = {};
|
|
metadata.images[retval.pages[0].name] = pixiTexture;
|
|
}
|
|
// we will wait for all promises for the textures at the same time at the end.
|
|
const textureLoadingPromises = [];
|
|
// setting preferCreateImageBitmap to false for loadTextures loader to allow loading PMA images
|
|
let oldPreferCreateImageBitmap = true;
|
|
for (const parser of loader.parsers) {
|
|
if (parser.name == "loadTextures") {
|
|
oldPreferCreateImageBitmap = parser.config?.preferCreateImageBitmap;
|
|
break;
|
|
}
|
|
}
|
|
Assets.setPreferences({ preferCreateImageBitmap: false });
|
|
// fill the pages
|
|
for (const page of retval.pages) {
|
|
const pageName = page.name;
|
|
const providedPage = metadata?.images ? metadata.images[pageName] : undefined;
|
|
if (providedPage instanceof BaseTexture) {
|
|
page.setTexture(SpineTexture.from(providedPage));
|
|
}
|
|
else {
|
|
const url = providedPage ?? utils.path.normalize([...basePath.split(utils.path.sep), pageName].join(utils.path.sep));
|
|
const assetsToLoadIn = { src: copySearchParams(url, options.src), data: { ...metadata.imageMetadata, ...{ alphaMode: page.pma ? ALPHA_MODES.PMA : ALPHA_MODES.UNPACK } } };
|
|
const pixiPromise = loader.load(assetsToLoadIn)
|
|
.then((texture) => {
|
|
page.setTexture(SpineTexture.from(texture.baseTexture));
|
|
});
|
|
textureLoadingPromises.push(pixiPromise);
|
|
}
|
|
}
|
|
await Promise.all(textureLoadingPromises);
|
|
// restoring preferCreateImageBitmap old value for loadTextures loader
|
|
Assets.setPreferences({ preferCreateImageBitmap: oldPreferCreateImageBitmap });
|
|
return retval;
|
|
},
|
|
},
|
|
};
|
|
extensions.add(spineTextureAtlasLoader);
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXNMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL2F0bGFzTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE9BQU8sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJbEcsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUM7QUFFN0MsTUFBTSx1QkFBdUIsR0FBaUU7SUFDN0YsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLO0lBRTlCLFFBQVEsRUFBRTtRQUNULElBQUksRUFBRSxDQUFDLEtBQWEsRUFBVyxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7UUFDakUsS0FBSyxFQUFFLENBQUMsS0FBYSxFQUFtQixFQUFFO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsT0FBTztnQkFDTixVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO2dCQUN2RSxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQixHQUFHLEVBQUUsS0FB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LENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDekQsQ0FBQyxDQUFDLENBQUM7b0JBQ0osc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO1lBQ0YsQ0FBQztZQUVELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBRTFDLHNFQUFzRTtZQUN0RSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1lBRS9FLE9BQU8sTUFBTSxDQUFDO1FBQ2YsQ0FBQztLQUNEO0NBQytELENBQUM7QUFFbEUsVUFBVSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tIFwiQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZVwiO1xuaW1wb3J0IHsgU3BpbmVUZXh0dXJlIH0gZnJvbSBcIi4uL1NwaW5lVGV4dHVyZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBc3NldEV4dGVuc2lvbiwgTG9hZGVyLCBSZXNvbHZlZEFzc2V0LCBVbnJlc29sdmVkQXNzZXQgfSBmcm9tIFwiQHBpeGkvYXNzZXRzXCI7XG5pbXBvcnQgeyBBc3NldHMsIGNvcHlTZWFyY2hQYXJhbXMgfSBmcm9tIFwiQHBpeGkvYXNzZXRzXCI7XG5pbXBvcnQgeyBMb2FkZXJQYXJzZXJQcmlvcml0eSwgY2hlY2tFeHRlbnNpb24gfSBmcm9tIFwiQHBpeGkvYXNzZXRzXCI7XG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuaW1wb3J0IHsgQUxQSEFfTU9ERVMsIEV4dGVuc2lvblR5cGUsIHNldHRpbmdzLCB1dGlscywgQmFzZVRleHR1cmUsIGV4dGVuc2lvbnMgfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuXG50eXBlIFJhd0F0bGFzID0gc3RyaW5nO1xuXG5jb25zdCBsb2FkZXJOYW1lID0gXCJzcGluZVRleHR1cmVBdGxhc0xvYWRlclwiO1xuXG5jb25zdCBzcGluZVRleHR1cmVBdGxhc0xvYWRlcjogQXNzZXRFeHRlbnNpb248UmF3QXRsYXMgfCBUZXh0dXJlQXRsYXMsIElTcGluZUF0bGFzTWV0YWRhdGE+ID0ge1xuXHRleHRlbnNpb246IEV4dGVuc2lvblR5cGUuQXNzZXQsXG5cblx0cmVzb2x2ZXI6IHtcblx0XHR0ZXN0OiAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4gY2hlY2tFeHRlbnNpb24odmFsdWUsIFwiLmF0bGFzXCIpLFxuXHRcdHBhcnNlOiAodmFsdWU6IHN0cmluZyk6IFVucmVzb2x2ZWRBc3NldCA9PiB7XG5cdFx0XHRjb25zdCBzcGxpdCA9IHZhbHVlLnNwbGl0KCcuJyk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZXNvbHV0aW9uOiBwYXJzZUZsb2F0KHNldHRpbmdzLlJFVElOQV9QUkVGSVg/LmV4ZWModmFsdWUpPy5bMV0gPz8gJzEnKSxcblx0XHRcdFx0Zm9ybWF0OiBzcGxpdFtzcGxpdC5sZW5ndGggLSAyXSxcblx0XHRcdFx0c3JjOiB2YWx1ZSxcblx0XHRcdH07XG5cdFx0fSxcblx0fSxcblxuXHRsb2FkZXI6IHtcblx0XHRuYW1lOiBsb2FkZXJOYW1lLFxuXHRcdGV4dGVuc2lvbjoge1xuXHRcdFx0dHlwZTogRXh0ZW5zaW9uVHlwZS5Mb2FkUGFyc2VyLFxuXHRcdFx0cHJpb3JpdHk6IExvYWRlclBhcnNlclByaW9yaXR5Lk5vcm1hbCxcblx0XHRcdG5hbWU6IGxvYWRlck5hbWUsXG5cdFx0fSxcblxuXHRcdHRlc3QgKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gY2hlY2tFeHRlbnNpb24odXJsLCBcIi5hdGxhc1wiKTtcblx0XHR9LFxuXG5cdFx0YXN5bmMgbG9hZCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPFJhd0F0bGFzPiB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHNldHRpbmdzLkFEQVBURVIuZmV0Y2godXJsKTtcblxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaylcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBbJHtsb2FkZXJOYW1lfV0gRmFpbGVkIHRvIGZldGNoICR7dXJsfTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblx0XHR9LFxuXG5cdFx0dGVzdFBhcnNlIChhc3NldDogdW5rbm93biwgb3B0aW9uczogUmVzb2x2ZWRBc3NldCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdFx0Y29uc3QgaXNFeHRlbnNpb25SaWdodCA9IGNoZWNrRXh0ZW5zaW9uKG9wdGlvbnMuc3JjISwgXCIuYXRsYXNcIik7XG5cdFx0XHRjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBhc3NldCA9PT0gXCJzdHJpbmdcIjtcblx0XHRcdGNvbnN0IGlzRXhwbGljaXRMb2FkUGFyc2VyU2V0ID0gb3B0aW9ucy5sb2FkUGFyc2VyID09PSBsb2FkZXJOYW1lO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChpc0V4dGVuc2lvblJpZ2h0IHx8IGlzRXhwbGljaXRMb2FkUGFyc2VyU2V0KSAmJiBpc1N0cmluZyk7XG5cdFx0fSxcblxuXHRcdHVubG9hZCAoYXRsYXM6IFRleHR1cmVBdGxhcykge1xuXHRcdFx0YXRsYXMuZGlzcG9zZSgpO1xuXHRcdH0sXG5cblx0XHRhc3luYyBwYXJzZSAoYXNzZXQ6IFJhd0F0bGFzLCBvcHRpb25zOiB7IHNyYzogc3RyaW5nLCBkYXRhOiBJU3BpbmVBdGxhc01ldGFkYXRhIH0sIGxvYWRlcjogTG9hZGVyKTogUHJvbWlzZTxUZXh0dXJlQXRsYXM+IHtcblx0XHRcdGNvbnN0IG1ldGFkYXRhOiBJU3BpbmVBdGxhc01ldGFkYXRhID0gb3B0aW9ucy5kYXRhIHx8IHt9O1xuXHRcdFx0bGV0IGJhc2VQYXRoID0gdXRpbHMucGF0aC5kaXJuYW1lKG9wdGlvbnMuc3JjKTtcblxuXHRcdFx0aWYgKGJhc2VQYXRoICYmIGJhc2VQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSAhPT0gYmFzZVBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRiYXNlUGF0aCArPSBcIi9cIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dmFsIGlzIGdvaW5nIHRvIGJlIGEgdGV4dHVyZSBhdGxhcy4gSG93ZXZlciwgd2UgbmVlZCB0byB3YWl0IGZvciBpdHMgY2FsbGJhY2sgdG8gcmVzb2x2ZSB0aGlzIHByb21pc2UuXG5cdFx0XHRjb25zdCByZXR2YWwgPSBuZXcgVGV4dHVyZUF0bGFzKGFzc2V0KTtcblxuXHRcdFx0Ly8gSWYgdGhlIHVzZXIgZ2F2ZSBtZSBvbmx5IG9uZSB0ZXh0dXJlLCB0aGF0IG9uZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBcImZpcnN0XCIgdGV4dHVyZSBpbiB0aGUgYXRsYXNcblx0XHRcdGlmIChtZXRhZGF0YS5pbWFnZXMgaW5zdGFuY2VvZiBCYXNlVGV4dHVyZSB8fCB0eXBlb2YgbWV0YWRhdGEuaW1hZ2VzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IHBpeGlUZXh0dXJlID0gbWV0YWRhdGEuaW1hZ2VzO1xuXHRcdFx0XHRtZXRhZGF0YS5pbWFnZXMgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBCYXNlVGV4dHVyZSB8IHN0cmluZz47XG5cdFx0XHRcdG1ldGFkYXRhLmltYWdlc1tyZXR2YWwucGFnZXNbMF0ubmFtZV0gPSBwaXhpVGV4dHVyZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gd2Ugd2lsbCB3YWl0IGZvciBhbGwgcHJvbWlzZXMgZm9yIHRoZSB0ZXh0dXJlcyBhdCB0aGUgc2FtZSB0aW1lIGF0IHRoZSBlbmQuXG5cdFx0XHRjb25zdCB0ZXh0dXJlTG9hZGluZ1Byb21pc2VzID0gW107XG5cblx0XHRcdC8vIHNldHRpbmcgcHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXAgdG8gZmFsc2UgZm9yIGxvYWRUZXh0dXJlcyBsb2FkZXIgdG8gYWxsb3cgbG9hZGluZyBQTUEgaW1hZ2VzXG5cdFx0XHRsZXQgb2xkUHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXAgPSB0cnVlO1xuXHRcdFx0Zm9yIChjb25zdCBwYXJzZXIgb2YgbG9hZGVyLnBhcnNlcnMpIHtcblx0XHRcdFx0aWYgKHBhcnNlci5uYW1lID09IFwibG9hZFRleHR1cmVzXCIpIHtcblx0XHRcdFx0XHRvbGRQcmVmZXJDcmVhdGVJbWFnZUJpdG1hcCA9IHBhcnNlci5jb25maWc/LnByZWZlckNyZWF0ZUltYWdlQml0bWFwO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRBc3NldHMuc2V0UHJlZmVyZW5jZXMoeyBwcmVmZXJDcmVhdGVJbWFnZUJpdG1hcDogZmFsc2UgfSk7XG5cblx0XHRcdC8vIGZpbGwgdGhlIHBhZ2VzXG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcmV0dmFsLnBhZ2VzKSB7XG5cdFx0XHRcdGNvbnN0IHBhZ2VOYW1lID0gcGFnZS5uYW1lO1xuXHRcdFx0XHRjb25zdCBwcm92aWRlZFBhZ2UgPSBtZXRhZGF0YT8uaW1hZ2VzID8gbWV0YWRhdGEuaW1hZ2VzW3BhZ2VOYW1lXSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHByb3ZpZGVkUGFnZSBpbnN0YW5jZW9mIEJhc2VUZXh0dXJlKSB7XG5cdFx0XHRcdFx0cGFnZS5zZXRUZXh0dXJlKFNwaW5lVGV4dHVyZS5mcm9tKHByb3ZpZGVkUGFnZSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHVybDogc3RyaW5nID0gcHJvdmlkZWRQYWdlID8/IHV0aWxzLnBhdGgubm9ybWFsaXplKFsuLi5iYXNlUGF0aC5zcGxpdCh1dGlscy5wYXRoLnNlcCksIHBhZ2VOYW1lXS5qb2luKHV0aWxzLnBhdGguc2VwKSk7XG5cdFx0XHRcdFx0Y29uc3QgYXNzZXRzVG9Mb2FkSW4gPSB7IHNyYzogY29weVNlYXJjaFBhcmFtcyh1cmwsIG9wdGlvbnMuc3JjIGFzIHN0cmluZyksIGRhdGE6IHsgLi4ubWV0YWRhdGEuaW1hZ2VNZXRhZGF0YSwgLi4ueyBhbHBoYU1vZGU6IHBhZ2UucG1hID8gQUxQSEFfTU9ERVMuUE1BIDogQUxQSEFfTU9ERVMuVU5QQUNLIH0gfSB9O1xuXHRcdFx0XHRcdGNvbnN0IHBpeGlQcm9taXNlID0gbG9hZGVyLmxvYWQ8VGV4dHVyZT4oYXNzZXRzVG9Mb2FkSW4pXG5cdFx0XHRcdFx0XHQudGhlbigodGV4dHVyZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRwYWdlLnNldFRleHR1cmUoU3BpbmVUZXh0dXJlLmZyb20odGV4dHVyZS5iYXNlVGV4dHVyZSkpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGV4dHVyZUxvYWRpbmdQcm9taXNlcy5wdXNoKHBpeGlQcm9taXNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbCh0ZXh0dXJlTG9hZGluZ1Byb21pc2VzKTtcblxuXHRcdFx0Ly8gcmVzdG9yaW5nIHByZWZlckNyZWF0ZUltYWdlQml0bWFwIG9sZCB2YWx1ZSBmb3IgbG9hZFRleHR1cmVzIGxvYWRlclxuXHRcdFx0QXNzZXRzLnNldFByZWZlcmVuY2VzKHsgcHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXA6IG9sZFByZWZlckNyZWF0ZUltYWdlQml0bWFwIH0pO1xuXG5cdFx0XHRyZXR1cm4gcmV0dmFsO1xuXHRcdH0sXG5cdH0sXG59IGFzIEFzc2V0RXh0ZW5zaW9uPFJhd0F0bGFzIHwgVGV4dHVyZUF0bGFzLCBJU3BpbmVBdGxhc01ldGFkYXRhPjtcblxuZXh0ZW5zaW9ucy5hZGQoc3BpbmVUZXh0dXJlQXRsYXNMb2FkZXIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTcGluZUF0bGFzTWV0YWRhdGEge1xuXHQvLyBJZiB5b3UgYXJlIGRvd25sb2FkaW5nIGFuIC5hdGxhcyBmaWxlLCB0aGlzIG1ldGFkYXRhIHdpbGwgZ28gdG8gdGhlIFRleHR1cmUgbG9hZGVyXG5cdGltYWdlTWV0YWRhdGE/OiBhbnk7XG5cdC8vIElmIHlvdSBhbHJlYWR5IGhhdmUgYXRsYXMgcGFnZXMgbG9hZGVkIGFzIHBpeGkgdGV4dHVyZXMgYW5kIHdhbnQgdG8gdXNlIHRoYXQgdG8gY3JlYXRlIHRoZSBhdGxhcywgeW91IGNhbiBwYXNzIHRoZW0gaGVyZVxuXHRpbWFnZXM/OiBCYXNlVGV4dHVyZSB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIEJhc2VUZXh0dXJlIHwgc3RyaW5nPjtcbn1cbiJdfQ==
|