UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

81 lines 13.7 kB
/* * Copyright (c) 2014, Metron, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 { black } from '../color'; import { Program, UniformColor, UniformMatrix4f } from '../shader'; import { modelview_VERTSHADER, solid_FRAGSHADER } from '../misc'; import { newStaticBuffer } from '../buffer'; import { GL, hasval } from '../util/util'; import { glOrthoAxis } from '../matrix'; /** * Simple xy line painter which displays static data */ export function newXyLinePainter(axis, xCoords, yCoords, options) { const thickness = (hasval(options) && hasval(options.thickness) ? options.thickness : 4); const color = (hasval(options) && hasval(options.color) ? options.color : black); const blend = (hasval(options) && hasval(options.blend) ? options.blend : false); const program = new Program(modelview_VERTSHADER, solid_FRAGSHADER); const u_Color = new UniformColor(program, 'u_Color'); const u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); const coordArray = []; for (let i = 0; i < xCoords.length; i++) { coordArray[2 * i] = xCoords[i]; coordArray[2 * i + 1] = yCoords[i]; } const coordFloatArray = new Float32Array(coordArray); const coordBuffer = newStaticBuffer(coordFloatArray); const dim = 2; const count = coordFloatArray.length / dim; return function (gl, viewport) { if (blend) { gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); } // enable the shader program.use(gl); // set color and projection matrix variables u_Color.setData(gl, color); // set the projection matrix based on the axis bounds u_modelViewMatrix.setData(gl, glOrthoAxis(axis)); // XXX: IE doesn't support lineWidth gl.lineWidth(thickness); // enable vertex attribute array corresponding to vPosition variable in shader gl.enableVertexAttribArray(0); // bind buffer data to vertex attribute array coordBuffer.bind(gl, GL.ARRAY_BUFFER); // first argument corresponds to the 0 attrib array set above // second argument indicates two coordinates per vertex gl.vertexAttribPointer(0, dim, GL.FLOAT, false, 0, 0); // draw the lines gl.drawArrays(GL.LINE_STRIP, 0, count); coordBuffer.unbind(gl, GL.ARRAY_BUFFER); program.endUse(gl); }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZV9wYWludGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dlYmdsaW1wc2UvcGxvdC9saW5lX3BhaW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCxPQUFPLEVBQVMsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU1QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBU3hDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQVksRUFBRSxPQUFpQixFQUFFLE9BQWlCLEVBQUUsT0FBOEI7SUFDL0csTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakYsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUU1RSxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3RDO0lBQ0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckQsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNkLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBRTNDLE9BQU8sVUFBVSxFQUF5QixFQUFFLFFBQTRCO1FBRXBFLElBQUksS0FBSyxFQUFFO1lBQ1AsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDM0YsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkI7UUFFRCxvQkFBb0I7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVoQiw0Q0FBNEM7UUFDNUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFM0IscURBQXFEO1FBQ3JELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFakQsb0NBQW9DO1FBQ3BDLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFeEIsOEVBQThFO1FBQzlFLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5Qiw2Q0FBNkM7UUFDN0MsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXRDLDZEQUE2RDtRQUM3RCx1REFBdUQ7UUFDdkQsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXRELGlCQUFpQjtRQUNqQixFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXZDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE1ldHJvbiwgSW5jLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xyXG4gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxyXG4gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcbmltcG9ydCB7IENvbG9yLCBibGFjayB9IGZyb20gJy4uL2NvbG9yJztcclxuaW1wb3J0IHsgQXhpczJEIH0gZnJvbSAnLi9heGlzJztcclxuaW1wb3J0IHsgUGFpbnRlciB9IGZyb20gJy4uL2NvcmUnO1xyXG5pbXBvcnQgeyBQcm9ncmFtLCBVbmlmb3JtQ29sb3IsIFVuaWZvcm1NYXRyaXg0ZiB9IGZyb20gJy4uL3NoYWRlcic7XHJcbmltcG9ydCB7IG1vZGVsdmlld19WRVJUU0hBREVSLCBzb2xpZF9GUkFHU0hBREVSIH0gZnJvbSAnLi4vbWlzYyc7XHJcbmltcG9ydCB7IG5ld1N0YXRpY0J1ZmZlciB9IGZyb20gJy4uL2J1ZmZlcic7XHJcbmltcG9ydCB7IEJvdW5kc1VubW9kaWZpYWJsZSB9IGZyb20gJy4uL2JvdW5kcyc7XHJcbmltcG9ydCB7IEdMLCBoYXN2YWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5pbXBvcnQgeyBnbE9ydGhvQXhpcyB9IGZyb20gJy4uL21hdHJpeCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFh5TGluZVBhaW50ZXJPcHRpb25zIHtcclxuICAgIGNvbG9yPzogQ29sb3I7XHJcbiAgICBibGVuZD86IGJvb2xlYW47XHJcbiAgICB0aGlja25lc3M/OiBudW1iZXI7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogU2ltcGxlIHh5IGxpbmUgcGFpbnRlciB3aGljaCBkaXNwbGF5cyBzdGF0aWMgZGF0YVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5ld1h5TGluZVBhaW50ZXIoYXhpczogQXhpczJELCB4Q29vcmRzOiBudW1iZXJbXSwgeUNvb3JkczogbnVtYmVyW10sIG9wdGlvbnM/OiBYeUxpbmVQYWludGVyT3B0aW9ucyk6IFBhaW50ZXIge1xyXG4gICAgY29uc3QgdGhpY2tuZXNzID0gKGhhc3ZhbChvcHRpb25zKSAmJiBoYXN2YWwob3B0aW9ucy50aGlja25lc3MpID8gb3B0aW9ucy50aGlja25lc3MgOiA0KTtcclxuICAgIGNvbnN0IGNvbG9yID0gKGhhc3ZhbChvcHRpb25zKSAmJiBoYXN2YWwob3B0aW9ucy5jb2xvcikgPyBvcHRpb25zLmNvbG9yIDogYmxhY2spO1xyXG4gICAgY29uc3QgYmxlbmQgPSAoaGFzdmFsKG9wdGlvbnMpICYmIGhhc3ZhbChvcHRpb25zLmJsZW5kKSA/IG9wdGlvbnMuYmxlbmQgOiBmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBQcm9ncmFtKG1vZGVsdmlld19WRVJUU0hBREVSLCBzb2xpZF9GUkFHU0hBREVSKTtcclxuICAgIGNvbnN0IHVfQ29sb3IgPSBuZXcgVW5pZm9ybUNvbG9yKHByb2dyYW0sICd1X0NvbG9yJyk7XHJcbiAgICBjb25zdCB1X21vZGVsVmlld01hdHJpeCA9IG5ldyBVbmlmb3JtTWF0cml4NGYocHJvZ3JhbSwgJ3VfbW9kZWxWaWV3TWF0cml4Jyk7XHJcblxyXG4gICAgY29uc3QgY29vcmRBcnJheSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Q29vcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29vcmRBcnJheVsyICogaV0gPSB4Q29vcmRzW2ldO1xyXG4gICAgICAgIGNvb3JkQXJyYXlbMiAqIGkgKyAxXSA9IHlDb29yZHNbaV07XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb29yZEZsb2F0QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGNvb3JkQXJyYXkpO1xyXG4gICAgY29uc3QgY29vcmRCdWZmZXIgPSBuZXdTdGF0aWNCdWZmZXIoY29vcmRGbG9hdEFycmF5KTtcclxuICAgIGNvbnN0IGRpbSA9IDI7XHJcbiAgICBjb25zdCBjb3VudCA9IGNvb3JkRmxvYXRBcnJheS5sZW5ndGggLyBkaW07XHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB2aWV3cG9ydDogQm91bmRzVW5tb2RpZmlhYmxlKSB7XHJcblxyXG4gICAgICAgIGlmIChibGVuZCkge1xyXG4gICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZShHTC5TUkNfQUxQSEEsIEdMLk9ORV9NSU5VU19TUkNfQUxQSEEsIEdMLk9ORSwgR0wuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICAgICAgICAgIGdsLmVuYWJsZShHTC5CTEVORCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBlbmFibGUgdGhlIHNoYWRlclxyXG4gICAgICAgIHByb2dyYW0udXNlKGdsKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IGNvbG9yIGFuZCBwcm9qZWN0aW9uIG1hdHJpeCB2YXJpYWJsZXNcclxuICAgICAgICB1X0NvbG9yLnNldERhdGEoZ2wsIGNvbG9yKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IHRoZSBwcm9qZWN0aW9uIG1hdHJpeCBiYXNlZCBvbiB0aGUgYXhpcyBib3VuZHNcclxuICAgICAgICB1X21vZGVsVmlld01hdHJpeC5zZXREYXRhKGdsLCBnbE9ydGhvQXhpcyhheGlzKSk7XHJcblxyXG4gICAgICAgIC8vIFhYWDogSUUgZG9lc24ndCBzdXBwb3J0IGxpbmVXaWR0aFxyXG4gICAgICAgIGdsLmxpbmVXaWR0aCh0aGlja25lc3MpO1xyXG5cclxuICAgICAgICAvLyBlbmFibGUgdmVydGV4IGF0dHJpYnV0ZSBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHZQb3NpdGlvbiB2YXJpYWJsZSBpbiBzaGFkZXJcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKTtcclxuXHJcbiAgICAgICAgLy8gYmluZCBidWZmZXIgZGF0YSB0byB2ZXJ0ZXggYXR0cmlidXRlIGFycmF5XHJcbiAgICAgICAgY29vcmRCdWZmZXIuYmluZChnbCwgR0wuQVJSQVlfQlVGRkVSKTtcclxuXHJcbiAgICAgICAgLy8gZmlyc3QgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIDAgYXR0cmliIGFycmF5IHNldCBhYm92ZVxyXG4gICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBpbmRpY2F0ZXMgdHdvIGNvb3JkaW5hdGVzIHBlciB2ZXJ0ZXhcclxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsIGRpbSwgR0wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcclxuXHJcbiAgICAgICAgLy8gZHJhdyB0aGUgbGluZXNcclxuICAgICAgICBnbC5kcmF3QXJyYXlzKEdMLkxJTkVfU1RSSVAsIDAsIGNvdW50KTtcclxuXHJcbiAgICAgICAgY29vcmRCdWZmZXIudW5iaW5kKGdsLCBHTC5BUlJBWV9CVUZGRVIpO1xyXG4gICAgICAgIHByb2dyYW0uZW5kVXNlKGdsKTtcclxuICAgIH07XHJcbn1cclxuXHJcblxyXG5cclxuIl19