UNPKG

@esotericsoftware/spine-pixi-v8

Version:
148 lines 22.7 kB
/** **************************************************************************** * Spine Runtimes License Agreement * Last updated July 28, 2023. Replaces all prior versions. * * Copyright (c) 2013-2023, 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 { collectAllRenderables, extensions, ExtensionType, } from 'pixi.js'; import { BatchableSpineSlot } from './BatchableSpineSlot.js'; import { MeshAttachment, RegionAttachment } from '@esotericsoftware/spine-core'; const spineBlendModeMap = { 0: 'normal', 1: 'add', 2: 'multiply', 3: 'screen' }; // eslint-disable-next-line max-len export class SpinePipe { /** @ignore */ static extension = { type: [ ExtensionType.WebGLPipes, ExtensionType.WebGPUPipes, ExtensionType.CanvasPipes, ], name: 'spine', }; renderer; gpuSpineData = {}; _destroyRenderableBound = this.destroyRenderable.bind(this); constructor(renderer) { this.renderer = renderer; } validateRenderable(spine) { spine._validateAndTransformAttachments(); // if spine attachments have changed or destroyed, we need to rebuild the batch! if (spine.spineAttachmentsDirty) { return true; } // if the textures have changed, we need to rebuild the batch, but only if the texture is not already in the batch else if (spine.spineTexturesDirty) { // loop through and see if the textures have changed.. const drawOrder = spine.skeleton.drawOrder; const gpuSpine = this.gpuSpineData[spine.uid]; for (let i = 0, n = drawOrder.length; i < n; i++) { const slot = drawOrder[i]; const attachment = slot.getAttachment(); if (attachment instanceof RegionAttachment || attachment instanceof MeshAttachment) { const cacheData = spine._getCachedData(slot, attachment); const batchableSpineSlot = gpuSpine.slotBatches[cacheData.id]; const texture = cacheData.texture; if (texture !== batchableSpineSlot.texture) { if (!batchableSpineSlot._batcher.checkAndUpdateTexture(batchableSpineSlot, texture)) { return true; } } } } } return false; } addRenderable(spine, instructionSet) { const gpuSpine = this._getSpineData(spine); const batcher = this.renderer.renderPipes.batch; const drawOrder = spine.skeleton.drawOrder; const roundPixels = (this.renderer._roundPixels | spine._roundPixels); spine._validateAndTransformAttachments(); spine.spineAttachmentsDirty = false; spine.spineTexturesDirty = false; for (let i = 0, n = drawOrder.length; i < n; i++) { const slot = drawOrder[i]; const attachment = slot.getAttachment(); const blendMode = spineBlendModeMap[slot.data.blendMode]; if (attachment instanceof RegionAttachment || attachment instanceof MeshAttachment) { const cacheData = spine._getCachedData(slot, attachment); const batchableSpineSlot = gpuSpine.slotBatches[cacheData.id] ||= new BatchableSpineSlot(); batchableSpineSlot.setData(spine, cacheData, blendMode, roundPixels); if (!cacheData.skipRender) { batcher.addToBatch(batchableSpineSlot, instructionSet); } } const containerAttachment = spine._slotsObject[slot.data.name]; if (containerAttachment) { const container = containerAttachment.container; container.includeInBuild = true; collectAllRenderables(container, instructionSet, this.renderer); container.includeInBuild = false; } } } updateRenderable(spine) { const gpuSpine = this.gpuSpineData[spine.uid]; spine._validateAndTransformAttachments(); spine.spineAttachmentsDirty = false; spine.spineTexturesDirty = false; const drawOrder = spine.skeleton.drawOrder; for (let i = 0, n = drawOrder.length; i < n; i++) { const slot = drawOrder[i]; const attachment = slot.getAttachment(); if (attachment instanceof RegionAttachment || attachment instanceof MeshAttachment) { const cacheData = spine._getCachedData(slot, attachment); if (!cacheData.skipRender) { const batchableSpineSlot = gpuSpine.slotBatches[spine._getCachedData(slot, attachment).id]; batchableSpineSlot._batcher?.updateElement(batchableSpineSlot); } } } } destroyRenderable(spine) { this.gpuSpineData[spine.uid] = null; spine.off('destroyed', this._destroyRenderableBound); } destroy() { this.gpuSpineData = null; this.renderer = null; } _getSpineData(spine) { return this.gpuSpineData[spine.uid] || this._initMeshData(spine); } _initMeshData(spine) { this.gpuSpineData[spine.uid] = { slotBatches: {} }; spine.on('destroyed', this._destroyRenderableBound); return this.gpuSpineData[spine.uid]; } } extensions.add(SpinePipe); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVQaXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lUGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUNOLHFCQUFxQixFQUNyQixVQUFVLEVBQUUsYUFBYSxHQU16QixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFaEYsTUFBTSxpQkFBaUIsR0FBZ0M7SUFDdEQsQ0FBQyxFQUFFLFFBQVE7SUFDWCxDQUFDLEVBQUUsS0FBSztJQUNSLENBQUMsRUFBRSxVQUFVO0lBQ2IsQ0FBQyxFQUFFLFFBQVE7Q0FDWCxDQUFDO0FBSUYsbUNBQW1DO0FBQ25DLE1BQU0sT0FBTyxTQUFTO0lBQ3JCLGNBQWM7SUFDZCxNQUFNLENBQUMsU0FBUyxHQUFHO1FBQ2xCLElBQUksRUFBRTtZQUNMLGFBQWEsQ0FBQyxVQUFVO1lBQ3hCLGFBQWEsQ0FBQyxXQUFXO1lBQ3pCLGFBQWEsQ0FBQyxXQUFXO1NBQ3pCO1FBQ0QsSUFBSSxFQUFFLE9BQU87S0FDSixDQUFDO0lBRVgsUUFBUSxDQUFXO0lBRVgsWUFBWSxHQUF3QyxFQUFFLENBQUM7SUFDOUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQW9DLENBQUM7SUFFaEgsWUFBYSxRQUFrQjtRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0JBQWtCLENBQUUsS0FBWTtRQUMvQixLQUFLLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUV6QyxnRkFBZ0Y7UUFDaEYsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNqQyxPQUFPLElB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QUM7UUFDcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDOztBQUdGLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBKdWx5IDI4LCAyMDIzLiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjMsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3JcbiAqIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSEVcbiAqIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQge1xuXHRjb2xsZWN0QWxsUmVuZGVyYWJsZXMsXG5cdGV4dGVuc2lvbnMsIEV4dGVuc2lvblR5cGUsXG5cdEluc3RydWN0aW9uU2V0LFxuXHR0eXBlIEJMRU5EX01PREVTLFxuXHR0eXBlIENvbnRhaW5lcixcblx0dHlwZSBSZW5kZXJlcixcblx0dHlwZSBSZW5kZXJQaXBlLFxufSBmcm9tICdwaXhpLmpzJztcbmltcG9ydCB7IEJhdGNoYWJsZVNwaW5lU2xvdCB9IGZyb20gJy4vQmF0Y2hhYmxlU3BpbmVTbG90LmpzJztcbmltcG9ydCB7IFNwaW5lIH0gZnJvbSAnLi9TcGluZS5qcyc7XG5pbXBvcnQgeyBNZXNoQXR0YWNobWVudCwgUmVnaW9uQXR0YWNobWVudCB9IGZyb20gJ0Blc290ZXJpY3NvZnR3YXJlL3NwaW5lLWNvcmUnO1xuXG5jb25zdCBzcGluZUJsZW5kTW9kZU1hcDogUmVjb3JkPG51bWJlciwgQkxFTkRfTU9ERVM+ID0ge1xuXHQwOiAnbm9ybWFsJyxcblx0MTogJ2FkZCcsXG5cdDI6ICdtdWx0aXBseScsXG5cdDM6ICdzY3JlZW4nXG59O1xuXG50eXBlIEdwdVNwaW5lRGF0YUVsZW1lbnQgPSB7IHNsb3RCYXRjaGVzOiBSZWNvcmQ8c3RyaW5nLCBCYXRjaGFibGVTcGluZVNsb3Q+IH07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG5leHBvcnQgY2xhc3MgU3BpbmVQaXBlIGltcGxlbWVudHMgUmVuZGVyUGlwZTxTcGluZT4ge1xuXHQvKiogQGlnbm9yZSAqL1xuXHRzdGF0aWMgZXh0ZW5zaW9uID0ge1xuXHRcdHR5cGU6IFtcblx0XHRcdEV4dGVuc2lvblR5cGUuV2ViR0xQaXBlcyxcblx0XHRcdEV4dGVuc2lvblR5cGUuV2ViR1BVUGlwZXMsXG5cdFx0XHRFeHRlbnNpb25UeXBlLkNhbnZhc1BpcGVzLFxuXHRcdF0sXG5cdFx0bmFtZTogJ3NwaW5lJyxcblx0fSBhcyBjb25zdDtcblxuXHRyZW5kZXJlcjogUmVuZGVyZXI7XG5cblx0cHJpdmF0ZSBncHVTcGluZURhdGE6IFJlY29yZDxzdHJpbmcsIEdwdVNwaW5lRGF0YUVsZW1lbnQ+ID0ge307XG5cdHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZW5kZXJhYmxlQm91bmQgPSB0aGlzLmRlc3Ryb3lSZW5kZXJhYmxlLmJpbmQodGhpcykgYXMgKHJlbmRlcmFibGU6IENvbnRhaW5lcikgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3RvciAocmVuZGVyZXI6IFJlbmRlcmVyKSB7XG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXHR9XG5cblx0dmFsaWRhdGVSZW5kZXJhYmxlIChzcGluZTogU3BpbmUpOiBib29sZWFuIHtcblx0XHRzcGluZS5fdmFsaWRhdGVBbmRUcmFuc2Zvcm1BdHRhY2htZW50cygpO1xuXG5cdFx0Ly8gaWYgc3BpbmUgYXR0YWNobWVudHMgaGF2ZSBjaGFuZ2VkIG9yIGRlc3Ryb3llZCwgd2UgbmVlZCB0byByZWJ1aWxkIHRoZSBiYXRjaCFcblx0XHRpZiAoc3BpbmUuc3BpbmVBdHRhY2htZW50c0RpcnR5KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBpZiB0aGUgdGV4dHVyZXMgaGF2ZSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJlYnVpbGQgdGhlIGJhdGNoLCBidXQgb25seSBpZiB0aGUgdGV4dHVyZSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgYmF0Y2hcblx0XHRlbHNlIGlmIChzcGluZS5zcGluZVRleHR1cmVzRGlydHkpIHtcblx0XHRcdC8vIGxvb3AgdGhyb3VnaCBhbmQgc2VlIGlmIHRoZSB0ZXh0dXJlcyBoYXZlIGNoYW5nZWQuLlxuXHRcdFx0Y29uc3QgZHJhd09yZGVyID0gc3BpbmUuc2tlbGV0b24uZHJhd09yZGVyO1xuXHRcdFx0Y29uc3QgZ3B1U3BpbmUgPSB0aGlzLmdwdVNwaW5lRGF0YVtzcGluZS51aWRdO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdFx0Y29uc3Qgc2xvdCA9IGRyYXdPcmRlcltpXTtcblx0XHRcdFx0Y29uc3QgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xuXG5cdFx0XHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCB8fCBhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0XHRjb25zdCBjYWNoZURhdGEgPSBzcGluZS5fZ2V0Q2FjaGVkRGF0YShzbG90LCBhdHRhY2htZW50KTtcblx0XHRcdFx0XHRjb25zdCBiYXRjaGFibGVTcGluZVNsb3QgPSBncHVTcGluZS5zbG90QmF0Y2hlc1tjYWNoZURhdGEuaWRdO1xuXG5cdFx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IGNhY2hlRGF0YS50ZXh0dXJlO1xuXG5cdFx0XHRcdFx0aWYgKHRleHR1cmUgIT09IGJhdGNoYWJsZVNwaW5lU2xvdC50ZXh0dXJlKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWJhdGNoYWJsZVNwaW5lU2xvdC5fYmF0Y2hlci5jaGVja0FuZFVwZGF0ZVRleHR1cmUoYmF0Y2hhYmxlU3BpbmVTbG90LCB0ZXh0dXJlKSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRhZGRSZW5kZXJhYmxlIChzcGluZTogU3BpbmUsIGluc3RydWN0aW9uU2V0OiBJbnN0cnVjdGlvblNldCkge1xuXHRcdGNvbnN0IGdwdVNwaW5lID0gdGhpcy5fZ2V0U3BpbmVEYXRhKHNwaW5lKTtcblxuXHRcdGNvbnN0IGJhdGNoZXIgPSB0aGlzLnJlbmRlcmVyLnJlbmRlclBpcGVzLmJhdGNoO1xuXG5cdFx0Y29uc3QgZHJhd09yZGVyID0gc3BpbmUuc2tlbGV0b24uZHJhd09yZGVyO1xuXG5cdFx0Y29uc3Qgcm91bmRQaXhlbHMgPSAodGhpcy5yZW5kZXJlci5fcm91bmRQaXhlbHMgfCBzcGluZS5fcm91bmRQaXhlbHMpIGFzIDAgfCAxO1xuXG5cdFx0c3BpbmUuX3ZhbGlkYXRlQW5kVHJhbnNmb3JtQXR0YWNobWVudHMoKTtcblxuXHRcdHNwaW5lLnNwaW5lQXR0YWNobWVudHNEaXJ0eSA9IGZhbHNlO1xuXHRcdHNwaW5lLnNwaW5lVGV4dHVyZXNEaXJ0eSA9IGZhbHNlO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBkcmF3T3JkZXIubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXHRcdFx0Y29uc3QgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xuXHRcdFx0Y29uc3QgYmxlbmRNb2RlID0gc3BpbmVCbGVuZE1vZGVNYXBbc2xvdC5kYXRhLmJsZW5kTW9kZV07XG5cblx0XHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCB8fCBhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0Y29uc3QgY2FjaGVEYXRhID0gc3BpbmUuX2dldENhY2hlZERhdGEoc2xvdCwgYXR0YWNobWVudCk7XG5cdFx0XHRcdGNvbnN0IGJhdGNoYWJsZVNwaW5lU2xvdCA9IGdwdVNwaW5lLnNsb3RCYXRjaGVzW2NhY2hlRGF0YS5pZF0gfHw9IG5ldyBCYXRjaGFibGVTcGluZVNsb3QoKTtcblxuXHRcdFx0XHRiYXRjaGFibGVTcGluZVNsb3Quc2V0RGF0YShcblx0XHRcdFx0XHRzcGluZSxcblx0XHRcdFx0XHRjYWNoZURhdGEsXG5cdFx0XHRcdFx0YmxlbmRNb2RlLFxuXHRcdFx0XHRcdHJvdW5kUGl4ZWxzXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKCFjYWNoZURhdGEuc2tpcFJlbmRlcikge1xuXHRcdFx0XHRcdGJhdGNoZXIuYWRkVG9CYXRjaChiYXRjaGFibGVTcGluZVNsb3QsIGluc3RydWN0aW9uU2V0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb250YWluZXJBdHRhY2htZW50ID0gc3BpbmUuX3Nsb3RzT2JqZWN0W3Nsb3QuZGF0YS5uYW1lXTtcblxuXHRcdFx0aWYgKGNvbnRhaW5lckF0dGFjaG1lbnQpIHtcblx0XHRcdFx0Y29uc3QgY29udGFpbmVyID0gY29udGFpbmVyQXR0YWNobWVudC5jb250YWluZXI7XG5cblx0XHRcdFx0Y29udGFpbmVyLmluY2x1ZGVJbkJ1aWxkID0gdHJ1ZTtcblx0XHRcdFx0Y29sbGVjdEFsbFJlbmRlcmFibGVzKGNvbnRhaW5lciwgaW5zdHJ1Y3Rpb25TZXQsIHRoaXMucmVuZGVyZXIpO1xuXHRcdFx0XHRjb250YWluZXIuaW5jbHVkZUluQnVpbGQgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR1cGRhdGVSZW5kZXJhYmxlIChzcGluZTogU3BpbmUpIHtcblx0XHRjb25zdCBncHVTcGluZSA9IHRoaXMuZ3B1U3BpbmVEYXRhW3NwaW5lLnVpZF07XG5cblx0XHRzcGluZS5fdmFsaWRhdGVBbmRUcmFuc2Zvcm1BdHRhY2htZW50cygpO1xuXG5cdFx0c3BpbmUuc3BpbmVBdHRhY2htZW50c0RpcnR5ID0gZmFsc2U7XG5cdFx0c3BpbmUuc3BpbmVUZXh0dXJlc0RpcnR5ID0gZmFsc2U7XG5cblx0XHRjb25zdCBkcmF3T3JkZXIgPSBzcGluZS5za2VsZXRvbi5kcmF3T3JkZXI7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IHNsb3QgPSBkcmF3T3JkZXJbaV07XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCB8fCBhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0Y29uc3QgY2FjaGVEYXRhID0gc3BpbmUuX2dldENhY2hlZERhdGEoc2xvdCwgYXR0YWNobWVudCk7XG5cblx0XHRcdFx0aWYgKCFjYWNoZURhdGEuc2tpcFJlbmRlcikge1xuXHRcdFx0XHRcdGNvbnN0IGJhdGNoYWJsZVNwaW5lU2xvdCA9IGdwdVNwaW5lLnNsb3RCYXRjaGVzW3NwaW5lLl9nZXRDYWNoZWREYXRhKHNsb3QsIGF0dGFjaG1lbnQpLmlkXTtcblxuXHRcdFx0XHRcdGJhdGNoYWJsZVNwaW5lU2xvdC5fYmF0Y2hlcj8udXBkYXRlRWxlbWVudChiYXRjaGFibGVTcGluZVNsb3QpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZGVzdHJveVJlbmRlcmFibGUgKHNwaW5lOiBTcGluZSkge1xuXHRcdHRoaXMuZ3B1U3BpbmVEYXRhW3NwaW5lLnVpZF0gPSBudWxsIGFzIGFueTtcblx0XHRzcGluZS5vZmYoJ2Rlc3Ryb3llZCcsIHRoaXMuX2Rlc3Ryb3lSZW5kZXJhYmxlQm91bmQpO1xuXHR9XG5cblx0ZGVzdHJveSAoKSB7XG5cdFx0dGhpcy5ncHVTcGluZURhdGEgPSBudWxsIGFzIGFueTtcblx0XHR0aGlzLnJlbmRlcmVyID0gbnVsbCBhcyBhbnk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRTcGluZURhdGEgKHNwaW5lOiBTcGluZSk6IEdwdVNwaW5lRGF0YUVsZW1lbnQge1xuXHRcdHJldHVybiB0aGlzLmdwdVNwaW5lRGF0YVtzcGluZS51aWRdIHx8IHRoaXMuX2luaXRNZXNoRGF0YShzcGluZSk7XG5cdH1cblxuXHRwcml2YXRlIF9pbml0TWVzaERhdGEgKHNwaW5lOiBTcGluZSk6IEdwdVNwaW5lRGF0YUVsZW1lbnQge1xuXHRcdHRoaXMuZ3B1U3BpbmVEYXRhW3NwaW5lLnVpZF0gPSB7IHNsb3RCYXRjaGVzOiB7fSB9O1xuXHRcdHNwaW5lLm9uKCdkZXN0cm95ZWQnLCB0aGlzLl9kZXN0cm95UmVuZGVyYWJsZUJvdW5kKTtcblx0XHRyZXR1cm4gdGhpcy5ncHVTcGluZURhdGFbc3BpbmUudWlkXTtcblx0fVxufVxuXG5leHRlbnNpb25zLmFkZChTcGluZVBpcGUpO1xuIl19