UNPKG

ngx-spine

Version:

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

379 lines 31.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /****************************************************************************** * 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 { ManagedWebGLRenderingContext } from "./WebGL"; import { Shader } from "./Shader"; export class Mesh { /** * @param {?} context * @param {?} attributes * @param {?} maxVertices * @param {?} maxIndices */ constructor(context, attributes, maxVertices, maxIndices) { this.attributes = attributes; this.verticesLength = 0; this.dirtyVertices = false; this.indicesLength = 0; this.dirtyIndices = false; this.elementsPerVertex = 0; this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); this.elementsPerVertex = 0; for (let i = 0; i < attributes.length; i++) { this.elementsPerVertex += attributes[i].numElements; } this.vertices = new Float32Array(maxVertices * this.elementsPerVertex); this.indices = new Uint16Array(maxIndices); this.context.addRestorable(this); } /** * @return {?} */ getAttributes() { return this.attributes; } /** * @return {?} */ maxVertices() { return this.vertices.length / this.elementsPerVertex; } /** * @return {?} */ numVertices() { return this.verticesLength / this.elementsPerVertex; } /** * @param {?} length * @return {?} */ setVerticesLength(length) { this.dirtyVertices = true; this.verticesLength = length; } /** * @return {?} */ getVertices() { return this.vertices; } /** * @return {?} */ maxIndices() { return this.indices.length; } /** * @return {?} */ numIndices() { return this.indicesLength; } /** * @param {?} length * @return {?} */ setIndicesLength(length) { this.dirtyIndices = true; this.indicesLength = length; } /** * @return {?} */ getIndices() { return this.indices; } /** * @return {?} */ getVertexSizeInFloats() { /** @type {?} */ let size = 0; for (var i = 0; i < this.attributes.length; i++) { /** @type {?} */ let attribute = this.attributes[i]; size += attribute.numElements; } return size; } /** * @param {?} vertices * @return {?} */ setVertices(vertices) { this.dirtyVertices = true; if (vertices.length > this.vertices.length) throw Error("Mesh can't store more than " + this.maxVertices() + " vertices"); this.vertices.set(vertices, 0); this.verticesLength = vertices.length; } /** * @param {?} indices * @return {?} */ setIndices(indices) { this.dirtyIndices = true; if (indices.length > this.indices.length) throw Error("Mesh can't store more than " + this.maxIndices() + " indices"); this.indices.set(indices, 0); this.indicesLength = indices.length; } /** * @param {?} shader * @param {?} primitiveType * @return {?} */ draw(shader, primitiveType) { this.drawWithOffset(shader, primitiveType, 0, this.indicesLength > 0 ? this.indicesLength : this.verticesLength / this.elementsPerVertex); } /** * @param {?} shader * @param {?} primitiveType * @param {?} offset * @param {?} count * @return {?} */ drawWithOffset(shader, primitiveType, offset, count) { /** @type {?} */ let gl = this.context.gl; if (this.dirtyVertices || this.dirtyIndices) this.update(); this.bind(shader); if (this.indicesLength > 0) { gl.drawElements(primitiveType, count, gl.UNSIGNED_SHORT, offset * 2); } else { gl.drawArrays(primitiveType, offset, count); } this.unbind(shader); } /** * @param {?} shader * @return {?} */ bind(shader) { /** @type {?} */ let gl = this.context.gl; gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); /** @type {?} */ let offset = 0; for (let i = 0; i < this.attributes.length; i++) { /** @type {?} */ let attrib = this.attributes[i]; /** @type {?} */ let location = shader.getAttributeLocation(attrib.name); gl.enableVertexAttribArray(location); gl.vertexAttribPointer(location, attrib.numElements, gl.FLOAT, false, this.elementsPerVertex * 4, offset * 4); offset += attrib.numElements; } if (this.indicesLength > 0) gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); } /** * @param {?} shader * @return {?} */ unbind(shader) { /** @type {?} */ let gl = this.context.gl; for (let i = 0; i < this.attributes.length; i++) { /** @type {?} */ let attrib = this.attributes[i]; /** @type {?} */ let location = shader.getAttributeLocation(attrib.name); gl.disableVertexAttribArray(location); } gl.bindBuffer(gl.ARRAY_BUFFER, null); if (this.indicesLength > 0) gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); } /** * @private * @return {?} */ update() { /** @type {?} */ let gl = this.context.gl; if (this.dirtyVertices) { if (!this.verticesBuffer) { this.verticesBuffer = gl.createBuffer(); } gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertices.subarray(0, this.verticesLength), gl.DYNAMIC_DRAW); this.dirtyVertices = false; } if (this.dirtyIndices) { if (!this.indicesBuffer) { this.indicesBuffer = gl.createBuffer(); } gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices.subarray(0, this.indicesLength), gl.DYNAMIC_DRAW); this.dirtyIndices = false; } } /** * @return {?} */ restore() { this.verticesBuffer = null; this.indicesBuffer = null; this.update(); } /** * @return {?} */ dispose() { this.context.removeRestorable(this); /** @type {?} */ let gl = this.context.gl; gl.deleteBuffer(this.verticesBuffer); gl.deleteBuffer(this.indicesBuffer); } } if (false) { /** * @type {?} * @private */ Mesh.prototype.context; /** * @type {?} * @private */ Mesh.prototype.vertices; /** * @type {?} * @private */ Mesh.prototype.verticesBuffer; /** * @type {?} * @private */ Mesh.prototype.verticesLength; /** * @type {?} * @private */ Mesh.prototype.dirtyVertices; /** * @type {?} * @private */ Mesh.prototype.indices; /** * @type {?} * @private */ Mesh.prototype.indicesBuffer; /** * @type {?} * @private */ Mesh.prototype.indicesLength; /** * @type {?} * @private */ Mesh.prototype.dirtyIndices; /** * @type {?} * @private */ Mesh.prototype.elementsPerVertex; /** * @type {?} * @private */ Mesh.prototype.attributes; } export class VertexAttribute { /** * @param {?} name * @param {?} type * @param {?} numElements */ constructor(name, type, numElements) { this.name = name; this.type = type; this.numElements = numElements; } } if (false) { /** @type {?} */ VertexAttribute.prototype.name; /** @type {?} */ VertexAttribute.prototype.type; /** @type {?} */ VertexAttribute.prototype.numElements; } export class Position2Attribute extends VertexAttribute { constructor() { super(Shader.POSITION, VertexAttributeType.Float, 2); } } export class Position3Attribute extends VertexAttribute { constructor() { super(Shader.POSITION, VertexAttributeType.Float, 3); } } export class TexCoordAttribute extends VertexAttribute { /** * @param {?=} unit */ constructor(unit = 0) { super(Shader.TEXCOORDS + (unit == 0 ? "" : unit), VertexAttributeType.Float, 2); } } export class ColorAttribute extends VertexAttribute { constructor() { super(Shader.COLOR, VertexAttributeType.Float, 4); } } export class Color2Attribute extends VertexAttribute { constructor() { super(Shader.COLOR2, VertexAttributeType.Float, 4); } } /** @enum {number} */ const VertexAttributeType = { Float: 0, }; export { VertexAttributeType }; VertexAttributeType[VertexAttributeType.Float] = 'Float'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzaC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy93ZWJnbC9NZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJBLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE1BQU0sT0FBTyxJQUFJOzs7Ozs7O0lBZ0RmLFlBQ0UsT0FBNkQsRUFDckQsVUFBNkIsRUFDckMsV0FBbUIsRUFDbkIsVUFBa0I7UUFGVixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQTlDL0IsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHdEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBNEM1QixJQUFJLENBQUMsT0FBTztZQUNWLE9BQU8sWUFBWSw0QkFBNEI7Z0JBQzdDLENBQUMsQ0FBQyxPQUFPO2dCQUNULENBQUMsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7U0FDckQ7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksV0FBVyxD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LENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDMUMsbUJBQW1CLENBQUMsS0FBSyxFQUN6QixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUNELE1BQU0sT0FBTyxjQUFlLFNBQVEsZUFBZTtJQUNqRDtRQUNFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFDRCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUFlO0lBQ2xEO1FBQ0UsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDRjs7O0lBRUMsUUFBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5pbXBvcnQgeyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IH0gZnJvbSBcIi4vV2ViR0xcIjtcclxuaW1wb3J0IHsgRGlzcG9zYWJsZSwgUmVzdG9yYWJsZSB9IGZyb20gXCIuLi9jb3JlL1V0aWxzXCI7XHJcbmltcG9ydCB7IFNoYWRlciB9IGZyb20gXCIuL1NoYWRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1lc2ggaW1wbGVtZW50cyBEaXNwb3NhYmxlLCBSZXN0b3JhYmxlIHtcclxuICBwcml2YXRlIGNvbnRleHQ6IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XHJcbiAgcHJpdmF0ZSB2ZXJ0aWNlczogRmxvYXQzMkFycmF5O1xyXG4gIHByaXZhdGUgdmVydGljZXNCdWZmZXI6IFdlYkdMQnVmZmVyO1xyXG4gIHByaXZhdGUgdmVydGljZXNMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgZGlydHlWZXJ0aWNlcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaW5kaWNlczogVWludDE2QXJyYXk7XHJcbiAgcHJpdmF0ZSBpbmRpY2VzQnVmZmVyOiBXZWJHTEJ1ZmZlcjtcclxuICBwcml2YXRlIGluZGljZXNMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgZGlydHlJbmRpY2VzID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBlbGVtZW50c1BlclZlcnRleCA9IDA7XHJcbiAgZ2V0QXR0cmlidXRlcygpOiBWZXJ0ZXhBdHRyaWJ1dGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzO1xyXG4gIH1cclxuICBtYXhWZXJ0aWNlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudmVydGljZXMubGVuZ3RoIC8gdGhpcy5lbGVtZW50c1BlclZlcnRleDtcclxuICB9XHJcbiAgbnVtVmVydGljZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnZlcnRpY2VzTGVuZ3RoIC8gdGhpcy5lbGVtZW50c1BlclZlcnRleDtcclxuICB9XHJcbiAgc2V0VmVydGljZXNMZW5ndGgobGVuZ3RoOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGlydHlWZXJ0aWNlcyA9IHRydWU7XHJcbiAgICB0aGlzLnZlcnRpY2VzTGVuZ3RoID0gbGVuZ3RoO1xyXG4gIH1cclxuICBnZXRWZXJ0aWNlcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMudmVydGljZXM7XHJcbiAgfVxyXG4gIG1heEluZGljZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmluZGljZXMubGVuZ3RoO1xyXG4gIH1cclxuICBudW1JbmRpY2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmRpY2VzTGVuZ3RoO1xyXG4gIH1cclxuICBzZXRJbmRpY2VzTGVuZ3RoKGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpcnR5SW5kaWNlcyA9IHRydWU7XHJcbiAgICB0aGlzLmluZGljZXNMZW5ndGggPSBsZW5ndGg7XHJcbiAgfVxyXG4gIGdldEluZGljZXMoKTogVWludDE2QXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5kaWNlcztcclxuICB9XHJcbiAgZ2V0VmVydGV4U2l6ZUluRmxvYXRzKCk6IG51bWJlciB7XHJcbiAgICBsZXQgc2l6ZSA9IDA7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzW2ldO1xyXG4gICAgICBzaXplICs9IGF0dHJpYnV0ZS5udW1FbGVtZW50cztcclxuICAgIH1cclxuICAgIHJldHVybiBzaXplO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRleHQ6IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQgfCBXZWJHTFJlbmRlcmluZ0NvbnRleHQsXHJcbiAgICBwcml2YXRlIGF0dHJpYnV0ZXM6IFZlcnRleEF0dHJpYnV0ZVtdLFxyXG4gICAgbWF4VmVydGljZXM6IG51bWJlcixcclxuICAgIG1heEluZGljZXM6IG51bWJlclxyXG4gICkge1xyXG4gICAgdGhpcy5jb250ZXh0ID1cclxuICAgICAgY29udGV4dCBpbnN0YW5jZW9mIE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHRcclxuICAgICAgICA/IGNvbnRleHRcclxuICAgICAgICA6IG5ldyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0KGNvbnRleHQpO1xyXG4gICAgdGhpcy5lbGVtZW50c1BlclZlcnRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5lbGVtZW50c1BlclZlcnRleCArPSBhdHRyaWJ1dGVzW2ldLm51bUVsZW1lbnRzO1xyXG4gICAgfVxyXG4gICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkobWF4VmVydGljZXMgKiB0aGlzLmVsZW1lbnRzUGVyVmVydGV4KTtcclxuICAgIHRoaXMuaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShtYXhJbmRpY2VzKTtcclxuICAgIHRoaXMuY29udGV4dC5hZGRSZXN0b3JhYmxlKHRoaXMpO1xyXG4gIH1cclxuICBzZXRWZXJ0aWNlcyh2ZXJ0aWNlczogQXJyYXk8bnVtYmVyPikge1xyXG4gICAgdGhpcy5kaXJ0eVZlcnRpY2VzID0gdHJ1ZTtcclxuICAgIGlmICh2ZXJ0aWNlcy5sZW5ndGggPiB0aGlzLnZlcnRpY2VzLmxlbmd0aClcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgXCJNZXNoIGNhbid0IHN0b3JlIG1vcmUgdGhhbiBcIiArIHRoaXMubWF4VmVydGljZXMoKSArIFwiIHZlcnRpY2VzXCJcclxuICAgICAgKTtcclxuICAgIHRoaXMudmVydGljZXMuc2V0KHZlcnRpY2VzLCAwKTtcclxuICAgIHRoaXMudmVydGljZXNMZW5ndGggPSB2ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgfVxyXG4gIHNldEluZGljZXMoaW5kaWNlczogQXJyYXk8bnVtYmVyPikge1xyXG4gICAgdGhpcy5kaXJ0eUluZGljZXMgPSB0cnVlO1xyXG4gICAgaWYgKGluZGljZXMubGVuZ3RoID4gdGhpcy5pbmRpY2VzLmxlbmd0aClcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgXCJNZXNoIGNhbid0IHN0b3JlIG1vcmUgdGhhbiBcIiArIHRoaXMubWF4SW5kaWNlcygpICsgXCIgaW5kaWNlc1wiXHJcbiAgICAgICk7XHJcbiAgICB0aGlzLmluZGljZXMuc2V0KGluZGljZXMsIDApO1xyXG4gICAgdGhpcy5pbmRpY2VzTGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7XHJcbiAgfVxyXG4gIGRyYXcoc2hhZGVyOiBTaGFkZXIsIHByaW1pdGl2ZVR5cGU6IG51bWJlcikge1xyXG4gICAgdGhpcy5kcmF3V2l0aE9mZnNldChcclxuICAgICAgc2hhZGVyLFxyXG4gICAgICBwcmltaXRpdmVUeXBlLFxyXG4gICAgICAwLFxyXG4gICAgICB0aGlzLmluZGljZXNMZW5ndGggPiAwXHJcbiAgICAgICAgPyB0aGlzLmluZGljZXNMZW5ndGhcclxuICAgICAgICA6IHRoaXMudmVydGljZXNMZW5ndGggLyB0aGlzLmVsZW1lbnRzUGVyVmVydGV4XHJcbiAgICApO1xyXG4gIH1cclxuICBkcmF3V2l0aE9mZnNldChcclxuICAgIHNoYWRlcjogU2hhZGVyLFxyXG4gICAgcHJpbWl0aXZlVHlwZTogbnVtYmVyLFxyXG4gICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICBjb3VudDogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBpZiAodGhpcy5kaXJ0eVZlcnRpY2VzIHx8IHRoaXMuZGlydHlJbmRpY2VzKSB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgdGhpcy5iaW5kKHNoYWRlcik7XHJcbiAgICBpZiAodGhpcy5pbmRpY2VzTGVuZ3RoID4gMCkge1xyXG4gICAgICBnbC5kcmF3RWxlbWVudHMocHJpbWl0aXZlVHlwZSwgY291bnQsIGdsLlVOU0lHTkVEX1NIT1JULCBvZmZzZXQgKiAyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdsLmRyYXdBcnJheXMocHJpbWl0aXZlVHlwZSwgb2Zmc2V0LCBjb3VudCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVuYmluZChzaGFkZXIpO1xyXG4gIH1cclxuICBiaW5kKHNoYWRlcjogU2hhZGVyKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0aWNlc0J1ZmZlcik7XHJcbiAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBhdHRyaWIgPSB0aGlzLmF0dHJpYnV0ZXNbaV07XHJcbiAgICAgIGxldCBsb2NhdGlvbiA9IHNoYWRlci5nZXRBdHRyaWJ1dGVMb2NhdGlvbihhdHRyaWIubmFtZSk7XHJcbiAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcclxuICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcclxuICAgICAgICBsb2NhdGlvbixcclxuICAgICAgICBhdHRyaWIubnVtRWxlbWVudHMsXHJcbiAgICAgICAgZ2wuRkxPQVQsXHJcbiAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgdGhpcy5lbGVtZW50c1BlclZlcnRleCAqIDQsXHJcbiAgICAgICAgb2Zmc2V0ICogNFxyXG4gICAgICApO1xyXG4gICAgICBvZmZzZXQgKz0gYXR0cmliLm51bUVsZW1lbnRzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5kaWNlc0xlbmd0aCA+IDApXHJcbiAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuaW5kaWNlc0J1ZmZlcik7XHJcbiAgfVxyXG4gIHVuYmluZChzaGFkZXI6IFNoYWRlcikge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGF0dHJpYiA9IHRoaXMuYXR0cmlidXRlc1tpXTtcclxuICAgICAgbGV0IGxvY2F0aW9uID0gc2hhZGVyLmdldEF0dHJpYnV0ZUxvY2F0aW9uKGF0dHJpYi5uYW1lKTtcclxuICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcclxuICAgIH1cclxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBudWxsKTtcclxuICAgIGlmICh0aGlzLmluZGljZXNMZW5ndGggPiAwKSBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKTtcclxuICB9XHJcbiAgcHJpdmF0ZSB1cGRhdGUoKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBpZiAodGhpcy5kaXJ0eVZlcnRpY2VzKSB7XHJcbiAgICAgIGlmICghdGhpcy52ZXJ0aWNlc0J1ZmZlcikge1xyXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuICAgICAgfVxyXG4gICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0aWNlc0J1ZmZlcik7XHJcbiAgICAgIGdsLmJ1ZmZlckRhdGEoXHJcbiAgICAgICAgZ2wuQVJSQVlfQlVGRkVSLFxyXG4gICAgICAgIHRoaXMudmVydGljZXMuc3ViYXJyYXkoMCwgdGhpcy52ZXJ0aWNlc0xlbmd0aCksXHJcbiAgICAgICAgZ2wuRFlOQU1JQ19EUkFXXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZGlydHlWZXJ0aWNlcyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGlydHlJbmRpY2VzKSB7XHJcbiAgICAgIGlmICghdGhpcy5pbmRpY2VzQnVmZmVyKSB7XHJcbiAgICAgICAgdGhpcy5pbmRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5pbmRpY2VzQnVmZmVyKTtcclxuICAgICAgZ2wuYnVmZmVyRGF0YShcclxuICAgICAgICBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUixcclxuICAgICAgICB0aGlzLmluZGljZXMuc3ViYXJyYXkoMCwgdGhpcy5pbmRpY2VzTGVuZ3RoKSxcclxuICAgICAgICBnbC5EWU5BTUlDX0RSQVdcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5kaXJ0eUluZGljZXMgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgcmVzdG9yZSgpIHtcclxuICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBudWxsO1xyXG4gICAgdGhpcy5pbmRpY2VzQnVmZmVyID0gbnVsbDtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQucmVtb3ZlUmVzdG9yYWJsZSh0aGlzKTtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRpY2VzQnVmZmVyKTtcclxuICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmluZGljZXNCdWZmZXIpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgdHlwZTogVmVydGV4QXR0cmlidXRlVHlwZSxcclxuICAgIHB1YmxpYyBudW1FbGVtZW50czogbnVtYmVyXHJcbiAgKSB7fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBQb3NpdGlvbjJBdHRyaWJ1dGUgZXh0ZW5kcyBWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoU2hhZGVyLlBPU0lUSU9OLCBWZXJ0ZXhBdHRyaWJ1dGVUeXBlLkZsb2F0LCAyKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uM0F0dHJpYnV0ZSBleHRlbmRzIFZlcnRleEF0dHJpYnV0ZSB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcihTaGFkZXIuUE9TSVRJT04sIFZlcnRleEF0dHJpYnV0ZVR5cGUuRmxvYXQsIDMpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgVGV4Q29vcmRBdHRyaWJ1dGUgZXh0ZW5kcyBWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gIGNvbnN0cnVjdG9yKHVuaXQ6IG51bWJlciA9IDApIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBTaGFkZXIuVEVYQ09PUkRTICsgKHVuaXQgPT0gMCA/IFwiXCIgOiB1bml0KSxcclxuICAgICAgVmVydGV4QXR0cmlidXRlVHlwZS5GbG9hdCxcclxuICAgICAgMlxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIENvbG9yQXR0cmlidXRlIGV4dGVuZHMgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKFNoYWRlci5DT0xPUiwgVmVydGV4QXR0cmlidXRlVHlwZS5GbG9hdCwgNCk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBDb2xvcjJBdHRyaWJ1dGUgZXh0ZW5kcyBWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoU2hhZGVyLkNPTE9SMiwgVmVydGV4QXR0cmlidXRlVHlwZS5GbG9hdCwgNCk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBlbnVtIFZlcnRleEF0dHJpYnV0ZVR5cGUge1xyXG4gIEZsb2F0XHJcbn1cclxuIl19